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

时间:2016-02-14 03:36:17

标签: ios iphone wakeup

有没有办法在不使用“重大变更位置服务”的情况下唤醒iOS应用程序?

我需要在没有服务器或用户干预的情况下唤醒我的应用 类似于闹钟的东西,你可以在醒来时获得一个警告弹出窗口。

UILocalNotification - 无法使用,因为它需要用户和服务器干预。

无声推送通知 - 由于无法将本地通知作为无提示推送通知发送,因此无效。这些只能由服务器发送。这意味着它需要服务器干预。

后台获取 - 由于无法保证触发时间,因此无效。

我错过了什么吗?

3 个答案:

答案 0 :(得分:17)

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

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

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

<强> UILocalNotification

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

无声推送通知

iOS 7之后的另一个选项是content-available或静默推送通知。您为此类通知设置了特定的有效负载,如果您的应用具有正确的UIBackgroundMode值设置,则会以静默方式将其传送到您的应用:

有效负载看起来像这样:

{
    "aps" : {
        "content-available" : 1
    },
    "content-id" : 42
}

您将使用特定的委托方法在您的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);
}

然后,您可以使用此机会下载内容或在需要时快速更新您的应用,请查看UIBackgroundModes和background execution documentation以获取有关此方法的更多信息。

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

后台抓取

如果您阅读Apple的background modes文档,可以使用UIBackgroudnModes值获取应用程序,以便机会性地唤醒应用程序,并有时间下载或更新数据。

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

  

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

答案 1 :(得分:1)

您可以选择退出多任务处理。这样,应用程序永远不会进入后台或被暂停。只需等待显示警报的正确时间。但是,考虑到电源使用情况,这可能不是最佳解决方案。此外,应用程序需要始终处于活动状态。如果用户按下主页按钮,应用程序将终止。但是,当用户锁定设备时,应用程序不会终止。如果不使用任何未记录的apis,这是你能做的最好的事情。

  

如果您不希望自己的应用在后台运行,可以   通过添加明确选择退出背景   UIApplicationExitsOnSuspend键(值为YES)到您的应用程序   Info.plist文件。当应用程序选择退出时,它会在应用程序之间循环   非运行,非活动和活动状态,永远不会进入   背景或暂停状态。当用户按下Home按钮时   退出应用程序,应用程序的applicationWillTerminate:方法   调用委托,应用程序有大约5秒的时间来清理   并在终止并退回到未运行之前退出   状态。

     

强烈建议不要选择退出后台执行,但可能会这样做   在某些条件下的首选方案。

https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

答案 2 :(得分:1)

你所要求的是反对Apple的规则,我相信没有人会希望你的应用程序在未经他许可的情况下在后台秘密做某事。

你已经列出了你不想要的所有选项,但必须指望它们。

我认为你需要考虑如何将它们很好地结合起来并且用户友好,使它们能够满足您的需求。

这是我能想到的最佳组合:

  • 重大位置更改,您在第一时间和之后偶尔会要求用户许可。
  • 后台抓取,确保您的服务器每次调用都会返回一些内容,这样iOS就不会将其优化为频率较低。
  • 无声推送通知,您首次要求获得用户许可。