[Mobile App] Xamarin iBeacon

Avevamo già adottato Xamarin per creare applicazioni per smartphone, apprezzando molto Xamarin.Forms che permette ti sviluppare un applicazione cross-platform quasi totalmente.
Abbiamo verificato che effettivamente il riutilizzo del codice è veramente alto, siamo riusciti a raggiungere una percentuale del 90% realizzando due applicazioni (iOS e Android) con un effort soltanto.

Inoltre abbiamo realizzato un applicazione per iOS e Android che integra gli iBeacon (BLE Bluetooth Low Enery) per abilitare le notifiche geo-localizzate, tutta questa parte è stata gestita utilizzando due librerie diverse per iOS e Android.

iOS

Abbiamo gestito con una funzione tutta la parte di interfacciamento iBeacon


public void startBeacon(){

beaconUUID = new NSUuid (uuid);
beaconRegion = new CLBeaconRegion (beaconUUID,beaconMajor,beaconId);

beaconRegion.NotifyEntryStateOnDisplay = true;
beaconRegion.NotifyOnEntry = true;
beaconRegion.NotifyOnExit = true;

locationmanager = new CLLocationManager ();
locationmanager.RegionEntered += (object sender, CLRegionEventArgs e) => {
Console.WriteLine (“Region Entered”);
};
locationmanager.DidRangeBeacons += (object sender, CLRegionBeaconsRangedEventArgs e) => {

if( e.Beacons.Length > 0 ) {
var beacon = e.Beacons[0];
Console.WriteLine(beacon.Minor.ToString()+” “+ beacon.Rssi);
if(beacon.Proximity==CLProximity.Immediate||beacon.Proximity==CLProximity.Near||beacon.Rssi>(nint)(-76)){

//beacon 1
if(beacon.Minor == (NSNumber)1 && FlagB1 == true)
{
var notification = new UILocalNotification () { AlertBody = “Beacon numero 1” };
notification.SoundName = UILocalNotification.DefaultSoundName;
UIApplication.SharedApplication.CancelAllLocalNotifications();
UIApplication.SharedApplication.PresentLocalNotificationNow(notification);

window.RootViewController = BeaconMainPage.GetMainPage(1).CreateViewController();
window.MakeKeyAndVisible ();
}

}
}

};

if(UIDevice.CurrentDevice.CheckSystemVersion(8,0))
locationmanager.RequestAlwaysAuthorization ();
locationmanager.StartMonitoring (beaconRegion);
locationmanager.StartRangingBeacons (beaconRegion);

}

Info.plist

Per utilizzare le notifiche in background è essenziale impostare il seguente codice:

NSLocationAlwaysUsageDescription
Accetta per avere le informazioni sull'evento

Android

Per la parte Android abbiamo utilizzato le librerie RadiusNetwork disponibili dai componenti di Xamarin, abbiamo verificato che funzionano bene e ci sono piaciute a differenza delle librerie Estimote sulle quali abbiamo avuto deie problemi.


public MainActivity()
{
_iBeaconManager = IBeaconManager.GetInstanceForApplication(this);

_monitorNotifier = new MonitorNotifier();
_rangeNotifier = new RangeNotifier();

_monitoringRegion = new Region(beaconId, UUID, (Java.Lang.Integer)101, null);
_rangingRegion = new Region(beaconId, UUID, (Java.Lang.Integer)101, null);

}
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.SetTitle(“Bluetooth down”);
builder.SetMessage(“Perfavore Abilitare il Bluetooth.”);
builder.SetCancelable(false);
builder.SetPositiveButton(“OK”, delegate {});

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.DefaultAdapter;

if (!bluetoothAdapter.IsEnabled) {
builder.Show ();
}

_iBeaconManager.Bind(this);

_iBeaconManager.SetMonitorNotifier(_monitorNotifier);
_iBeaconManager.SetRangeNotifier(_rangeNotifier);

