プッシュ通知に関連付ける必要があるメタデータがいくつかあります。
たとえば、ユーザー番号、メッセージID。
Appleがサポートするものより多くのパラメータを送信できますか:
{aps = {
alert = joetheman;
sound = default;
};}
これは可能ですか?
はい。プッシュ通知プログラミングガイドセクションで 通知ペイロード
プロバイダーは、Appleが予約したaps名前空間の外部にカスタムペイロード値を指定できます。カスタム値は、JSON構造化型およびプリミティブ型を使用する必要があります:辞書(オブジェクト)、配列、文字列、数値、およびブール。カスタムペイロードデータとして顧客情報を含めないでください。代わりに、コンテキスト(ユーザーインターフェイス用)または内部メトリックの設定などの目的に使用します。たとえば、カスタムペイロード値は、インスタントメッセージクライアントアプリケーションが使用する会話識別子、またはプロバイダーが通知を送信したタイミングを識別するタイムスタンプです。アラートメッセージに関連付けられたアクションは破壊的ではありません。たとえば、デバイス上のデータを削除するなどです。
したがって、ペイロードは次のようになります
{
"aps": {
"alert": "joetheman",
"sound": "default"
},
"message": "Some custom message for your app",
"id": 1234
}
同じページのさらに下には、これを示す多くの例があります。
もちろん。 Appleプッシュ通知を使用して、カスタムパラメーターをペイロードとして送信できます。 Kevin Ballardが言ったように、ペイロードは上記のようになります。ただし、常にプッシュ通知を処理していることを覚えておいてください。Appleにより、プッシュ通知が制限されます。通知ペイロードに許可される最大サイズは256バイトです。 Apple Push Notification Serviceは、これを超える通知を拒否します。そのため、通知にさらにデータを追加するときは、これも考慮してください。
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でキーを探してカスタムペイロードを読み取ることができます。
このチュートリアル に基づいてカスタムキー/値を送信する方法は次のとおりです。
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)
}
}
}