如果应用程序处于非活动状态,则访问推送有效负载

Posted

技术标签:

【中文标题】如果应用程序处于非活动状态,则访问推送有效负载【英文标题】:Accessing push payload if app is inactive 【发布时间】:2016-01-21 12:09:57 【问题描述】:

我有一个推送通知,当应用收到它时,我会调用以下内容

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) 

    if userInfo["t"] as! String == "rqst"  

        print("type is help request")

        if let token = NSUserDefaults.standardUserDefaults().objectForKey("authToken") 
            authTokenOfHelper = token as! String
        

        let storyBoard = UIStoryboard.init(name: "Main", bundle: nil)
        let viewController = storyBoard.instantiateViewControllerWithIdentifier("helperMap")
        let navController = UINavigationController.init(rootViewController: viewController)
        self.window?.rootViewController = nil
        self.window?.rootViewController = navController
        self.window?.makeKeyAndVisible()

        helpRequestReceived = true

    


这会初始化故事板。但是如果我的应用程序被系统杀死并且它已关闭并且设备接收到推送,则在点击推送后什么都不会发生。

如果应用程序关闭,我似乎必须使用application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?)

但是如何在 didFinishLaunchingWithOptions 中访问 userInfo 呢?

【问题讨论】:

【参考方案1】:

您可以在 didFinishLaunching 中使用UIApplicationLaunchOptionsRemoteNotificationKey 作为启动选项进行检查。

UIApplicationLaunchOptionsRemoteNotificationKey:表示一个 远程通知可供应用程序处理。的价值 这个键是一个 NSDictionary 包含远程的有效载荷 通知。 > - 警报:警报消息的字符串或 字典有两个键:body 和 show-view。 > - 徽章:一个数字 指示要从提供程序下载的数据项的数量。 此数字将显示在应用程序图标上。没有徽章 属性表示当前标记图标的任何数字都应该 被移除。 > - sound:应用程序包中的声音文件的名称 作为提示音播放。如果指定了“default”,则默认声音 应该播放。

您可以在application:didFinishLaunchingWithOptions: 中手动调用application:didReceiveRemoteNotification:

目标 C

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // ...

    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) 
        [self application:application didReceiveRemoteNotification:launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]];
    

   return YES;

斯威夫特

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
        // Override point for customization after application launch.

        if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary 

            self.application(application, didReceiveRemoteNotification: launchOptions![UIApplicationLaunchOptionsRemoteNotificationKey]! as! [NSObject : AnyObject])

        


        return true
    

【讨论】:

尝试了代码,但如果我打开推送,什么也没有发生。应用打不开 应用程序未打开或没有调用 didReceiveRemoteNotification ? 哦不,抱歉,应用程序打开了,但随后立即崩溃 答案已更新为 swift 代码。请立即检查。谢谢 @technerd,Objective-c 代码缺少返回值。【参考方案2】:

这是在 Objective C 中,但在 Swift 中也是如此。把这个放在didFinishLaunchingWithOptions:

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteNotif) 
    [self application:application didReceiveRemoteNotification:remoteNotif];

斯威夫特:

if let remoteNotif = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary ...

【讨论】:

didReceiveRemoteNotification:remoteNotif 内部我使用了` [RCTLinkingManager application:application openURL:url options:@];` 但它不起作用。

以上是关于如果应用程序处于非活动状态,则访问推送有效负载的主要内容,如果未能解决你的问题,请参考以下文章

应用退出或挂起时处理推送负载

当应用程序处于未运行或后台状态时,如何处理推送通知有效负载而不点击它

应用程序处于非活动状态时无法接收静默通知 iOS

检测应用程序处于后台/非活动状态时是不是触发了本地通知

如何在应用程序处于非活动状态时获取推送通知ios swift3

iOS 推送通知和 GCM