すべてのプロダクト
Search
ドキュメントセンター

Mobile Platform as a Service:iOS

最終更新日:Jan 17, 2025

このガイドでは、MPS を iOS クライアントに統合する方法を紹介します。CocoaPods を使用したネイティブプロジェクトに基づいて、MPS を iOS クライアントに統合できます。

説明

2020 年 6 月 28 日以降、mPaaS はベースライン 10.1.32 のサポートを停止しました。10.1.68 または 10.1.60 を代わりに使用してください。ベースラインをバージョン 10.1.32 から 10.1.68 または 10.1.60 にアップグレードする方法については、「mPaaS 10.1.68 アップグレードガイド」または「mPaaS 10.1.60 アップグレードガイド」をご参照ください。

前提条件

プロジェクトを mPaaS に統合済みであること。詳細については、「ネイティブフレームワークに基づいて、Cocoapods を使用した統合」をご参照ください。

手順

MPS を使用するには、次の手順を実行する必要があります。

  1. CocoaPods プラグインを使用して、MPS SDK を追加します。

    1. Podfile ファイルで、mPaaS_pod "mPaaS_Push" を使用して依存関係を追加します。

    2. pod install を実行して、SDK の統合を完了します。

  2. プロジェクトを構成します。

    プロジェクトの TARGETS ディレクトリで、次の関数を有効にします。

    • 機能 > プッシュ通知push-ca

    • 機能 > バックグラウンドモード > リモート通知push-back

  3. SDK を使用します。CocoaPods を使用して既存のプロジェクトに基づいて iOS クライアントにアクセスする場合、次の操作を実行する必要があります。

    1. (オプション) デバイストークンを登録します。

      メッセージプッシュ SDK は、アプリケーションの起動時に deviceToken の登録を自動的にリクエストします。通常、deviceToken の登録をリクエストする必要はありません。ただし、特別な場合 (起動時にプライバシー制御がある場合、すべてのネットワークリクエストがブロックされている場合など) には、制御と承認後に deviceToken の登録を再度トリガーする必要があります。サンプルコードは次のとおりです。

      - (void)registerRemoteNotification
      {
          // プッシュ通知の登録
          if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {// 10.0 以降
              UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
              center.delegate = self;
              [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
      
                      [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionSound|UNAuthorizationOptionBadge)
                                            completionHandler:^(BOOL granted, NSError * _Nullable error) {
                          // 承認に基づいて機能を有効または無効にします。
                          if (granted) {
                              dispatch_async(dispatch_get_main_queue(), ^{
                                  [[UIApplication sharedApplication] registerForRemoteNotifications];
                              });
                          }
                      }];
      
              }];
          } else {// 8.0,9.0
              UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge                                                                                         |UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
              [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
              [[UIApplication sharedApplication] registerForRemoteNotifications];
          }
      }
    2. デバイストークンを取得し、ユーザー ID にバインドします。

      mPaaS によって提供されるメッセージプッシュ SDK は、APNs サーバーへの登録ロジックをカプセル化しています。プログラムの起動後、プッシュ SDK は APNs サーバーに自動的に登録します。登録が成功したコールバックメソッドで APNs によって発行された deviceToken を取得し、次に PushService のインターフェースメソッドを呼び出して、バインドされた userId をモバイルプッシュコアに報告できます。

      // import <PushService/PushService.h>
      - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
      {
          [[PushService sharedService] setDeviceToken:deviceToken];
          [[PushService sharedService] pushBindWithUserId:@"your userid(置き換える)" completion:^(NSException *error) {
          }];
      
      }

      プッシュ SDK は、アプリのユーザー ID からデバイストークンのバインドを解除するための API - (void)pushUnBindWithUserId:(NSString *)userId completion:(void (^)(NSException *error))completion; も提供しています。たとえば、ユーザーが別のアカウントに切り替えた後に、バインド解除 API を呼び出すことができます。

    3. プッシュメッセージを受信します。

      クライアントがプッシュされたメッセージを受信した後、ユーザーがクリックして表示すると、システムは対応するアプリケーションを起動します。プッシュメッセージを受信した後のロジック処理は、AppDelegate のコールバックメソッドで行うことができます。

      • iOS 10 より前のシステムバージョンでは、通知バーメッセージまたはサイレントメッセージを処理するメソッドは次のとおりです。

         // iOS 10 より前のシステムバージョンでのプッシュメッセージのコールドスタート
          - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
          NSDictionary *userInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
          if ([[[UIDevice currentDevice] systemVersion] doubleValue] < 10.0) {
          // iOS 10 より前のシステムバージョンでのプッシュメッセージのコールドスタート
          }
        
          return YES;
          }
        
          // アプリがフォアグラウンドで実行されている場合は、一般的なプッシュメッセージを処理するメソッドを採用します。アプリがバックグラウンドまたはフォアグラウンドで実行されている場合は、サイレントメッセージを処理するメソッドを採用します。アプリのバージョンが iOS 10 より前の場合は、通知バーメッセージを処理するメソッドを採用します。
          -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler 
          {
          // 受信したメッセージを処理します
          }
      • iOS 10 以降では、次のデリゲートメソッドを実装して、通知バーメッセージをリッスンする必要があります。

          // UNUserNotificationCenter デリゲートを登録します
          if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 10.0) {
                  UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
                  center.delegate = self;
            }
        
           // アプリがフォアグラウンドで実行されているときにリモートプッシュメッセージを受信します
          - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
          {
              NSDictionary *userInfo = notification.request.content.userInfo;
        
              if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
                  // アプリがフォアグラウンドで実行されているときにリモートプッシュメッセージを受信します
        
              } else {
                  // アプリがフォアグラウンドで実行されているときにローカルプッシュメッセージを受信します
        
              }
              completionHandler(UNNotificationPresentationOptionNone);
          }
        
          // アプリがバックグラウンドで実行されているか、コールドスタートモードを使用しているときにリモートプッシュメッセージを受信します
          - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler
          {
              NSDictionary *userInfo = response.notification.request.content.userInfo;
        
              if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
                  // アプリがバックグラウンドで実行されているか、コールドスタートモードを使用しているときにリモートプッシュメッセージを受信します
        
              } else {
                  // アプリがフォアグラウンドで実行されているときにローカルプッシュメッセージを受信します
        
              }
              completionHandler();
        
          }
    4. メッセージの開封率を計算します。

      クライアント側でメッセージの開封率をカウントするには、ユーザーがアプリメッセージを開いたときにメッセージ開封イベントを報告するために、PushService (バージョン 10.1.32 以上で使用可能) の pushOpenLogReport インターフェースを呼び出す必要があります。イベントが報告されると、mPaaS コンソールの [メッセージプッシュ] > [概要] ページでメッセージ開封率の統計情報を確認できます。

      /**
       * プッシュメッセージを報告するための API を有効にして、メッセージの開封率を計算できるようにします。
       * @param  userInfo メッセージの userInfo
       * @return
       */
      - (void)pushOpenLogReport:(NSDictionary *)userInfo;
  4. プッシュ証明書を構成します。

    mPaaS の MPS コンソールを介してメッセージをプッシュするには、コンソールで APNs プッシュ証明書を構成する必要があります。この証明書は、クライアントの署名と一致する必要があります。そうでない場合、クライアントはプッシュメッセージを受信できません。

    構成の詳細については、「iOS プッシュ証明書の構成」をご参照ください。

