AWS モバイル
開発者ガイド

Amazon Pinpoint でモバイルアプリにプッシュ通知を追加する

概要

Amazon Pinpoint サービスを使用してメッセージングと分析機能を有効にすると、Mobile Hub はプッシュ通知バックエンドサービスをデプロイします。Amazon Pinpoint を使用すると、Apple (APN) および Google (FCM/GCM) プラットフォームから送信されたモバイルプッシュメッセージをアプリで受信できます。また、ユーザーの動作をプッシュ通知や他の形態のメッセージングと結びつけた Amazon Pinpoint キャンペーンを作成できます。

バックエンドのセットアップ

  1. 先に進む前に、「ご利用開始にあたって」のステップを完了する必要があります。

  2. [Messaging and Analytics] タイルを選択します。

  3. [Mobile push] を選択します。

    Android の場合 - Firebase/Google Cloud Messaging (FCM/GCM): [Android] を選択し、Firebase/Google アプリケーション API キーおよび送信者 ID を入力します。これらの値を取得または作成するには、「Android プッシュ通知のセットアップ」を参照してください。

    iOS の場合 - Apple Push Notification Service (APN): [iOS] を選択し、Apple app P12 証明書と、必要に応じて証明書のパスワードを入力します。これらの項目を取得または作成するには、「iOS プッシュ通知のセットアップ」を参照してください。

  4. オペレーションが完了すると、「バックエンドが更新されました」という警告がポップアップし、クラウド設定ファイルの最新のコピーをダウンロードするよう求められます。機能の設定が完了したら、バナーを選択してプロジェクトの詳細ページに戻ります。

  5. プロジェクトの詳細ページで、最新のクラウド設定ファイルで更新する必要があるすべてのアプリには、点滅する [Integrate] (統合) ボタンがあります。ウィザードの統合を入力するボタンを選択します。

  6. クラウド設定ファイルの最新のコピーでアプリを更新します。アプリはバックエンドの最新バージョンを参照するようになりました。[Next] (次へ) を選択し、以下のプッシュ通知ドキュメントに従い、バックエンドに接続します。

バックエンドに接続する

プッシュ通知をアプリに追加するには

