現在、Firebaseを将来のプッシュ通知サービスとして評価しています。 iOSデバイスに実用的な通知を送信する方法はありますか?解析を使用してプッシュを送信する時点で、ペイロードに「category」パラメーターを設定し、通知に対する追加のアクションが機能しています。このパラメータをFirebaseコンソールまたはFirebaseREST APIを介して設定しようとしましたが、通知アクションが機能していません。ペイロードがiOSの予想とは異なるようです。
ありがとう マリク 答えてくれて。 FCMは、Android固有の "click_action"プロパティをiOS固有の "category"プロパティに変換しているようです。
REST APIを介してFirebaseプッシュ通知を送信します。これは、postmanでのテストに簡単に使用できます。
これがRESTバージョン:
[〜#〜] post [〜#〜]https://fcm.googleapis.com/fcm/send
ヘッダー:
体:
{ "notification": {
"text": "YOUR_Push_TEXT",
"click_action":"YOUR_IOS_ACTIONABLE_NOTIFICATION_CATEGORY"
},
"to" : "YOUR_Push_TOKEN",
"data": {
"YOUR_CUSTOM_DATA": "DATA"
}
}
現在、カテゴリはFCMコンソールでサポートされていませんが、テストする場合は、curl postcallとtestを使用できます。サーバーからペイロードにカテゴリを追加し、FCMAPIを使用して通知をiOSにプッシュできます。
curl --header "Authorization: key=<YOUR_SERVER_KEY>" --header Content- Type:"application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\":\"Device Token\",\"priority\":\"high\",\"notification\": {\"title\": \"Shift Alert\",\"text\": \"Would you like to accept shift today 11:30 to 13:30 \",\"click_action\":\"INVITE_CATEGORY\"}}"
認証:key = YOUR_SERVER_KEYこれがサーバーキーであることを確認してください。このサーバーキーの値は、Firebaseプロジェクトコンソールの[プロジェクト設定]> [クラウドメッセージング]で利用できます。 Android、iOS、およびブラウザのキーはFCMによって拒否されます。
INVITE_CATEGORY =コードで使用しているカテゴリ
以下はアクションタップで取得する応答辞書です:
{
aps = {
alert = {
body = "Would you like to accept shift today 11:30 to 13:30 ";
title = "Shift Alert";
};
category = "INVITE_CATEGORY";
};
"gcm.message_id" = "0:12233487r927r923r7329";
}
ローカルPCがカテゴリ付きのプッシュ通知を送信するための簡単なJSメソッドを作成しました。 Nodeを使用しています。
function sendFirebaseNotification(title, body, postId, postUrl, topic) {
var fbAdmin = require('firebase-admin');
var serviceAccount = require('./your_credential_file.json'); //download from firebase admin page and specify in your local machine
var app = fbAdmin.initializeApp({
credential: fbAdmin.credential.cert(serviceAccount)
});
var message = {
apns: {
payload: {
aps: {
alert: {
title: title,
body: body
},
category: "VIEW_NOTIFICATION" //your ios category
},
id: postId, //extra data
title: title, //extra data
url: postUrl //extra data
}
},
topic: topic //your ios app should subscribe to this topic (or you can use a specific token here).
};
// Send above message
fbAdmin.messaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
process.exit();
})
.catch((error) => {
console.log('Error sending message:', error);
process.exit();
});
}
簡単な呼び出し
sendFirebaseNotification(title, description, id, url, topic);
IOSハンドル:
//Call when application loaded
func registerNotification(_ application: UIApplication) {
//Firebase callback
Messaging.messaging().delegate = self
Messaging.messaging().subscribe(toTopic: YOUR_TOPIC_NAME) { error in
print("Subscribed to notification topic")
}
//IOS Notification (ios 10 and above)
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(
options: [.alert, .badge, .sound],
completionHandler: {_, _ in })
application.registerForRemoteNotifications()
//Add custom actions
let acceptAction = UNNotificationAction(identifier: "view_now",
title: "Xem ngay",
options: .foreground)
let skipAction = UNNotificationAction(identifier: "skip",
title: "Bỏ qua",
options: .foreground)
// Define the notification type
let viewCategory =
UNNotificationCategory(identifier: "VIEW_NOTIFICATION", //category name
actions: [acceptAction, skipAction],
intentIdentifiers: [],
hiddenPreviewsBodyPlaceholder: "",
options: .customDismissAction)
// Register the notification type.
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.setNotificationCategories([viewCategory])
}
func viewNotification(_ userInfo: [AnyHashable : Any]) {
//handle extra data
let id = (userInfo["id"] as? String) ?? ""
let title = (userInfo["title"] as? String) ?? ""
let url = userInfo["url"] as? String
NotificationService.shared.viewNotification(id, title: title, url: url)
}
//MARK: UNUserNotificationCenterDelegate
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler(.alert)
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
// if user tap or response to not "skip" action we can handle here
let userInfo = response.notification.request.content.userInfo
if response.actionIdentifier != "skip" {
viewNotification(userInfo)
}
// Always call the completion handler when done.
completionHandler()
}