2014-10-07 76 views
6

我試圖按照解析指南來處理我JSON格式發送通知,但我有一個問題,這裏是我的代碼:Xcode中,解析 - 處理遠程通知

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { 
     // Override point for customization after application launch. 
     Parse.setApplicationId("MyAppId", clientKey: "MyAppClientKey") 

     var notificationType: UIUserNotificationType = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound 

     var settings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: notificationType, categories: nil) 
     UIApplication.sharedApplication().registerUserNotificationSettings(settings) 
     UIApplication.sharedApplication().registerForRemoteNotifications() 

if let launchOptions = launchOptions { 
    var notificationPayload: NSDictionary = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] as NSDictionary! 
    println(launchOptions) 

    var url = notificationPayload["url"] as String 

    var feed: FeedTableViewController = FeedTableViewController() 
    feed.messages.insert(url, atIndex: 0) 
    feed.sections.insert("section", atIndex: 0) 
    } 


     return true 
    } 

的應用程序現在不會崩潰,但我所做的更改不會發生。 的Json代碼:

{ 
    "aps": { 
     "badge": 10, 
     "alert": "Test", 
     "sound": "cat.caf" 
    }, 
    "url": "http://www.google.com" 
} 

回答

8

我猜你的問題是在這裏:

launchOptions(UIApplicationLaunchOptionsRemoteNotificationKey) as NSDictionary 

我不知道你期待什麼,但據我所知,有這樣的方法沒有在字典上。您可能正在尋找下標語法。事情是這樣的:

launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] as NSDictionary 

下得到的關鍵嵌套在launchOptions字典中的解釋:UIApplicationLaunchOptionsRemoteNotificationKey。

也就是說,launchOptions可能爲零,您應該在代碼中添加該檢查,並嘗試記錄launchOptions並在此處發佈結果。

您可以檢查是否launchOptions是零這樣的:

if let launchOpts = launchOptions { 
    var notificationPayload: NSDictionary = launchOpts.objectForKey(UIApplicationLaunchOptionsRemoteNotificationKey) as NSDictionary 
} 
+0

請檢查我的更新後,以及如果launchoptions ==更新瞭如何檢查零零? – Abdou023 2014-10-07 20:27:54

+0

,我不知道該怎麼如果他們爲零,你應該怎麼做,我假設他們是零,應用程序不是通過打開一個通知,你應該繼續。 – Logan 2014-10-07 20:34:17

+0

這工作,但現在我不能讓通知影響我的應用程序。請檢查我的編輯。 – Abdou023 2014-10-07 21:09:31

3

的NSDictionary的objectForKey返回可選:

func objectForKey(_ aKey: AnyObject) -> AnyObject?

所以如果強制使用它的展開!如果Optional包含nil,則會帶來風險。只有在100%確定Optional包含值時才應強制解包,但在此情況下,僅當用戶在通知中心點擊遠程通知消息時啓動應用程序時才設置UIApplicationLaunchOptionsRemoteNotificationKey。

您必須檢查可選喪氣的使用作爲?:


if let myDict = launchOptions[UIApplicationLaunchOptionsRemoteNotifcationKey] as? NSDictionary { 
// there is a notification 
} else { 
// no notification 
} 

的NSDictionary到(以下簡稱「作爲NSDictionary的?」沒有嚴格要求,因爲你可以在以後垂頭喪氣;如果你沒有垂頭喪氣斯威夫特會警告你myDict對象將被推斷爲AnyObject。

+0

做到了這一點,仍然得到相同的錯誤。 – Abdou023 2014-10-07 20:58:58

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

}