我正在iOS应用中实现推送通知。
我应该显示一些自定义的View Controller,以防用户通过推送通知打开(假设应用已在后台运行)应用程序。
我正在实施此方法:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateActive)
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"PushNotificationReceived" object:self userInfo:userInfo];
}
}
我检查了文档,它说这个方法会被调用,无论app是在后台还是前台。当应用程序即将进入前台时,系统可能会第二次调用它,所以我想知道,if(state == UIApplicationStateActive){}内部的代码是否会执行。
此外,已经有一些处理应用程序内部的推送通知:didFinishLaunchingWithOptions:,只在app启动时调用。我想我应该从那里删除它,它可能会显示View Controller两次。
如果您对此问题有经验,请告诉我您的意见。
答案 0 :(得分:1)
实际上我没有明白你的观点。
如果应用处于有效状态,则 didReceiveRemoteNotification
称为仅,背景中不。那么为什么需要检查state
?
然后,如果应用程序位于后台,设备会收到推送通知,而不是用户点击该按钮,打开应用程序并调用该方法 。
否则,如果您打开应用而不点按通知,则该方法未被调用。
答案 1 :(得分:1)
从Apple文档中获取相关方法:
//This method will be invoked even if the application was launched or resumed because of the remote notification.
//The respective delegate methods will be invoked first.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);
因此,如果您实现上述委托方法,则应该 NOT 处理application:didFinishLaunchingWithOptions:
中的推送通知,因为即使应用程序因为推送通知而刚刚启动,也会调用上述方法
[[UIApplication sharedApplication] applicationState]
才会有值UIApplicationStateActive
。
对于在收到推送通知时您的应用程序处于后台或未运行的情况,有两种情况:
remote-notification
。在这种情况下,上述方法可以称为两次次。当刚刚向设备接收推送通知时,将使用具有值UIApplicationStateBackground
的applicationState调用上述方法。如果用户点击显示的推送通知,则会再次调用该方法,这次具有applicationState值UIApplicationStateInactive
。remote-notification
。在这种情况下,当用户点击以显示推送通知时,该方法将被称为仅。