web-dev-qa-db-ja.com

Appleプッシュ通知はアラートやサウンドよりも多くのパラメータを送信できますか?

プッシュ通知に関連付ける必要があるメタデータがいくつかあります。

たとえば、ユーザー番号、メッセージID。

Appleがサポートするものより多くのパラメータを送信できますか:

 {aps =     {
    alert = joetheman;
    sound = default;
};}

これは可能ですか?

22
Atma

はい。プッシュ通知プログラミングガイドセクションで 通知ペイロード

プロバイダーは、Appleが予約したaps名前空間の外部にカスタムペイロード値を指定できます。カスタム値は、JSON構造化型およびプリミティブ型を使用する必要があります:辞書(オブジェクト)、配列、文​​字列、数値、およびブール。カスタムペイロードデータとして顧客情報を含めないでください。代わりに、コンテキスト(ユーザーインターフェイス用)または内部メトリックの設定などの目的に使用します。たとえば、カスタムペイロード値は、インスタントメッセージクライアントアプリケーションが使用する会話識別子、またはプロバイダーが通知を送信したタイミングを識別するタイムスタンプです。アラートメッセージに関連付けられたアクションは破壊的ではありません。たとえば、デバイス上のデータを削除するなどです。

したがって、ペイロードは次のようになります

{
    "aps": {
        "alert": "joetheman",
        "sound": "default"
    },
    "message": "Some custom message for your app",
    "id": 1234
}

同じページのさらに下には、これを示す多くの例があります。

46
Lily Ballard

もちろん。 Appleプッシュ通知を使用して、カスタムパラメーターをペイロードとして送信できます。 Kevin Ballardが言ったように、ペイロードは上記のようになります。ただし、常にプッシュ通知を処理していることを覚えておいてください。Appleにより、プッシュ通知が制限されます。通知ペイロードに許可される最大サイズは256バイトです。 Apple Push Notification Serviceは、これを超える通知を拒否します。そのため、通知にさらにデータを追加するときは、これも考慮してください。

6
Mathew Varghese

Apsタグ内にカスタムタグを配置することはできません。ドキュメントについては次のように書かれています:

Providers can specify custom payload values outside the Apple-reserved aps namespace. Custom values must use the JSON structured and primitive types: dictionary (object), array, string, number, and Boolean.

そのため、次のようなことを行う必要があります。

{
    "aps": {
        "alert": "Hello Push",
        "sound": "default"
    },
    "People": {
        "Address": "Your address here",
        "Name": "Your Name here",
        "Number": "XXXXXXXXXX"
    }
}

したがって、「aps」ではなくメインJSONでキーを探してカスタムペイロードを読み取ることができます。

3
Ved Rauniyar

このチュートリアル に基づいてカスタムキー/値を送信する方法は次のとおりです。

func sendPushNotification(to token: String, title: String, body: String, messageId: String, fromUsername: String, fromUID: String, timeStamp: Double) {

    let urlString = "https://fcm.googleapis.com/fcm/send"
    let url = NSURL(string: urlString)!

    // Apple's k/v
    var apsDict = [String: Any]()
    apsDict.updateValue(title, forKey: "title")
    apsDict.updateValue(body, forKey: "body")
    apsDict.updateValue(1, forKey: "badge")
    apsDict.updateValue("default", forKey: "sound")

    // my custom k/v
    var myCustomDataDict = [String: Any]()
    myCustomDataDict.updateValue(messageId, forKey: "messageId")
    myCustomDataDict.updateValue(fromUsername, forKey: "username")
    myCustomDataDict.updateValue(fromUID, forKey: "uid")
    myCustomDataDict.updateValue(timeStamp, forKey: "timeStamp")

    // everything above to get posted
    var paramDict = [String: Any]()
    paramDict.updateValue(token, forKey: "to")
    paramDict.updateValue(apsDict, forKey: "notification")
    paramDict.updateValue(myCustomDataDict, forKey: "data")

    let request = NSMutableURLRequest(url: url as URL)
    request.httpMethod = "POST"
                                                     // ** add the paramDict here **
    request.httpBody = try? JSONSerialization.data(withJSONObject: paramDict, options: [.prettyPrinted])

    // send post ...
}

AppDelegateの通知からすべてを読み取る方法は次のとおりです。以下のメソッドは、AppleDelegateのデリゲートメソッドです。 このチュートリアル を使用してください

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void {

    let userInfo = response.notification.request.content.userInfo

    if let userInfo = userInfo as? [String: Any] {

        readPushNotification(userInfo: userInfo)
    }

    completionHandler()
}

func readPushNotification(userInfo: [String: Any]) {

    for (k,v) in userInfo {
        print(k)
        print(v)
    }

    // my custom k/v
    if let messageId = userInfo["messageId"] as? String {
        print(messageId)
    }

    if let fromUsername = userInfo["username"] as? String {
        print(fromUsername)
    }

    if let fromUID = userInfo["uid"] as? String {
        print(fromUID)
    }

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

    // Apple's k/v
    if let aps = userInfo["aps"] as? NSDictionary {

        if let alert = aps["alert"] as? [String: Any] {

            if let body = alert["body"] as? String {
                print(body)
            }

            if let title = alert["title"] as? String {
                print(title)
            }
        }

        if let badge = aps["badge"] as? Int {
            print(badge)
        }
    }
}
0
Lance Samaria