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

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

我需要在没有服务器或用户干预的情况下唤醒我的应用程序。有些类似于闹钟的东西,当醒来的时候您会看到一个警报popup窗口。

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

无声推送通知 – 无法工作,因为您无法发送本地通知作为无声推送通知。 这些只能由服务器发送。 这意味着它需要服务器的干预

背景获取 – 无法工作,因为没有保证触发时间

我错过了什么吗?

编辑:您已经调整了您的问题,明确指出“没有用户或服务器干预”。

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

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

UILocalNotification

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

无声推送通知

iOS 7以来的另一个select是content-available或静默推送通知。 您为这种通知设置了一个特定的有效载荷,如果您的应用程序具有正确的UIBackgroundMode值设置,它将以无提示的方式传递给您的应用程序:

有效载荷看起来像这样:

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

你可以在你的应用程序委托中使用特定的委托方法接收它:

 - (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和后台执行文档以获取有关此方法的更多信息。

Objc.io上的多任务文章也是这种方法的一个好的开始。

背景获取

如果您从Apple的背景模式文档中读到,可能会使用UIBackgroudnModes值提取为您的应用程序提供机会性唤醒,并给予时间下载或更新其数据。

苹果在这方面的文档提到它是用例:

需要定期检查新内容的应用程序可以要求系统将其唤醒,以便他们可以启动对该内容的提取操作。 要支持这种模式,请在Xcode项目的Capabilities选项卡的Background modes部分启用Background fetch选项。

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

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

我想你需要考虑如何将它们很好地结合在一起,并且使用起来很方便,使它们能够紧密地满足你的需求。

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

  • 重大的地点变更,您需要在第一时间和偶尔之后要求用户许可。
  • 后台抓取,确保你的服务器在每次被调用的时候都会返回一些东西,这样iOS就不会把它优化到不那么频繁。
  • 无声推送通知,你第一次要求用户许可。

你可以select退出多任务。 这样的应用程序永远不会进入后台或被暂停。 只需等待显示警报的正确时间即可。 但是,考虑到用电量,这可能不是最好的解决scheme。 此外,应用程序必须始终处于活动状态。 如果用户按下主页button,则应用程序被终止。 但是,当用户locking设备时,应用程序不会终止。 这是最好的事情,你可以做,而不使用任何无证apis。

如果您不希望自己的应用程序在后台运行,则可以通过将UIApplicationExitsOnSuspend键(值为YES)添加到应用程序的Info.plist文件中,明确退出后台。 当一个应用程序退出时,它会在非运行状态,不活动状态和活动状态之间循环,而不会进入后台或暂停状态。 当用户按Homebutton退出应用程序时,应用程序委托的applicationWillTerminate:方法被调用,应用程序有大约5秒的时间清理并退出,然后终止并移回到非运行状态。

select退出后台执行是强烈的不鼓励,但可能是在某些条件下的首选选项。

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