Xamarin Estimote не находит маяки для iOS

Я просто пытаюсь получить действительно простой POC моего мультиплатформенного приложения, находящего ibeacons в кроссплатформенном решении xamarin. У меня есть сторона Android, но я просто сталкиваюсь с проблемами со стороны iOS.

У меня есть следующий взломанный код в классе AppDelegate (это просто для того, чтобы сначала повозиться с ним, я понимаю, что это не то место, где он должен находиться):

[Register("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
    UIWindow window;

    static readonly string uuid = "B9407F30-F5F8-466E-AFF9-25556B57FE6D";
    static readonly string monkeyId = "Monkey";

    CBPeripheralManager peripheralMgr;
    BTPeripheralDelegate peripheralDelegate;
    CLLocationManager locationMgr;

    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        window = new UIWindow(UIScreen.MainScreen.Bounds);

        myAppManagerApp.Init(typeof(myAppManagerApp).Assembly);
        Forms.Init();
       // FormsMaps.Init();            

        UINavigationBar.Appearance.BackgroundColor = UIColor.FromRGBA(0, 0, 0, 0);
        UINavigationBar.Appearance.TintColor = UIColor.Blue;          
        UINavigationBar.Appearance.SetTitleTextAttributes(new UITextAttributes()
        {
            TextColor = UIColor.White
        });

        window.RootViewController = BuildView();
        window.MakeKeyAndVisible();

        var monkeyUUID = new NSUuid(uuid);
        var beaconRegion = new CLBeaconRegion(monkeyUUID, monkeyId);
        //power - the received signal strength indicator (RSSI) value (measured in decibels) of the beacon from one meter away
        var power = new NSNumber(-59);
        NSMutableDictionary peripheralData = beaconRegion.GetPeripheralData(power);
        peripheralDelegate = new BTPeripheralDelegate();
        peripheralMgr = new CBPeripheralManager(peripheralDelegate, DispatchQueue.DefaultGlobalQueue);
        peripheralMgr.StartAdvertising(peripheralData);

        locationMgr = new CLLocationManager();
        locationMgr.RegionEntered += (object sender, CLRegionEventArgs e) =>
        {
            if (e.Region.Identifier == monkeyId)
            {
                var notification = new UILocalNotification() { AlertBody = "There's a monkey hiding nearby!" };
                UIApplication.SharedApplication.PresentLocationNotificationNow(notification);
            }
        };

        locationMgr.DidStartMonitoringForRegion += locationMgr_DidStartMonitoringForRegion;
        locationMgr.MonitoringFailed += locationMgr_MonitoringFailed;

        locationMgr.StartMonitoring(beaconRegion);
        locationMgr.StartRangingBeacons(beaconRegion);

        locationMgr.DidRangeBeacons +=locationMgr_DidRangeBeacons;

        return true;
    }

    private void locationMgr_DidRangeBeacons(object sender, CLRegionBeaconsRangedEventArgs e)
    {
            throw new NotImplementedException();
    }

    private void locationMgr_MonitoringFailed(object sender, CLRegionErrorEventArgs e)
    {
        throw new NotImplementedException();
    }

    private void locationMgr_DidStartMonitoringForRegion(object sender, CLRegionEventArgs e)
    {
        int i = 0;
        //throw new NotImplementedException();
    }

    static UIViewController BuildView()
    {
        var root = new pgeRoot();
        var controller = root.CreateViewController();
        return controller;
    }

Я вырезал большую часть кода из примера «Найди обезьяну». В любом случае события DidRangeBeacons или RegionEntered никогда не срабатывают. Я использую estimote iBeacons, поэтому не знаю, имеет ли это значение?

Любые идеи о том, чего мне здесь не хватает? Есть ли разрешение или настройка, которую мне нужно поместить в plist?

Спасибо


person Matt    schedule 21.10.2014    source источник
comment
На каком оборудовании и версии iOS вы работаете?   -  person Paulw11    schedule 21.10.2014


Ответы (1)


В iOS 8 вам нужно явно запрашивать разрешение на использование служб определения местоположения — это методы CLLocationManager RequestAlwaysAuthorization (для мониторинга) и RequestWhenInUseAuthorization (для определения дальности). Вам также нужна соответствующая запись (NSLocationAlwaysUsageDescription и NSLocationWhenInUseUsageDescription) в файле Info.plist вашего приложения для iOS, хотя я не совсем уверен, как это сделать в Xamarin.

person heypiotr    schedule 21.10.2014
comment
как это сделать в Xamarin: вы можете отредактировать Info.plist с помощью текстового редактора и добавить необходимые строки, как описано здесь. - person Falko; 08.07.2015