_monitorNotifier.EnterRegionComplete += EnteredRegion;
_monitorNotifier.ExitRegionComplete += ExitedRegion;

_rangeNotifier.DidRangeBeaconsInRegionComplete += RangingBeaconsInRegion;

var metrics = Resources.DisplayMetrics;
var widthInDp = (int)(metrics.WidthPixels / Resources.DisplayMetrics.Density);
var heightInDp = (int)(metrics.HeightPixels / Resources.DisplayMetrics.Density);

Xamarin.Forms.Forms.Init(this, bundle);

Console.WriteLine (widthInDp+” “+heightInDp+” “+Resources.DisplayMetrics.Density+” “+Resources.DisplayMetrics.DensityDpi);

SetPage (App.GetMainPage (Resources.DisplayMetrics.Density));

}
void RangingBeaconsInRegion(object sender, RangeEventArgs e)
{
if (e.Beacons.Count > 0)
{

IBeacon beacon = e.Beacons.FirstOrDefault();

if ((ProximityType)beacon.Proximity == ProximityType.Immediate || (ProximityType)beacon.Proximity == ProximityType.Near || beacon.Rssi > -76) {
Console.WriteLine (“vicino ” + beacon.Rssi);
//beacon 1
if (beacon.Minor == 1 ) {
FlagB1 = false;
FlagB2 = true;
FlagB3 = true;
FlagB4 = true;
FlagB5 = true;
FlagB6 = true;
FlagB7 = true;
FlagB8 = true;
FlagB9 = true;
FlagB10 = true;
RunOnUiThread (() => {
SetPage (BeaconMainPage.GetMainPage (1, Resources.DisplayMetrics.Density));
});
ShowNotification (1);
}

}

_previousProximity = beacon.Proximity;
}
}
#region IBeaconConsumer impl
public void OnIBeaconServiceConnect()
{
Console.WriteLine (“Connesso Al beacon”);

_iBeaconManager.StartMonitoringBeaconsInRegion(_monitoringRegion);
_iBeaconManager.StartRangingBeaconsInRegion(_rangingRegion);
}
#endregion

private void ShowNotification(int i)
{
var resultIntent = new Intent(this, typeof(MainActivity));
resultIntent.AddFlags(ActivityFlags.ReorderToFront);
var pendingIntent = PendingIntent.GetActivity(this, 0, resultIntent, PendingIntentFlags.UpdateCurrent);
var notificationId=Resource.String.beacon1_notification;

NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.SetDefaults((int)(NotificationDefaults.Sound | NotificationDefaults.Vibrate))
.SetSmallIcon(Resource.Drawable.Icon)
.SetContentTitle(this.GetText(Resource.String.app_label))
.SetContentIntent(pendingIntent)
.SetAutoCancel(true);

//beacon1
if (i == 1) {
notificationId = Resource.String.beacon1_notification;
builder.SetContentText(this.GetText(Resource.String.beacon1_notification));
}

var notification = builder.Build();

var notificationManager = (NotificationManager)GetSystemService(NotificationService);
notificationManager.Notify(notificationId, notification);
}

protected override void OnDestroy()
{
base.OnDestroy();

_monitorNotifier.EnterRegionComplete -= EnteredRegion;
_monitorNotifier.ExitRegionComplete -= ExitedRegion;

_rangeNotifier.DidRangeBeaconsInRegionComplete -= RangingBeaconsInRegion;
_iBeaconManager.StopMonitoringBeaconsInRegion(_monitoringRegion);
_iBeaconManager.StopRangingBeaconsInRegion(_rangingRegion);
_iBeaconManager.UnBind(this);
}

Grazie a questo codice siamo riusciti ad avere un applicazione funzionale e funzionante per il marketing di prossimità, applicazione presentata ad un evento a Firenze.
Potete trovare l’app NetForYou qui per Android e iOS

Start typing and press Enter to search

vagrant