在后台输入带有应用程序的iBeacon区域,并在不通知的情况下请求URL

Jam*_*mes 4 ios bluetooth-lowenergy ibeacon

我已经做了很多搜索SO和谷歌试图得到一个答案,但我没有能够把拼图的所有部分放在一起,所以任何帮助/指针都会很棒.

我想构建一个在进入iBeacon区域时检查Web服务的应用程序.简单的示例用例是这样的:

  1. 用户在后台走进带有应用程序的iBeacon配备商店

  2. 应用程序向Web服务器发出请求以检查用户ID是否为成员(该应用程序已被授予用户向服务器发送用户ID的权限),而不是通知用户.

3A.服务器发回"真实"响应

4A.应用程序发送"我们今天有特别会员促销"通知锁屏.

要么

3B.服务器发回"错误"响应

4B.应用程序保持沉默(不通知用户)

仅供参考,这个答案似乎表明可以在后台发送URL请求:在后台 运行URL请求

Jam*_*ost 5

你几乎已经确定了你需要做的一切.

调用您CLLocationManagerDelegate的didEnterRegion:方法后,您可以启动后台任务,然后启动网络请求.收到回复后,您可以根据需要发送本地通知,然后结束后台任务.

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    // If not already performing a background task for this region...

    UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }];

    // perform network request - if successful, display notification. when finished, end background task
}
Run Code Online (Sandbox Code Playgroud)

虽然我应该注意,我实际上不会将后台任务管理和Web请求代码直接放在我的didEnterRegion:方法中.我有一个单独的Web API类来执行请求,只是从内部调用它didEnterRegion:.

  • 另一个重要的注意事项是,iOS只会让您的应用程序在您进入该区域时在后台运行5秒钟.因此,如果该Web服务调用在6秒内响应,您将无法对其执行操作.(还有其他方法可以获得更多的后台运行时间,但它们不是自动的或保证的.)最重要的是,您最好快速制作该Web服务,并且最好有一个计划,当您没有获得响应. (4认同)