当应用程序通过远程推送启动didFinishLaunchingWithOptions时延迟openURL

时间:2013-10-15 19:06:00

标签: ios apple-push-notifications grand-central-dispatch nsoperationqueue

这是我的应用场景:当用户滑动通知时,我将通过URL启动一些其他应用。 所以它基本上在通知到达时启动其他应用程序

目前处理滑动通知方案时,

- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)
调用

方法,在此方法中,我调用processNotification:方法,其中包含:

...
[[UIApplication sharedApplication] openURL:url];
...
  • 如果在应用有效时收到推送url就会完全正常打开。
  • 如果通过滑动或点击通知收到推送,则会在后台打开url,但当前查看的应用是我的应用。例如,如果我的urltel:123-456-7890,则iOS会启动通话(您可以听到声音),但有效应用不是Phone.app,而是我的应用。

这对我来说似乎很奇怪。但是,如果我等待加载UI,并在此之后调用processNotification:,则会正确显示Phone.app窗口。 (平台中的错误?因为调用发生但我的UI位于顶部。)

我需要一种方法来延迟执行此processNotification:调用(可能通过操作队列),直到加载视图控制器。否则,我的应用程序会保持在最顶层,并且URL会在后台打开。

2 个答案:

答案 0 :(得分:7)

我遇到了同样的问题,我将openURL移到main_queue,似乎工作正常。我甚至不必在didBecomeActive

中进行更改
dispatch_async(dispatch_get_main_queue(), ^(void){
  [[UIApplication sharedApplication] openURL:url];
});

答案 1 :(得分:3)

您应该延迟处理推送通知(即调用openURL:)直到applicationDidBecomeActive:。保留application:didFinishLaunchingWithOptions:所需的参数,但只能在applicationDidBecomeActive:中调用您的处理代码。

我认为这里的问题是SpringBoard无法应对正在调用的另一个应用程序转换。当然是一个iOS错误。您应该在https://bugreport.apple.com

打开错误报告