iPhone启动选项

8

我收不到推送通知后的任何启动选项;这是我拥有的代码,但是没有一个NSLog会在调试区域中打印。

UILocalNotification *localNotif =
[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if (localNotif) {
    NSString *itemName = [localNotif.userInfo objectForKey:@"aps"];
    NSLog(@"Custom: %@", itemName);
} else {
    NSLog(@"//////////////////////////");

}

当我通过按推送通知上的视图打开应用程序时,它会进入didReceiveRemoteNotification脚本,我不确定这是否是预期发生的。
谢谢阅读。
6个回答

17

你的应用程序会通过多种路径接收推送通知,具体取决于当它被接收时的应用程序状态。

如果你的应用程序没有启动(甚至没有在后台挂起),则launchOptions将包含通知负载(键UIApplicationLaunchOptionsRemoteNotificationKey)。

如果它已经在运行或后台挂起,则应用程序将通过应用程序委托中的application:didReceiveRemoteNotification:接收通知。

对于本地通知,该过程也是相同的(在application:didFinishLaunchingWithOptions:application:didReceiveLocalNotification:中使用UIApplicationLaunchOptionsLocalNotificationKey)。


谢谢,那么有什么办法可以让应用程序在后台时获得相同的结果吗?我希望当令牌custompage是页面2或3时,它可以更改页面。 - user633268
你可以在application:didFinishLaunchingWithOptions:application:didReceiveRemoteNotification:中执行相同的操作。只需记住,在第一种情况下,你的应用刚刚启动,因此你完全知道显示的内容;而在第二种情况下,用户可能在应用程序的任何位置。 - Jilouc
好的,谢谢。还有一个问题,你会建议我如何更改视图吗?我被告知要使用NSUserDefaults,但我希望有一些能够立即到达它的东西。如果用户在该页面上,则刷新它。 - user633268

1

发现一个错误:

NSDictionary *remoteNotif = [launchOptions objectForKey:   
                              UIApplicationLaunchOptionsRemoteNotificationKey];

如果您想要接收远程通知,应该使用NSDictionary而不是UILocalNotification
远程通知是一个包含参数的有效负载,而不是本地通知。您可能需要查看此URL问题:

当应用程序未运行时处理远程通知时崩溃

如果您想要进行本地通知,请按照Ludovic的建议进行更改。

1
上面给出的答案是正确的。我在我的application:didFinishLaunchingWithOptions:方法中主要使用以下代码片段:
if let remoteNotifPayload = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [AnyHashable: Any] {
        notificationsController.didReceiveRemoteNotification(with: remoteNotifPayload)
    }

0
你可以使用NSUserDefaults来实现这个技巧。在你的AppDeligate.m文件中,第一次设置一个布尔值为YES。这样之后它就永远不会变成NO了。
  -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //add this if loop
        if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
        {
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
    }

0
  (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
      NSLog(@"Alert message: %@",[[userInfo valueForKey:@"aps"] valueForKey:@"alert"]);
}

0
如果您想要本地通知(我假设使用您的变量名称),请将UIApplicationLaunchOptionsRemoteNotificationKey替换为UIApplicationLaunchOptionsLocalNotificationKey,这样应该就可以了。

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