Android - JavaAndroid - KotliniOS - Swift
Android - Java
  1. 次の「バックエンドのセットアップ」ステップを使用して、AWS Mobile SDK コンポーネントをセットアップします。

    1. AndroidManifest.xml には以下が含まれている必要があります。

      <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="com.mysampleapp.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.mysampleapp.permission.C2D_MESSAGE" /> <application <!--Add these to your Application declaration to filter for the notification intent--> <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.mysampleapp" /> </intent-filter> </receiver> <service android:name=".PushListenerService" android:exported="false" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </service> </application>
    2. 次のコードを app/build.gradle に追加します。

      dependencies{ implementation 'com.amazonaws:aws-android-sdk-pinpoint:2.6.+' implementation ('com.amazonaws:aws-android-sdk-auth-core:2.6.+@aar') {transitive = true;} implementation 'com.google.android.gms:play-services-iid:11.6.0' implementation 'com.google.android.gms:play-services-gcm:11.6.0' }
    3. プロジェクトレベル build.gradle に以下を追加します。

      buildscript { dependencies { classpath 'com.google.gms:google-services:3.1.1' } } allprojects { repositories { maven { url "https://maven.google.com" } } }
  2. プッシュ通知コードの場所に Amazon Pinpoint クライアントを作成します。

    import com.amazonaws.mobileconnectors.pinpoint.PinpointConfiguration; import com.amazonaws.mobileconnectors.pinpoint.PinpointManager; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.google.android.gms.iid.InstanceID; public class MainActivity extends AppCompatActivity { public static final String LOG_TAG = MainActivity.class.getSimpleName(); public static PinpointManager pinpointManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (pinpointManager == null) { PinpointConfiguration pinpointConfig = new PinpointConfiguration( getApplicationContext(), AWSMobileClient.getInstance().getCredentialsProvider(), AWSMobileClient.getInstance().getConfiguration()); pinpointManager = new PinpointManager(pinpointConfig); new Thread(new Runnable() { @Override public void run() { try { String deviceToken = InstanceID.getInstance(MainActivity.this).getToken( "123456789Your_GCM_Sender_Id", GoogleCloudMessaging.INSTANCE_ID_SCOPE); Log.e("NotError", deviceToken); pinpointManager.getNotificationClient() .registerGCMDeviceToken(deviceToken); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } }
Android - Kotlin
  1. 次の「バックエンドのセットアップ」ステップを使用して、AWS Mobile SDK コンポーネントをセットアップします。

    1. AndroidManifest.xml には以下が含まれている必要があります。

      <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="com.mysampleapp.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.mysampleapp.permission.C2D_MESSAGE" /> <application <!--Add these to your Application declaration to filter for the notification intent--> <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.mysampleapp" /> </intent-filter> </receiver> <service android:name=".PushListenerService" android:exported="false" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </service> </application>
    2. 次のコードを app/build.gradle に追加します。

      dependencies{ implementation 'com.amazonaws:aws-android-sdk-pinpoint:2.6.+' implementation ('com.amazonaws:aws-android-sdk-auth-core:2.6.+@aar') {transitive = true;} implementation 'com.google.android.gms:play-services-iid:11.6.0' implementation 'com.google.android.gms:play-services-gcm:11.6.0' }
    3. プロジェクトレベル build.gradle に以下を追加します。

      buildscript { dependencies { classpath 'com.google.gms:google-services:3.1.1' } } allprojects { repositories { maven { url "https://maven.google.com" } } }
  2. プッシュ通知コードの場所に Amazon Pinpoint クライアントを作成します。

    import com.amazonaws.mobileconnectors.pinpoint.PinpointConfiguration; import com.amazonaws.mobileconnectors.pinpoint.PinpointManager; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.google.android.gms.iid.InstanceID; class MainActivity : AppCompatActivity() { companion object { private val LOG_TAG = this::class.java.getSimpleName var pinpointManager: PinpointManager? = null } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) AWSMobileClient.getInstance().initialize(this).execute() with (AWSMobileClient.getInstance()) { if (pinpointManager == null) { val config = PinpointConfiguration(applicationContext, credentialsProvider, configuration) pinpointManager = PinpointManager(config) } } thread(start = true) { try { val deviceToken = InstanceID.getInstance(this@MainActivity) .getToken("YOUR-GCM-SENDER-ID", GoogleCloudMessaging.INSTANCE_ID_SCOPE) Log.i(LOG_TAG, "GCM DeviceToken = $deviceToken") pinpointManager?.notificationClient?.registerGCMDeviceToken(deviceToken) } catch (e: Exception) { e.printStackTrace() } } } }
iOS - Swift
  1. 次の「バックエンドのセットアップ」ステップを使用して、AWS Mobile SDK コンポーネントをセットアップします。

    1. AWS Mobile SDK をインストールするように設定する Podfile には、以下が含まれている必要があります。

      platform :ios, '9.0' target :'YOUR-APP-NAME' do use_frameworks! pod 'AWSPinpoint', '~> 2.6.13' # other pods end

      pod install --repo-update を実行してから続行します。

      [!] Failed to connect to GitHub to update the CocoaPods/Specs . . .」から始まるエラーメッセージが表示され、インターネットに接続中の場合は、openssl および Ruby を更新する必要がある場合があります。

    2. Amazon Pinpoint API を呼び出すクラスは次のインポートステートメントを使用する必要があります。

      import AWSCore import AWSPinpoint
  2. 次のコードをアプリの AppDelegate.swiftdidFinishLaunchwithOptions メソッドに使用して、Amazon Pinpoint クライアントを作成します。これにより、デバイストークンも Amazon Pinpoint に登録されます。

    var pinpoint: AWSPinpoint? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { pinpoint = AWSPinpoint(configuration: AWSPinpointConfiguration.defaultPinpointConfiguration(launchOptions: launchOptions)) return true }

Amazon Pinpoint のターゲットを絞ったキャンペーンメッセージングを追加する

Amazon Pinpoint コンソールを使用して、アプリユーザーを対象にプッシュメッセージを送信できます。個人宛てのメッセージを送信したり、定義したプロファイルに一致するユーザーのグループを対象にしたキャンペーンを設定したりできます。たとえば、アプリを 30 日以上使用していないユーザーに E メールを送信したり、アプリの特定の機能を頻繁に使用するユーザーに SMS を送信したりできます。

Android - JavaAndroid - KotliniOS - Swift
Android - Java

次の 2 ステップで、アプリを対象にしたプッシュ通知を受信する方法を示します。

  1. プッシュリスナーサービスをアプリに追加します。

    クラスの名前は、アプリのマニフェストで使用されているプッシュリスナーサービス名と一致している必要があります。pinpointManager は、前のステップで示された MainActivity で宣言された静的 PinpointManager 変数のリファレンスです。次のステップを使用して、アプリでリッスンするプッシュ通知をセットアップします。

    1. 次のプッシュリスナーコードは、アプリの MainActivity が前のセクションで説明されたマニフェストのセットアップを使用していることを前提としています。

      import android.content.Intent; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.amazonaws.mobileconnectors.pinpoint.targeting.notification.NotificationClient; import com.google.android.gms.gcm.GcmListenerService; public class YOUR-PUSH-LISTENER-SERVICE-NAME extends GcmListenerService { public static final String LOGTAG = PushListenerService.class.getSimpleName(); // Intent action used in local broadcast public static final String ACTION_PUSH_NOTIFICATION = "push-notification"; // Intent keys public static final String INTENT_SNS_NOTIFICATION_FROM = "from"; public static final String INTENT_SNS_NOTIFICATION_DATA = "data"; /** * Helper method to extract push message from bundle. * * @param data bundle * @return message string from push notification */ public static String getMessage(Bundle data) { // If a push notification is sent as plain // text, then the message appears in "default". // Otherwise it's in the "message" for JSON format. return data.containsKey("default") ? data.getString("default") : data.getString( "message", ""); } private void broadcast(final String from, final Bundle data) { Intent intent = new Intent(ACTION_PUSH_NOTIFICATION); intent.putExtra(INTENT_SNS_NOTIFICATION_FROM, from); intent.putExtra(INTENT_SNS_NOTIFICATION_DATA, data); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } @Override public void onMessageReceived(final String from, final Bundle data) { Log.d(LOGTAG, "From:" + from); Log.d(LOGTAG, "Data:" + data.toString()); final NotificationClient notificationClient = MainActivity.pinpointManager.getNotificationClient(); NotificationClient.CampaignPushResult pushResult = notificationClient.handleGCMCampaignPush(from, data, this.getClass()); if (!NotificationClient.CampaignPushResult.NOT_HANDLED.equals(pushResult)) { // The push message was due to a Pinpoint campaign. // If the app was in the background, a local notification was added // in the notification center. If the app was in the foreground, an // event was recorded indicating the app was in the foreground, // for the demo, we will broadcast the notification to let the main // activity display it in a dialog. if ( NotificationClient.CampaignPushResult.APP_IN_FOREGROUND.equals(pushResult)) { // Create a message that will display the raw //data of the campaign push in a dialog. data.putString(" message", String.format("Received Campaign Push:\n%s", data.toString())); broadcast(from, data); } return; } } }
    2. プッシュリスナーサービスに対応するコードを追加する.

      次のコードは、アプリが受信した通知に対応する場所に配置できます。

      import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { public static final String LOG_TAG = MainActivity.class.getSimpleName(); @Override protected void onPause() { super.onPause(); // unregister notification receiver LocalBroadcastManager.getInstance(this).unregisterReceiver(notificationReceiver); } @Override protected void onResume() { super.onResume(); // register notification receiver LocalBroadcastManager.getInstance(this).registerReceiver(notificationReceiver, new IntentFilter(PushListenerService.ACTION_PUSH_NOTIFICATION)); } private final BroadcastReceiver notificationReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(LOG_TAG, "Received notification from local broadcast. Display it in a dialog."); Bundle data = intent.getBundleExtra(PushListenerService.INTENT_SNS_NOTIFICATION_DATA); String message = PushListenerService.getMessage(data); new AlertDialog.Builder(MainActivity.this) .setTitle("Push notification") .setMessage(message) .setPositiveButton(android.R.string.ok, null) .show(); } }; }
Android - Kotlin

次の 2 ステップで、アプリを対象にしたプッシュ通知を受信する方法を示します。

  1. プッシュリスナーサービスをアプリに追加します。

    クラスの名前は、アプリのマニフェストで使用されているプッシュリスナーサービス名と一致している必要があります。pinpointManager は、前のステップで示された MainActivity で宣言された静的 PinpointManager 変数のリファレンスです。次のステップを使用して、アプリでリッスンするプッシュ通知をセットアップします。

    1. 次のプッシュリスナーコードは、アプリの MainActivity が前のセクションで説明されたマニフェストのセットアップを使用していることを前提としています。

      import android.content.Intent; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.amazonaws.mobileconnectors.pinpoint.targeting.notification.NotificationClient; import com.google.android.gms.gcm.GcmListenerService; class YOUR-PUSH-LISTENER-SERVICE-NAME : GcmListenerService() { companion object { private val LOG_TAG = this::class.java.simpleName const val ACTION_PUSH_NOTIFICATION: String = "push-notification" const val INTENT_SNS_NOTIFICATION_FROM: String = "from" const val INTENT_SNS_NOTIFICATION_DATA: String = "data" // Helper method to extract push message from bundle. fun getMessage(data: Bundle) = if (data.containsKey("default") data.getString("default") else data.getString("message", "") } private fun broadcast(from: String, data: Bundle) { val intent = Intent(ACTION_PUSH_NOTIFICATION).apply { putExtra(INTENT_SNS_NOTIFICATION_FROM, from) putExtra(INTENT_SNS_NOTIFICATION_DATA, data) } LocalBroadcastManager.getInstance(this).sendBroadcast(intent) } override fun onMessageReceived(from: String?, data: Bundle?) { Log.d(LOG_TAG, "From: $from") Log.d(LOG_TAG, "Data: $data") val notificationClient = MainActivity.pinpointManager!!.notificationClient!! val pushResult = notificationClient.handleGCMCampaignPush(from, data, this::class.java) if (pushResult != NotificationClient.CampaignPushResult.NOT_HANDLED) { // The push message was due to a Pinpoint campaign // If the app was in the background, a local notification was added // in the notification center. If the app was in the foreground, an // event was recorded indicating the app was in the foreground, // for the demo, we will broadcast the notification to let the main // activity display it in a dialog. if (pushResult == NotificationClient.CampaignPushResult.APP_IN_FOREGROUND) { data.putString("message", "Received Campaign Push:\n$data") broadcast(from, data) } return } } }
    2. プッシュリスナーサービスに対応するコードを追加する.

      次のコードは、アプリが受信した通知に対応する場所に配置できます。

      import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; class MainActivity : AppCompatActivity() { companion object { // ... val notificationReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Log.d(LOG_TAG, "Received notification from local broadcast.") val data = intent.getBundleExtra(PushListenerService.INTENT_SNS_NOTIFICATION_DATA) val message = PushListenerService.getMessage(data) // Uses anko library to display an alert dialog alert(message) { title = "Push notification" positiveButton("OK") { /* Do nothing */ } }.show() } } } override fun onPause() { super.onPause() LocalBroadcastManager.getInstance(this).unregisterReceiver(notificationReceiver) } override fun onResume() { super.onResume() LoadBroadcastManager.getInstance(this).registerReceiver(notificationReceiver, IntentFilter(PushListenerService.ACTION_PUSH_NOTIFICATION)) } // ... }
iOS - Swift
  1. PinpointManager を持つ AppDelegate がインスタンス化されている場合は、プッシュをリッスンするコードが以下の関数内に存在することを確認してください。

    // . . . func application( _ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { pinpoint!.notificationManager.interceptDidRegisterForRemoteNotifications( withDeviceToken: deviceToken) } func application( _ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { pinpoint!.notificationManager.interceptDidReceiveRemoteNotification( userInfo, fetchCompletionHandler: completionHandler) if (application.applicationState == .active) { let alert = UIAlertController(title: "Notification Received", message: userInfo.description, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil)) UIApplication.shared.keyWindow?.rootViewController?.present( alert, animated: true, completion:nil) } } // . . . }
  2. 次のコードを、通知のアクセス許可をリクエストする ViewController に追加します。

    var userNotificationTypes : UIUserNotificationType userNotificationTypes = [.alert , .badge , .sound] let notificationSettings = UIUserNotificationSettings.init(types: userNotificationTypes, categories: nil) UIApplication.shared.registerUserNotificationSettings(notificationSettings) UIApplication.shared.registerForRemoteNotifications()
  3. Xcode のプロジェクトナビゲーターでアプリターゲットを選択して [Capabilities] を選択し、[Push Notifications] をオンにします。

     Xcode でプッシュ通知機能をオンにする図。
  4. AWS Mobile Hub からサンプル iOS アプリを構築するの情報を使用してアプリを構築し実行します。