通知ペイロードで画像を送信する

FCM HTTP v1 API と Notifications Composer は、表示通知のペイロードで画像のリンクを送信し、配信後にデバイスへ画像をダウンロードするように対応しています。この機能は、iOS 10 以降でアプリ用の画像と動画の両方をサポートしています(ファイルサイズの上限については iOS のドキュメントをご覧ください)。

iOS アプリで通知画像を受信して処理できるようにするには、通知サービス拡張を追加する必要があります。アプリで通知サービス拡張を使用することによって、エンドユーザーに通知を表示する前に FCM ペイロードで配信された画像を処理できます。

通知サービス拡張を設定する

サービス拡張を追加するには、APN で通知を変更して表示するために必要な設定作業を行ってから、NotificationService.m に FCM 拡張ヘルパー API を追加します。具体的には、self.contentHandler(self.bestAttemptContent); でコールバックを完了するのではなく、以下のように FIRMessaging extensionHelper で完了します。

@interface NotificationService () <NSURLSessionDelegate>
@property(nonatomic) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property(nonatomic) UNMutableNotificationContent *bestAttemptContent;
@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];

    // Modify the notification content here as you wish
    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]",
    self.bestAttemptContent.title];

  // Call FIRMessaging extension helper API.
  [[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent
                                            withContentHandler:contentHandler];

}
...

送信リクエストを作成する

通知の送信リクエストで、次の ApnsConfig オプションを構成します。

  • 画像 URL を含む fcm_options.image
  • headers({ "mutable-content": 1})

例:

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

{
  "message":{
    "token" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification" : {
      "body" : "This is an FCM notification that displays an image.!",
      "title" : "FCM Notification",
     },
     "apns": {
         "payload": {
             "aps": {
                 "mutable-content": 1
             }
         },
         "fcm_options": {
             "image": "url-to-image"
         }
       }
   }
}

送信リクエストで上記のように mutable-content を設定することによって、受信側クライアントのサービス拡張はペイロードで配信された画像を処理できます。