VoIP Pushkit通知无法重新启动应用程序,如果它是被强制退出的并且设备已经重新启动。

10

如果用户通过多任务界面向上滑动应用程序并且设备已重启,则无法使用voip pushkit通知重新启动应用程序。

但是,在以下情况下,可以使voip pushkit通知正常工作:

  • 应用程序被强制退出,然后pushkit通知到达。 应用程序将立即重新启动。标准推送通知不能在这种情况下唤醒应用程序。

  • 应用程序在后台/挂起状态下,设备重启。由于Voip模式,应用程序将在设备重启时重新启动(我可以在Xcode Activity Monitor中看到该过程)。 这里需要一个技巧来正确处理pushkit通知,具体方式在http://blog.biokoda.com/post/114315188985/ios-and-pushkit中描述为“在初始化PushKit之前开始后台任务。在接收到PushKit令牌时完成此任务”

但是,当同时满足设备重启和应用程序强制退出时,pushkit通知似乎无法重新启动应用程序。在查看Xcode中的设备日志时,我没有获得apsd的任何日志,显示系统已处理通知。

这是我的代码:

@implementation AppDelegate
{
  UIBackgroundTaskIdentifier bgTask;
}
- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UIApplication* app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
    dispatch_async(dispatch_get_global_queue(
    DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        while (true) {
            ;
        }
    });
    // Initialize pushkit
    PKPushRegistry *pushRegistry =
        [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
    pushRegistry.delegate = self;
    pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];    
    return YES;
}

- (void)pushRegistry:(PKPushRegistry *)registry 
    didUpdatePushCredentials:(PKPushCredentials *)credentials
    forType:(NSString *)type{
    UIApplication* app = [UIApplication sharedApplication];
    [app endBackgroundTask:bgTask];
    // ... more code to read the token ...
}

- (void)pushRegistry:(PKPushRegistry *)registry
    didReceiveIncomingPushWithPayload:(PKPushPayload *)payload
    forType:(NSString *)type {
    // ... logging to check if notification is received ...
}

同时,在后台模式中我开启了"语音通话"和"远程通知"。

我知道其他应用程序,如WhatsApp,在这种情况下可以重新启动,所以我不明白我做错了什么。

另外,以下操作并不能解决问题:1)强制退出2)发送pushkit通知(将被接收到)3)重启。该应用程序将不会被重新启动,新的推送通知也无法将其重新启动。


@sahara108和我自己也遇到了这个问题。我已经直接向苹果提出了问题,如果他们在其他人弄清楚之前回答了我的问题,我会在这里发布答案。 此外,您提到WhatsApp等应用程序可以重新启动,但它们是否完全重新启动?在我们的调查中,这些应用程序重新启动,但无法完全启动。它们的日志记录被过早地截断(看起来像是操作系统杀死)。 - Pandalover
我通过查看活动监视器中启动的进程来确定应用程序已重新启动。 - mcaoun
1个回答

4

在我使用AdHoc预配资料测试应用程序之后(并通过iTunes安装它),通过prod gateway.push.apple.com而不是gateway.sandbox.push.apple.com提供的Voip推送通知开始在重新启动后唤醒被强制退出的应用程序。

操作系统显然以不同的方式处理开发和生产。

进一步查看APSD日志,我发现在使用开发预配资料时将打印出以下内容:

: XXXX-XX-XX XX:XX:XX +0300 apsd[97]:
这些已启用主题已被删除{( "YOUR_BUNLE_IDENTIFIER" )}

使用AdHoc预配资料时不会发生这种情况。


你是不是想说应用商店的配置文件?在我的测试中,当手机重启时应用可以重新启动,但是还不完整。当尝试打开XMPP套接字连接时会被卡住。这时似乎网络不可用。你的应用程序能否成功重新启动? - sahara108

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