swift2 如何在didReceiveRemoteNotification中获取用户信息JSON值

h43kikqp  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(195)
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject])
{
        PFPush.handlePush(userInfo)

        if application.applicationState == UIApplicationState.Active
        {
            PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo)

            if let msg = userInfo["test"] as? Dictionary<String,AnyObject>
            {
                print(msg)
            }
        }

我的userInfo[“test”] JSON值是:

> Printing description of userInfo:
▿ 3 elements
  ▿ [0] : 2 elements
    - .0 : message
    - .1 : 1235
  ▿ [1] : 2 elements
    - .0 : aps
    - .1 : 0 elements
  ▿ [2] : 2 elements
    - .0 : link
    - .1 :

我可以得到我的userInfo数据,但我不知道为什么我的msg值什么都没有(甚至没有零只是没有显示)我怎么才能去,直到打印(msg)?

已更新

下面是我的推像:
这是一个很好的例子,它可以帮助你更好地理解测试的结果。
在$post_data示例中:
(数组=〉链接=〉消息=〉消息));
我已经试过了,但我不能做一个简单的打印。
get Value from userInfo

编辑

还是跳过了“aps”部分。
Picture 1

我的JSON

下面是我的Json的样子:

> {  
  "aps":{  
     "alert":{  
        "title":"$title",
        "body":"$message"
     },
     "badge":"1"
  },
  "adira":{  
     "link":"$link"
  }
}

这是我的准则:

>   func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
              //  PFPush.handlePush(userInfo)
       // PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo)
        if let msg = userInfo["message"] as? String {
            print(msg)
            print("a")
        }     
        if let alertDict = userInfo["aps"]?["alert"] as? Dictionary<String, String> {
            print("title : ", alertDict["title"])
            print("body :", alertDict["body"]!)
            print("badge: ", alertDict["badge"]!)
            print("b")
        }      
        if let link = userInfo["link"] as? String {
            print(link)
            print("c")
        }
    }
}

但我还是不能得到我的aps数据。仍然是零或什么都没有。
如果您需要特定的代码,只需点击下面的链接:
Full code AppDelegate.swift

编辑2

我直接使用print(userInfo),打印输出为:
对象已保存。[消息:iOS推送,aps:{ },链接:]

更新2

我试着从www.example.com推parse.com,而不是我的网站(第三方)。这是我从正常打印(userInfo)得到的

> [aps: {
    alert = 12345abc;
    sound = default;
}]

所以我想我只是改变和添加一些东西到我的JSON里面从我的网站到:

[aps:{
   alert = $message;
   sound = default;
   link = $link;
}]

像这样的事?

cidc1ykv

cidc1ykv1#

如注解中所述,APNS有效载荷中没有密钥test
如果密钥message的值保证始终发送,则可以轻松地解包该值

let msg = userInfo["message"] as! String
print(msg)

否则使用可选绑定

if let msg = userInfo["message"] as? String {
    print(msg)
}

要从aps键获取alert字典并打印例如body字符串,请使用

if let aps = userInfo["aps"] as? [String:Any],
   let alertDict = aps["alert"] as? [String:String] {
    print("body :", alertDict["body"]!)
}
5m1hhzi4

5m1hhzi42#

我使用苹果推送通知服务提供商和json有效负载如下

{
  "aps" : {
    "alert" : {
      "title" : "I am title",
      "body" : "message body."
    },
  "sound" : "default",
  "badge" : 1
  }
}

由于提供程序将其作为JSON定义的字典生成,iOS将其转换为NSDictionary对象,没有Dictionary这样的下标,但可以使用value(forKey:)
来自here的引用
这是我的雨燕4

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    guard application.applicationState == .active else { return }
    guard let alertDict = ((userInfo["aps"] as? NSDictionary)?.value(forKey: "alert")) as? NSDictionary,
        let title = alertDict["title"] as? String,
        let body = alertDict["body"] as? String
        else { return }
    let alertController = UIAlertController(title: title, message: body, preferredStyle: .alert)
    let okAct = UIAlertAction(title: "Ok", style: .default, handler: nil)
    alertController.addAction(okAct)
    self.window?.rootViewController?.present(alertController, animated: true, completion: nil)
    completionHandler(UIBackgroundFetchResult.noData)
}

相关问题