有没有办法在没有用户或服务器干预的情况下唤醒iOS中暂停的应用程序

Har*_*qui 16 iphone wakeup ios

有没有办法唤醒iOS应用程序而不使用"重大变化位置服务"?

我需要在没有服务器或用户干预的情况下唤醒我的应用程序有些类似于闹钟,其中你在唤醒时获得警报弹出窗口.

UILocalNotification - 无法工作,因为它需要用户和服务器干预.

无声推送通知 - 由于您无法将本地通知作为无声推送通知发送,因此无法正常工作.这些只能由服务器发送.这意味着它需要服务器干预

后台获取 - 由于没有保证的触发时间而无法工作

我错过了什么吗?

Jes*_*edc 17

编辑:您已调整问题以明确说明"无需用户或服务器干预".

不,据我所知,设计iOS未提供明确的方式来在将来确定的时间唤醒您的应用程序.您可以在后台继续执行长时间运行的任务,机会性地获取更新的内容,提醒用户在需要时重新打开您的应用程序,并在需要时使用静默推送通知提示前两个.

以下是上述三个选项的一些提示:

UILocalNotification

最简单的方法是在将来安排一些UILocalNotifications,但为了唤醒您的应用,您需要与通知进行交互.这可能不是你想要的.

无声推送通知

自iOS 7以来的另一个选择是content-available静音推送通知.您为此类通知设置了特定的有效负载,如果您的应用具有正确的UIBackgroundMode值设置,它将以静默方式传送到您的应用:

有效负载看起来像这样:

{
    "aps" : {
        "content-available" : 1
    },
    "content-id" : 42
}
Run Code Online (Sandbox Code Playgroud)

并且您将使用特定的委托方法在您的app委托中接收它:

- (void)         application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo 
      fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification userInfo is %@", userInfo);

    NSNumber *contentID = userInfo[@"content-id"];
    // Do something with the content ID
    completionHandler(UIBackgroundFetchResultNewData);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用此机会下载内容或在需要时快速更新您的应用程序,请查看UIBackgroundModes和后台执行文档以获取有关此方法的更多信息.

Objc.io 的Multi-Tasking文章也是这种方法的一个良好开端.

背景提取

如果您从Apple 阅读了后台模式文档,则可以使用UIBackgroudnModes应用程序的值获取来机会性地唤醒,并有时间下载或更新它的数据.

Apple关于此的文档提到了它的用例:

需要定期检查新内容的应用可以要求系统将其唤醒,以便他们可以启动该内容的获取操作.要支持此模式,请从Xcode项目的"功能"选项卡的"后台模式"部分启用"后台获取"选项.

  • UILocalNotification - 不会工作,因为它需要用户和服务器干预......静默推送通知 - 不会工作,因为您无法将本地通知作为静默推送通知发送。这些只能由服务器发送。这意味着它需要服务器干预......后台获取 - 由于无法保证触发时间而无法工作......我需要在没有服务器或用户干预的情况下唤醒我的应用程序。 (2认同)