【问题标题】:Kontakt beacons and iOS: didStartMonitoringForRegion not working as expectedKontakt 信标和 iOS:didStartMonitoringForRegion 未按预期工作
【发布时间】:2017-04-28 17:03:01
【问题描述】:

我开始在 iOS 上使用 Kontakt.io 信标,但即使我按照https://developer.kontakt.io/ios-sdk/quickstart/detecting-beacons/ 上的说明和https://developer.kontakt.io/ios-sdk/quickstart/installation/ 上描述的第一步,似乎我只能让它工作一次。

这是我的 ViewController 的代码:

#import "ViewController.h"
#import <KontaktSDK/KontaktSDK.h>

@interface ViewController () <KTKBeaconManagerDelegate>

@property KTKBeaconManager *beaconManager;
@property KTKBeaconRegion *region1;

@end

@implementation ViewController


- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.beaconManager = [[KTKBeaconManager alloc] initWithDelegate:self];
    NSUUID *myProximityUUID = [[NSUUID alloc] initWithUUIDString:@"xxxxxxxxx...xxxx"];
    _region1 = [[KTKBeaconRegion alloc] initWithProximityUUID:myProximityUUID identifier:@"Beacon_1"];

    switch ([KTKBeaconManager locationAuthorizationStatus]) {
        case kCLAuthorizationStatusNotDetermined:
            [self.beaconManager requestLocationAlwaysAuthorization];
            break;

        case kCLAuthorizationStatusDenied:
        case kCLAuthorizationStatusRestricted:
            // No access to Location Services
            break;

        case kCLAuthorizationStatusAuthorizedWhenInUse:
            // For most iBeacon-based app this type of
            // permission is not adequate
            break;

        case kCLAuthorizationStatusAuthorizedAlways:
            // We will use this later
            if ([KTKBeaconManager isMonitoringAvailable]) {
                [self.beaconManager startMonitoringForRegion:_region1];
            }
            break;
    }
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)beaconManager:(KTKBeaconManager *)manager didChangeLocationAuthorizationStatus:(CLAuthorizationStatus)status {
    if (status == kCLAuthorizationStatusAuthorizedAlways) {
        _TheLabel.text = @"YEAH";
        if ([KTKBeaconManager isMonitoringAvailable]) {
            _TheLabel.text = @"YEAH!!!";
            [self.beaconManager startMonitoringForRegion:_region1];
        }
        // When status changes to kCLAuthorizationStatusAuthorizedAlways
        // e.g. after calling [self.beaconManager requestLocationAlwaysAuthorization]
        // we can start region monitoring from here
    }
}

//
- (void)beaconManager:(KTKBeaconManager *)manager didStartMonitoringForRegion:(__kindof KTKBeaconRegion *)region {
    // Do something when monitoring for a particular
    // region is successfully initiated
    _MonitoringStatus.text = @"Success";
    [manager startRangingBeaconsInRegion:region];
}

- (void)beaconManager:(KTKBeaconManager *)manager monitoringDidFailForRegion:(__kindof KTKBeaconRegion *)region withError:(NSError *)error {
    // Handle monitoring failing to start for your region
    _MonitoringStatus.text = @"FAIL!";
}

- (void)beaconManager:(KTKBeaconManager *)manager didEnterRegion:(__kindof KTKBeaconRegion *)region {
    // Decide what to do when a user enters a range of your region; usually used
    // for triggering a local notification and/or starting a beacon ranging
    [manager startRangingBeaconsInRegion:region];
    _OnRegionStatus.text = @"We're in!";
}

- (void)beaconManager:(KTKBeaconManager *)manager didExitRegion:(__kindof KTKBeaconRegion *)region {
    // Decide what to do when a user exits a range of your region; usually used
    // for triggering a local notification and stoping a beacon ranging
    [manager stopRangingBeaconsInRegion:region];
    _OnRegionStatus.text = @"We're out";
}

- (void)beaconManager:(KTKBeaconManager *)manager didRangeBeacons:(NSArray<CLBeacon *> *)beacons inRegion:(__kindof KTKBeaconRegion *)region {
    for(CLBeacon *beacon in beacons){
        _TheLabel.text = [NSString stringWithFormat:@"WOW! %ld", (long)[beacon proximity]];
    }
}

@end

玩断点,似乎 didChangeLocationAuthorizationStatus 总是在启动(我每次都可以在屏幕上看到“YEAH !!!”消息)但 didStartMonitoringForRegion 不会启动,除非我卸载并重新安装(杀死应用程序不起作用) .顺便说一句,第一次安装的信标范围确实很好。正如你所看到的,我已经尝试在不检查 onEnterRegion 的情况下仅测距信标,但它没有用。

编辑:将 viewDidLoad 更新为:

case kCLAuthorizationStatusAuthorizedAlways:
            // We will use this later
            if ([KTKBeaconManager isMonitoringAvailable]) {
                if([[self.beaconManager monitoredRegions] count] == 0) [self.beaconManager startMonitoringForRegion:_region1];
                else for(KTKBeaconRegion *reg in [self.beaconManager monitoredRegions]){
                    [self.beaconManager startRangingBeaconsInRegion:reg];
                }
            }
            break;

这一次按预期工作。但我对这种行为有点困惑。该应用程序保持对区域的监控,即使它被强制关闭?提前致谢!

【问题讨论】:

    标签: ios objective-c ibeacon kontakt.io


    【解决方案1】:

    据我所知,Kontakt.io 的 SDK 是基于 Apple 的 Core Location,所以以下也适用:

    在 iOS 中,与您的应用关联的区域始终被跟踪, 包括应用程序未运行时。 - source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      相关资源
      最近更新 更多