web-dev-qa-db-ja.com

FireBaseを使用してiOSに実用的な通知を送信するにはどうすればよいですか?

現在、Firebaseを将来のプッシュ通知サービスとして評価しています。 iOSデバイスに実用的な通知を送信する方法はありますか?解析を使用してプッシュを送信する時点で、ペイロードに「category」パラメーターを設定し、通知に対する追加のアクションが機能しています。このパラメータをFirebaseコンソールまたはFirebaseREST APIを介して設定しようとしましたが、通知アクションが機能していません。ペイロードがiOSの予想とは異なるようです。

11
simsimmal

ありがとう マリク 答えてくれて。 FCMは、Android固有の "click_action"プロパティをiOS固有の "category"プロパティに変換しているようです。

REST APIを介してFirebaseプッシュ通知を送信します。これは、postmanでのテストに簡単に使用できます。

これがRESTバージョン:

[〜#〜] post [〜#〜]https://fcm.googleapis.com/fcm/send

ヘッダー:

  • 承認:key = YOUR_FIREBASE_SERVER_KEY
  • コンテンツタイプ:application/json

体:

{ "notification": {
    "text": "YOUR_Push_TEXT",
    "click_action":"YOUR_IOS_ACTIONABLE_NOTIFICATION_CATEGORY"
  },
  "to" : "YOUR_Push_TOKEN",
  "data": {
    "YOUR_CUSTOM_DATA": "DATA"
  }
}
24
simsimmal

現在、カテゴリは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";
}
12
Malik

ローカル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()

}
0
Quang Hà