我想在后台敲响信标。有了背景,我的意思是当手机进入锁屏时。我希望该应用程序继续范围信标。我现在的问题是代码永远不会发现信标。我有两个正在工作的信标,但AppDelegate找不到它们。当我在ViewController中运行相同的代码时,它会找到信标并显示它们。我该怎么办?
@interface BDAppDelegate () <AXABeaconManagerDelegate>
@end
@implementation BDAppDelegate {
NSMutableDictionary *beaconRegions;
NSMutableDictionary *detectBeacons;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"MyUUID"] identifier:@"微信"];
[AXABeaconManager sharedManager].beaconDelegate = self;
[[AXABeaconManager sharedManager] requestAlwaysAuthorization];
[[AXABeaconManager sharedManager] startRangingBeaconsInRegion:beaconRegion];
self->beaconRegions = [[NSMutableDictionary alloc] init];
self->detectBeacons = [[NSMutableDictionary alloc] init];
while (detectBeacons.count < 10) {
NSLog(@"Rows in detectBeacons %lu", (unsigned long)beaconRegions.count);
}
self->beaconRegions[beaconRegion] = [NSArray array];
}
- (void)didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
self->beaconRegions[region] = beacons;
NSMutableArray *allBeacons = [NSMutableArray array];
for (NSArray *regionResult in [self->beaconRegions allValues])
{
[allBeacons addObjectsFromArray:regionResult];
}
NSPredicate *pre = [NSPredicate predicateWithFormat:@"accuracy != -1"];
NSArray *rights = [allBeacons filteredArrayUsingPredicate:pre];
NSString * str = @"accuracy";
self->detectBeacons[str] = rights;
}
@end
答案 0 :(得分:3)
在iOS上,应用仅限于在后台播放5秒。每次将应用程序置于后台时,或者当信标监视事件(输入的区域/退出区域)触发时,都会重新启动此计时器。好消息是,你可以在每次事件发生后3分钟将背景范围内的信标延长到3分钟。
我整理了一篇博客文章,向您展示如何操作here.
答案 1 :(得分:0)
对于 CLLocationManager ,有一个方法startMonitoringForRegion(CLBeaconRegion *):beaconRegion
应该在我们开始startRangingBeaconsInRegion
之前添加。
因此,如果您的AXABeaconManager类来自CLLocationManager,请添加以下内容:
[[AXABeaconManager sharedManager] startMonitoringForRegion:beaconRegion];
否则: 创建一个CLLocationManager对象locationManager并初始化它,然后添加如下所示的启动监视。
[self.locationManager startMonitoringForRegion:beaconRegion];
之前startRangingBeaconsInRegion
讨论:startMonitoringForRegion
您必须为要监视的每个区域调用此方法一次。如果应用程序已在监视具有相同标识符的现有区域,则旧区域将替换为新区域。您使用此方法添加的区域由应用中的所有位置管理器对象共享,并存储在monitoredRegions
属性中。
更多参考here
答案 2 :(得分:0)
你要做的就是调用iOS来做BG工作:
UIBackgroundTaskIdentifier token = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Ranging for region %@ killed", region.identifier);
}];
if(token == UIBackgroundTaskInvalid) {
NSLog(@"cant start background task");
}
那么做什么
完成后,请致电endBackgroundTask