如何在didReceiveRemoteNotification

时间:2015-12-21 16:07:54

标签: ios json swift swift2

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)?

更新

这就是我的推动:

  

$ this-&gt; parsepush-&gt; send(array(“channels”=&gt; ['test'],“data”=&gt;&gt; $ post_data));

在$ post_data示例中:

  

$ post_data =   json_encode(阵列   ('link'=&gt; $ link,'message'=&gt; $ message)); \

我已尝试过指令,但我也不能做一个简单的打印。

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

我试图从parse.com推送,而不是我的网站(第三方)。 这是我从普通打印(userInfo)

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

所以我想我会改变并在我的JSON中添加内容到我的网站:

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

那样的东西?

2 个答案:

答案 0 :(得分:2)

如评论中所述,APNS有效载荷中没有密钥Intent intent = new Intent(context, UninstallService.class); intent.setAction(intentAction); intent.putExtra("APPLICATION_PREFERENCE", applicationPreference); AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); alarmMgr .setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent ); 如果保证发送密钥test的值,您可以轻松解开值

message

否则使用可选绑定

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

要从if let msg = userInfo["message"] as? String { print(msg) } 键获取alert字典并打印,例如使用aps字符串

body

答案 1 :(得分:0)

我使用APNs Provider和json负载,如下所示

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

由于提供程序的缘故,它是作为JSON定义的字典而产生的,iOS将其转换为NSDictionary对象,没有像Dictionary这样的下标,但是可以使用value(forKey:)

来自here的引用

这是我使用Swift 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)
}