我需要在重启设备后自动启动VoIP应用程序。
Apple文档清楚地提到: -
(=========编辑:这是来自官方的Apple文档,请在评论或回答之前看一下,如果没有用户交互或静默推送通知,App无法启动。还有看看下面的Github项目,人们已经验证了这种行为)
UIBackgroundModes数组的值
价值:voip 说明:该应用提供Voice-over-IP服务。 使用此密钥的应用会在系统启动后自动启动 该应用程序可以重新建立VoIP服务。使用此密钥的应用是 也允许播放背景音频。
我确保: -
plist
和Capabilities
部分。main
方法和application:didFinishLaunchingWithOptions:
方法向文件中添加日志,确保设备重启后肯定无法启动应用。 我甚至尝试用36颗星执行这个GitHub示例App进行测试 启动启动。 https://github.com/lithium3141/BootLaunch
但是,当我尝试使用设备时,即使这个应用程序也不会在重启时重新启动。
因此,这让我想到最近iOS10中是否有某些内容发生了变化,或者我在这里仍然遗漏了什么?
答案 0 :(得分:6)
好的,我对此进行了进一步调查,但首先我应该指出我没有通过实际尝试为此构建项目来验证这一点,因为现在对我来说太费时了。
我找到this(已在评论中提及),this,最重要的是this tech Q&A。
我收集的内容尤其是那些线程中Apple技术人员的各种评论,看来iOS 10的行为确实发生了变化。这意味着,如果您将构建与最新的SDK(即iOS 10库)链接,那么在过去的iOS版本中连接到VoiP服务器的相同代码将不再这样做。
现在,在您的情况下,您实际上并不需要真正的VoiP连接,对吗?你只是对"重启后启动"功能,对吗?至少您链接的演示项目实际上并没有进行任何VoiP连接,例如,setKeepAliveTimeout:handler:
方法甚至没有实现。
我知道这个具体问题没有在链接线程中讨论或在Q& A中解决,但是:
有意义的是,与整个传统的VoiP行为一起,重启功能也会消失。如果您切换到Push-Kit VoiP,您的应用程序在重新启动后不需要启动,它会在下一个远程通知到达时重新启动(并且VoiP通知具有高优先级,因此据说没有延迟)。
显然我在这里扣除了这一切背后的理由并且不能保证Apple真的按照这些思路进行思考,但这是有道理的:(传统)VoiP应用程序被重新启动的全部原因重新启动后,它需要建立连接,即它需要运行一些代码。使用不再需要的推送通知(操作系统基本上会在幕后为您提供这些通知),因此他们完全删除了此功能以及整个传统的VoiP方法。
您可以通过针对较旧的SDK进行编译来测试这一点(即使用Xcode 7作为Q& A建议)并查看它是否重新启动。那个苹果工作人员实际上解释说操作系统确实在应用程序的构建SDK上有所区别,这对我来说完全违反直觉。显然在这种情况下,它会决定"嘿,这是一个较旧的应用程序,所以它希望重新启动因为它的SDK被记录的方式"对于基于Xcode 7和&#34的应用程序,哦,这个应用程序是新的,所以我不需要坚持旧的方式"除此以外。 Wowsies。
TL; DR :对我来说,它看起来很像,iOS SDK改变了这种行为,同时放弃了整个旧的,无通知的VoiP方法。针对新SDK进行编译将导致应用程序在重新启动后无法重新启动。
记录:我能理解那些线索中愤怒的人。虽然可能存在技术原因导致这种变化,但这一具体后果并不明显。如果一个方法被弃用,但项目仍然编译并运行,我不希望这样的过程以这种方式失败。这些应用程序不会崩溃,它们只是被操作系统处理得不同,而且不完全相同。至少我希望新文档中的文档更清晰。
答案 1 :(得分:0)
只有使用推送工具包静音通知才能在终止模式下调用应用程序,并且必须为推送工具包生成证书,而不是正常的APNS通知和正常的推送通知证书。
从后端开始,您的有效负载必须是这样的。
$body['aps'] = array(
'content-available'=> 1,
'alert' => $message,
'sound' => 'default',
'badge' => 0,
);
一旦获得pushkit有效负载,然后使用声音文件安排本地通知,您的应用程序将在后台调用,直到您的声音文件播放。(最多30秒)直到那时您必须完成后台任务。
请逐步参考推送套件集成的一些重要细节
https://github.com/hasyapanchasara/PushKit_SilentPushNotification
应用的生命周期 - 当应用终止且推送套件有效负载到来时
首先
didFinishLaunchingWithOptions
//将调用
然后
didReceiveIncomingPushWithPayload
//有效负载方法被调用
然后,如果您有本地通知
didReceiveLocalNotification
//收到本地通知
然后
handleActionWithIdentifier
//处理程序方法,如果你有动作按钮(本地)
然后,如果您有远程通知
didReceiveRemoteNotification
//收到远程通知
然后
handleActionWithIdentifier
//处理程序方法,如果您有操作按钮(远程)
注意 - 如果不点击应用图标或接收推送工具包有效负载,您的应用将永远不会自动撤销/打开/重新启动。如果您希望您的应用程序是基于VOIP的,则应用程序会在设备重启后撤消。不可能。