Xamarin cross platform forms, uitvoeren native code (iOs/Android) via interfaces

xamarin-logo

Xamarin Forms is een cross platform framework, met als targets: Android, iOS, UWP. Heel mooi maar soms is het noodzakelijk om bepaalde functionaliteit aan te roepen die alleen native op het doelplatform beschikbaar is. Denk hierbij bijvoorbeeld aan het uitlezen van het serienummer van het apparaat, hoe ga je deze informatie verwerken in je applicatie? Hier bestaat een hele mooie oplossing voor: interfaces

Een interface bestaat uit:

  • één klasse(class) die we gebruiken in deel van de gedeelde code;
  • en één klasse(class) voor elke native platform.

In de klasse(class) die we in de shared code definiëren maken we de interface klasse(class), deze klasse(class) bevat alle functies die we ook in de native code class moeten programmeren, zie code hieronder:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExampleApp
{
    public interface getHWId
    {
        string DUID();
    }
}

Android native code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using System.Threading.Tasks;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Text;
using ExampleApp.Droid;
using Android.Graphics;
using Android.Content.PM;
using Android.Hardware;
[assembly: Xamarin.Forms.Dependency(typeof(IgetHWId))]

namespace ExampleApp.Droid
{
    class IgetHWId : getHWId
    {
        public string DUID()
        {
            string deviceId;
            deviceId = Android.OS.Build.Serial;
            return (deviceId);
        }
    }
}

iOs native code:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using ExampleApp.iOS;
using UIKit;
using Xamarin.Forms.Platform.iOS;
using WebKit;
using CoreGraphics;
using AVKit;
using AVFoundation;

[assembly: Xamarin.Forms.Dependency(typeof(IgetHWId))]

namespace ExampleApp.iOS
{
    class IgetHWId : getHWId
    {
        public string DUID()
        {
            string deviceId;
            deviceId = UIKit.UIDevice.CurrentDevice.IdentifierForVendor.AsString();
            return (deviceId);
        }
    }
}

Nu nog het stukje code om de DUID() functie aan te roepen vanuit de platform shared code:

    private getHWId nativeInterface;
    nativeInterface = new DependencyService.Get();
    Debug.WriteLine("Uniek hardware id = " + nativeInterface->DUID());