在后台使用应用程序进入iBeacon区域并请求URL而不进行通知

4
我在SO和Google上搜索了很多,试图找到一个答案,但我没有能够将拼图的所有部分放在一起,所以任何帮助/指针都将是很棒的。 我想构建一个应用程序,当它进入iBeacon区域时检查Web服务。简单的示例用例如下: 用户步入装备有iBeacon的商店,并在后台运行应用程序,而不是通知用户,应用程序向Web服务器发出请求,检查用户ID是否为会员(应用程序已获得用户授权向服务器发送用户ID)。 3a.服务器返回"true"响应 4a.应用程序向锁定屏幕发送"我们今天有特别的会员促销"通知。 或 3b.服务器返回"false"响应 4b.应用程序保持沉默(不通知用户) FYI,这个答案似乎表明在后台发送URL请求是可能的:Running URL Requests in the Background
2个回答

5

您已经几乎确定了需要做的一切。

当您的CLLocationManagerDelegatedidEnterRegion:方法被调用时,您可以开始一个后台任务,然后发起网络请求。一旦收到响应,如果需要,您可以发送本地通知,然后结束后台任务。

- (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
}

虽然我应该指出,我不会直接将后台任务管理和网络请求代码放在我的didEnterRegion:方法中。我会有一个单独的Web API类来执行请求,并仅从didEnterRegion:中调用它。


4
另外需要注意的是,iOS仅允许应用在进入区域后在后台运行5秒钟。因此,如果Web服务调用花费了6秒钟来响应,您将无法对其采取任何措施。(虽然有其他方法可以获得更多的后台运行时间,但这些方法不是自动或保证的。)总之,你最好让Web服务快速响应,并且当你没有得到响应时要有一个计划。 - davidgyoung
感谢 @James-Frost - 这让我感到放心,似乎这是可行的。自从发表上述观点以来,我实际上在考虑是否可以直接使用推送通知,在需要时将通知直接发送到设备上(从中我可以启动应用程序等),这可能避免了应用程序接收响应的需求。也就是说,通过手机触发流程,然后让服务器处理所有逻辑。 - James
@davidgyoung 的确 - 这就是为什么明确启动后台任务可能是有意义的,因为它应该会给你更长的执行时间。 - James Frost
@James - 当您进入范围时,您可以直接告诉您的服务器,然后它可以确定是否向设备推送通知。 - James Frost
嗨@davidgyoung,感谢您的评论(以及在SO上提供的所有其他帮助-我已经阅读/学习了您的很多答案!)。您提到的5秒窗口是我开始考虑让服务器/推送通知处理响应的原因。这似乎是一个相当简单的解决方案,这样我就可以向用户发送更有用的响应,并不必担心5秒窗口。而不是“我们有促销”之类的信息,我可以发送“嗨约翰,[我们知道你喜欢高尔夫球,所以]这里有高尔夫球50%的折扣。”。如果由于某些原因请求未能通过,它将悄悄地失败,用户不会受到干扰。 - James
我也使用过推送通知。优点是您不会被5秒窗口所困扰。缺点是推送通知需要一定的时间才能通过空中传递,可能会在发送后几分钟才到达。 - davidgyoung

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接