【问题标题】:Does launchOptions 'UIApplicationLaunchOptionsLocalNotificationKey' contain NSDictionary or UILocalNotificationlaunchOptions 'UIApplicationLaunchOptionsLocalNotificationKey' 是否包含 NSDictionary 或 UILocalNotification
【发布时间】:2016-01-27 09:58:53
【问题描述】:

好的,我已经阅读了有关如何在 didfinishlaunchingwith 选项中检查本地通知的各种文章。例如这篇 NSHipster 文章声称远程和本地键都包含一个 NSDictionary。 http://nshipster.com/launch-options/

但是,我测试过,它包含一个 UILocalNotification,其他一些文章也这么说。

所以,我环顾四周,但没有找到任何明确的答案。这是操作系统版本问题吗?不同的版本是否包含不同的对象,还是什么?

非常感谢指针。

编辑:

来自 NSHipster 文章:

“本地通知填充 UIApplicationLaunchOptionsLocalNotificationKey 上的启动选项,其中包含与远程通知具有相同结构的有效负载:

UIApplicationLaunchOptionsLocalNotificationKey:表示本地通知可供应用处理。该键的值是一个包含本地通知负载的 NSDictionary。"

【问题讨论】:

    标签: ios objective-c iphone notifications uilocalnotification


    【解决方案1】:

    根据Apple Documentation,UIApplicationLaunchOptionsLocalNotificationKey 会给你一个 UILocalNotification 对象。

    如果点击默认操作按钮(在运行 iOS 的设备上),则 系统启动应用程序,应用程序调用其委托的 application:didFinishLaunchingWithOptions: 方法,传入 通知负载(用于远程通知)或 local-notification 对象(用于本地通知)。虽然 application:didFinishLaunchingWithOptions: 不是最好的地方 处理通知,此时获取有效负载会给你 在处理程序方法之前启动更新过程的机会 被调用。

    Apple Docs 中的示例代码

    - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        UILocalNotification *localNotif =
    
        [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    
        if (localNotif) {
    
            NSString *itemName = [localNotif.userInfo objectForKey:ToDoItemKey];
    
            [viewController displayItem:itemName];  // custom method
    
            app.applicationIconBadgeNumber = localNotif.applicationIconBadgeNumber-1;
    
        }
    
        [window addSubview:viewController.view];
    
        [window makeKeyAndVisible];
    
        return YES;
    
    }
    

    编辑:更新UIApplicationLaunchOptionsRemoteNotificationKey

    UIApplicationLaunchOptionsRemoteNotificationKey,返回带有notification payload的NSDictionary

    也来自苹果文档

    此键的值是触发的 UILocalNotification 对象。有关处理本地通知的更多信息,请参阅 application:didReceiveLocalNotification: 方法。

    apple-doc-UIApplicationLaunchOptionsLocalNotificationKey

    注意:此键自 iOS10.0 起已弃用

    【讨论】:

    • 谢谢。我查看了apples doc,但由于很多教程等实际上也有本地的NSDictionary,我想知道它在旧版本的IOS中是否有不同的工作方式。谢谢。
    • 很高兴澄清了:)
    • 对。我仍然有点担心有这么多文章声明本地密钥应该包含一个 NSDictionary,就像我链接到的 NSHipster 文章一样。我编辑了我的问题以显示相关的报价。如果不是不同的 IOS 版本,您知道这是为什么吗?
    • 我想您应该将 NSHipster 引用添加到问题中。我将其从答案中删除,因为它可能会使未来的读者感到困惑。
    • 没有问题。不能说为什么这篇文章提到它给你一个 NSDictionary。您可以随时在他们的GitHub repository 上的文章中将其报告为更正
    【解决方案2】:

    didFinishLaunchingWithOptions: 中的 Options 参数是一个字典,其中可以包含 UILocalNotification 作为键 UIApplicationLaunchOptionsLocalNotificationKey 的值,根据 UIApplicationDelegate

    这与远程通知不同,远程通知是一个包含有效负载的NSDictionary,可以使用UIApplicationLaunchOptionsRemoteNotificationKey 键获取。

    UIApplicationLaunchOptionsRemoteNotificationKey

    此键的存在表示应用程序可以处理远程通知。这个键的值是一个包含远程通知负载的 NSDictionary。有关处理远程通知的更多信息,请参见 application:didReceiveRemoteNotification: 的描述。

    UIApplicationLaunchOptionsLocalNotificationKey

    此键的存在表示本地通知可供应用处理。此键的值是触发的 UILocalNotification 对象。有关处理本地通知的更多信息,请参阅 application:didReceiveLocalNotification: 方法。

    【讨论】:

    • 是的,我也读过。我只是想知道为什么有几篇文章,比如我链接到的那篇文章(我现在在我的问题中引用了它),说本地密钥包含一个 NSDictionary。如果不是因为不同的IOS版本,为什么?是在测试版中有所不同还是什么?
    • 我理解这种担忧,因为 Apple 文档状态 UILocalNotification 出现在 iOS4 中,NSHipster 的 Mattt 在他的文章中提到了相同的 iOS 版本。不过,从 iOS4 测试版开始,我就记不起这件事了。
    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2011-07-28
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多