次の手順

  • mPaaS の MPS コンソールで APNs 証明書が構成されると、デバイス ディメンションのアプリケーションにメッセージをプッシュできます。MPS は Apple APNs を介してクライアントにメッセージをプッシュします。詳細については、「中国国外の Apple デバイスと Android デバイスのプッシュプロセス」をご参照ください。

  • ユーザー ID がレポートされ、サーバーがそれらをデバイス トークンにバインドすると、ユーザー ディメンションのアプリケーションにメッセージをプッシュできます。

コードサンプル

ここをクリック して、コードサンプルをダウンロードします。

Live Activity メッセージプッシュ

iOS バージョン 16.1 では、新しい機能である Live Activity が導入されました。この機能は、ロック画面にリアルタイムのアクティビティを表示できるため、ユーザーはロック画面からさまざまなアクティビティの進捗状況をリアルタイムで把握できます。メインプロジェクトでは、ActivityKit フレームワークを使用して、リアルタイムアクティビティを開始、更新、および終了できます。その中で、リアルタイムアクティビティの更新と終了は、リモートプッシュを使用して実現することもできます。ウィジェット拡張機能では、SwiftUI と WidgetKit を使用して、ライブアクティビティインターフェースを作成できます。その中で、ライブアクティビティのリモートプッシュ更新機能は .p12 証明書をサポートしていないため、ユーザーは .p8 証明書を構成する必要があります。

