2

プッシュ通知を生成するために、次のライブラリを使用しています。プッシュ通知応答からデータを取得する方法Swift 3/iOS

https://github.com/edamov/pushok

私が働いてプッシュ通知を得たが、私はここでスウィフト3に

を応答を抽出する方法がわからない私が持っているものです。

// Push notification received 
    func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) { 
     // Print notification payload data 
     print("Push notification received: \(data)") 

     let aps = data[AnyHashable("aps")]! 

     print(aps) 
    } 

私はプッシュ通知を作成することができますし、コンソールメッセージは動作しますが、これをプリントアウト...

Push notification received: [AnyHashable("samplekey"): samplevalue, AnyHashable("aps"): { 
    alert =  { 
     body = hey; 
     title = "Hello!"; 
    }; 
    sound = default; 
}] 
{ 
    alert =  { 
     body = hey; 
     title = "Hello!"; 
    }; 
    sound = default; 
} 

だから私の質問は、私が「身体」のための警告の内部データへのアクセス方法ですと 'タイトル'?

私は変数にアクセスしようとしましたが、どのように私はそれにアクセスする必要があり、どのようなチュートリアルでもこの​​件に関するドキュメントが見つかりませんでしたので、エラーが発生し続けます。

答えて

5

私は、これはヨセフが見つかった方法を行うためのより安全な方法だと思います。

guard 
    let aps = data[AnyHashable("aps")] as? NSDictionary, 
    let alert = aps["alert"] as? NSDictionary, 
    let body = alert["body"] as? String, 
    let title = alert["title"] as? String 
    else { 
     // handle any error here 
     return 
    } 

print("Title: \(title) \nBody:\(body)") 
+0

素敵な仕事!!!!!これははるかに良いです –

1

私は答えを見つけました。あなたはそれを以下のようにします。

誰かがより安全な回答をお持ちでしたら、私は編集や投稿をいただければ幸いです。

1

私は力のアンラッピングを避ける方法を見つけようと熱望します。次の場合:

let alert = aps["alert"]! as! NSDictionary 
let body = alert["body"] as! String 
let title = alert["title"] as! String 

上記の値のいずれかが不足していると、アプリケーションがクラッシュします。

代わりに、まず通知モデルを導入してください。

class MTNotification { 
    let alert: [String: AnyHashable] 
    var title: String? 
    var body: String? 

    init(alert: [String: AnyHashable]) { 
     self.alert = alert 
    } 
} 

使用生の通知データの処理中に発生する可能性がどのようなエラーを追跡するために何か。 Errorプロトコルに準拠させる方が良いでしょう。

enum MTError: Error { 
    // Observe your transformation and extend error cases 
    case missingProperty(id: String) 
} 

あなたが通知へのデータの変換を扱うことができるアプリデリゲートを、汚染しないヘルパークラスを使用します。

class MTNotificationBuilder { 

    /// Build a notification from raw data 
    /// 
    /// - Parameter data: Classic notification payload, received from app delegate 
    /// - Returns: customized MTNotification 
    /// - Throws: error while building a valid MTNotification object 
    static func build(from data: [AnyHashable : Any]) throws -> MTNotification { 
     guard let aps = data["aps"] as? [String: AnyHashable] else { 
      // Do some error handlig 
      throw MTError.missingProperty(id: "aps") 
     } 

     guard let alert = aps["alert"] as? [String: AnyHashable] else { 
      // Do some error handlig 
      throw MTError.missingProperty(id: "aps") 
     } 

     let notification = MTNotification(alert: alert) 
     // Assign values read as optionals from alert dictionary 
     notification.title = alert["title"] as? String 
     notification.body = alert["body"] as? String 

     return notification 
    } 
} 

最後に行う必要があるのは、ビルダー関数を呼び出して結果を確認することだけです。あなたは厳密にすることができ、いずれの場合にもエラーを導入し、後で保守性を助けることもできます。

func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) { 

    do { 
     let notification = try MTNotificationBuilder.build(from: data) 
     print(notification.alert) 
    } catch let error { 
     print(error) 
    } 
} 
+0

これを送信していただきありがとうございます。 –

0

[プロジェクトの機能]で[バックグラウンドモード]をオンにし、[リモート通知]をオンにしていることを確認してください。 AppDelegateクラスに次のメソッドを追加します。このメソッドは、通知の提示時に呼び出されます。

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
     print(notification.request.content.userInfo) 
     completionHandler([ .alert,.badge, .sound]) 

} 
関連する問題