リッチプッシュ通知を受信する

🚧

このドキュメントは古いバージョンのiOS SDK v1について記載しています

iOS SDK v1は 2021/05/11でサポート終了となります。
SDK v1 からのアップグレードについては、まず SDK v1からv2のアップグレード方法 をご覧ください。

リッチプッシュ通知に対応することで、画像や動画などを添付したプッシュ通知を受信することが可能です(本機能は iOS10 以上でのみ利用可能です)

Extensionの作成

リッチプッシュ通知を受信するために、Notification Service Extension を作成する必要があります。

ターゲットを追加する

Xcodeのメニューの File > New > Target... をクリックします。

テンプレートを選択する

iOS > Notification Service Extension を選択し、Next をクリックします。

1458

ターゲットのオプションを設定する

以下の項目を入力した上で、Finish をクリックします。

  • Product Name
  • Organization Name
  • Organization Identifier
1460

Activate をクリックします。

836

SDK のセットアップ

CocoaPods を利用してセットアップする

Podfile の編集

Podfile を任意のエディタで開き、App Extensions SDK の情報を追記します。
TARGET_NAME 部分は、Extension 作成時に指定した Product Name に置き換えてください。

target 'TARGET_NAME' do
  pod 'KarteTrackerAppExtensions'
end

SDK をインストール

以下のコマンドをターミナルで実行し、SDK をインストールします。

$ pod install

手動でセットアップする

SDK のダウンロード

こちら から最新の SDK をダウンロードしてください。

SDK のプロジェクトへの追加

ダウンロードしたファイルを展開すると、KarteTrackerAppExtensions.framework というファイルがあるので、これをプロジェクトに追加します。

2092

SDK をプロジェクトに追加する際、オプションの指定を求められます。
Copy items if neededCreate groups にチェックを入れた上で、適切なターゲットにチェックが入っていることを確認し、Finish ボタンを押します。

1456

依存フレームワークの追加

App Extensions SDK が依存するフレームワークを追加します。
Build Phases > Link Binary With Libraries に、以下のフレームワークを追加してください。

フレームワーク名オプション
MobileCoreService.frameworkRequired
UserNotifications.frameworkOptional

ビルド設定の編集

ビルドに必要となる設定を追加します。
Build Settings > Other Linker Flags-ObjC を追加してください。

リッチプッシュ通知の受信に必要な実装を行う

Extension 作成時にテンプレートから自動的に作成されるソースコードを修正します。
デフォルトで作成される NotificationService クラスを KarteNotificationServiceExtension クラスを継承するようにし、デフォルトの実装も削除します。

このようにすることで、KARTE 経由で配信されたプッシュ通知を受信した際に KarteNotificationServiceExtension が自動的に必要なリソース(画像等)をダウンロードし、通知へ反映します。

import KarteTrackerAppExtensions

class NotificationService: KarteNotificationServiceExtension {
}
// Header
#import <UserNotifications/UserNotifications.h>
#import <KarteTrackerAppExtensions/KarteNotificationServiceExtension.h>

@interface NotificationService : KarteNotificationServiceExtension
@end

// Implementation
#import "NotificationService.h"

@interface NotificationService ()
@end

@implementation NotificationService
@end

KARTE 経由のプッシュ通知であるか判定する方法

プッシュ通知が KARTE 経由で送信されたものであるか判定する必要がある場合は、KarteNotificationServiceExtensioncanHandleRemoteNotification メソッドを呼び出します。

import KarteTrackerAppExtensions

class NotificationService: KarteNotificationServiceExtension {
    
  override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    // KARTE経由のプッシュ通知であるか判定
    if super.canHandleRemoteNotification(request.content.userInfo) {
      // KARTE経由のプッシュ通知 (スーパークラスに処理を移譲)
      super.didReceive(request, withContentHandler: contentHandler)
    } else {
      // KARTE以外のシステムから送信されたプッシュ通知 (任意の処理を実装)
      contentHandler(request.content)
    }
  }
}
#import "NotificationService.h"

@interface NotificationService ()
@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
  // KARTE経由のプッシュ通知であるか判定
  if ([super canHandleRemoteNotification:request.content.userInfo]) {
    // KARTE経由のプッシュ通知 (スーパークラスに処理を移譲)
    [super didReceiveNotificationRequest:request withContentHandler:contentHandler];
  } else {
    // KARTE以外のシステムから送信されたプッシュ通知 (任意の処理を実装)
    contentHandler(request.content);
  }
}

@end