同じプロジェクトで複数のライブアクティビティを同時に開くことができ、異なるライブアクティビティには異なるトークンがあります。

アクセス クライアント

Live Activity をサポートするプロジェクトを構成する

  1. メインプロジェクトの Info.plist ファイルにキーと値のペアを追加します。キーは NSSupportsLiveActivities で、値は YES です。image

  2. 新しいウィジェット拡張機能を作成します。プロジェクトに既に存在する場合は、この手順をスキップできます。imageimage

コードによるアクセス クライアント

  1. モデルを作成します。

    メインプロジェクトコードで新しい swift ファイルを作成し、その中で ActivityAttributes と Activity.ContentState を定義します。次のコードはサンプルコードです。実際のビジネスに応じて記述してください。

    import SwiftUI
    import ActivityKit
    
    struct PizzaDeliveryAttributes: ActivityAttributes {
        public typealias PizzaDeliveryStatus = ContentState
      
        public struct ContentState: Codable, Hashable {
            var driverName: String
            var estimatedDeliveryTime: ClosedRange<Date>
            
            init(driverName: String, estimatedDeliveryTime: ClosedRange<Date>) {
                self.driverName = driverName
                self.estimatedDeliveryTime = estimatedDeliveryTime
            }
            init(from decoder: Decoder) throws {
                let container: KeyedDecodingContainer<PizzaDeliveryAttributes.ContentState.CodingKeys> = try decoder.container(keyedBy: PizzaDeliveryAttributes.ContentState.CodingKeys.self)
                self.driverName = try container.decode(String.self, forKey: PizzaDeliveryAttributes.ContentState.CodingKeys.driverName)
                if let deliveryTime = try? container.decode(TimeInterval.self, forKey: PizzaDeliveryAttributes.ContentState.CodingKeys.estimatedDeliveryTime) {
                    self.estimatedDeliveryTime = Date()...Date().addingTimeInterval(deliveryTime * 60)
                } else if let deliveryTime = try? container.decode(String.self, forKey: PizzaDeliveryAttributes.ContentState.CodingKeys.estimatedDeliveryTime) {
                    self.estimatedDeliveryTime = Date()...Date().addingTimeInterval(TimeInterval.init(deliveryTime)! * 60)
                } else {
                    self.estimatedDeliveryTime = try container.decode(ClosedRange<Date>.self, forKey: PizzaDeliveryAttributes.ContentState.CodingKeys.estimatedDeliveryTime)
                }
            }
        }
      
        var numberOfPizzas: Int
        var totalAmount: String
    }
    
    • メインプロジェクトターゲットとアクティビティの両方を選択する必要があります。

    • 受信したプッシュメッセージはシステムによって処理され、開発者がインターセプトすることはできません。

    • ContentState には、動的に更新できるデータが含まれています。Live Activity 通知をプッシュする場合、動的に更新されるパラメーター名と型は、ContentState で構成されているものと一致する必要があります。

    • 一部のデータを処理する必要がある場合は、ActivityAttributes.ContentStatedecoder メソッドをオーバーライドする必要があります。

  2. インターフェースを作成します。

    ウィジェット拡張機能でライブアクティブインターフェースを作成します。ウィジェットを作成し、Activity Configuration を返します。具体的な UI は、独自のビジネスに応じて記述してください。

    image

  3. WidgetBundle を使用します。

    ターゲットアプリがウィジェットとライブアクティビティの両方をサポートしている場合は、WidgetBundle を使用します。

    import WidgetKit
    import SwiftUI
    
    @main
    structIslandBundle: WidgetBundle {
    varbody: someWidget {
    Island()
    IslandLiveActivity()
    }
    }
  4. ライブアクティビティをオンにします。

    func startDeliveryPizza() {
        let pizzaDeliveryAttributes = PizzaDeliveryAttributes(numberOfPizzas: 1, totalAmount:"$99")
        let initialContentState = PizzaDeliveryAttributes.PizzaDeliveryStatus(driverName: "TIM", estimatedDeliveryTime: Date()...Date().addingTimeInterval(15 * 60))
        do {
            let deliveryActivity = try Activity<PizzaDeliveryAttributes>.request(
                attributes: pizzaDeliveryAttributes,
                contentState: initialContentState,
                pushType: .token)
        } catch (let error) {
            print("Error requesting pizza delivery Live Activity \(error.localizedDescription)")
        }
    }
  5. トークンを送信します。

    ライブアクティビティが正常にオンになると、システムによって返されたライブアクティビティのプッシュトークンは、pushTokenUpdates メソッドを介して取得されます。PushService の liveActivityBindWithActivityId:pushToken:filter:completion: メソッドを呼び出して送信します。トークンを送信する際には、ライブアクティビティの識別子も一緒に送信する必要があります。この識別子は、ライブアクティビティをプッシュするときに必要であり、サーバーはこの識別子に基づいてプッシュターゲットを確認します。このライブアクティビティの ID はカスタマイズしてください。異なるライブアクティビティには異なる ID があります (同じであれば、プッシュの問題が発生します)。同じライブアクティビティの場合、トークンが更新されたときに ID を変更しないでください。

    説明

    ActivityKit は swift 言語フレームワークであり、直接の OC 呼び出しをサポートしていません。フレームワーク API を使用する場合、swift ファイルで呼び出してください。MPPushSDK は OC 言語であるため、swift が OC を呼び出す場合、ブリッジファイルを作成する必要があります。また、ブリッジファイルに #import <MPPushSDK/MPPushSDK.h> をインポートします。

    let liveactivityId = UserDefaults.standard.string(forKey: "pushTokenUpdates_id") ?? "defloutliveactivityId"
    Task {
        for await tokenData in deliveryActivity.pushTokenUpdates {
            let newToken = tokenData.map { String(format: "%02x", $0) }.joined()       
            PushService.shared().liveActivityBind(withActivityId: liveactivityId, pushToken: newToken, filter: .call) { excpt in
                guard let excpt = excpt else {
                    ///送信に成功しました
                    return
                }
                if "callRepeat" == excpt.reason {
                    ///繰り返し呼び出しのため、無視してください
                    print("pushTokenUpdates_id-繰り返し呼び出し")
                } else {
                    ///送信に失敗しました
                }
            }
        }
    }

    送信に成功すると、ライブアクティビティの識別を使用して更新をプッシュできます。

    説明

    iPhone の pushTokenUpdates は同時に 2 回呼び出されるため、つまり、複数のライブアクティビティのシナリオでは、新しいライブアクティビティが作成されるときに以前のライブアクティビティ pushTokenUpdates が再起動されるため、SDK はパラメーター filter によって制御されるフィルタリング機能を提供します。

    • filter が MPPushServiceLiveActivityFilterAbandon の場合、SDK はコールバックを行わずに繰り返しの呼び出しを自動的に破棄します。

    • filter が MPPushServiceLiveActivityFilterCall の場合、SDK はこのリクエストを自動的にフィルタリングし、失敗のコールバック (callRepeat) を行います。このとき、error.reason@"callRepeat" です。無視してください。

    • filter が MPPushServiceLiveActivityFilterReRefuse の場合、SDK 内でフィルタリングは行われません。同じ activityId と pushToken が繰り返し呼び出された場合、送信に失敗した場合、クライアントの再送信は同じ呼び出しとは見なされません。

    MPPushServiceLiveActivityFilterType の定義は次のとおりです。

    typedef NS_ENUM(NSInteger, MPPushServiceLiveActivityFilterType){
        MPPushServiceLiveActivityFilterAbandon,//コールバックを行わずに直接破棄します
        MPPushServiceLiveActivityFilterCall,//このリクエストをフィルタリングし、失敗のコールバック (callRepeat) を行います
        MPPushServiceLiveActivityFilterRefuse//フィルタリングを行いません
    };