SNS を使用してプッシュ通知を受信する (Xamarin Android) - AWS Mobile SDK

AWSの Mobile SDK for Xamarin が、AWS SDK for .NETに含まれるようになりました。このガイドでは、Mobile SDK for Xamarin のアーカイブバージョンについて説明します。

SNS を使用してプッシュ通知を受信する (Xamarin Android)

このチュートリアルでは、Amazon Simple Notification Service (SNS) および AWS Mobile SDK for .NET and Xamarin を使用して、Xamarin Android アプリケーションにプッシュ通知を送信する方法について説明します。

プロジェクトのセットアップ

前提条件

このチュートリアルを開始する前に、必ず「AWS Mobile SDK for .NET and Xamarin をセットアップする」の手順をすべて完了する必要があります。

SNS のアクセス許可を設定

AWS Mobile SDK for .NET and Xamarin をセットアップするのステップ 2 に従って、以下のポリシーをアプリケーションのロールにアタッチします。これにより、SNS にアクセスするための適切な権限がアプリケーションに付与されます。

  1. IAM コンソールに移動し、設定する IAM ロールを選択します。

  2. [ポリシーのアタッチ] をクリック後、AmazonSNSFullAccess ポリシーを選択し、[ポリシーのアタッチ] をクリックします。

警告

AmazonSNSFullAccess を本番稼働用環境で使用することは推奨されていません。すばやく起動して実行できるように、こちらの環境を使用します。IAM ロールのアクセス許可を指定する方法については、「IAM ロールのアクセス許可の概要」を参照してください。

Google Cloud のプッシュ通知を有効にする

まず、新しい Google API プロジェクトを追加します。

  1. Google 開発者コンソールに移動します。

  2. [Create Project] をクリックします。

  3. [New Project] ボックスにプロジェクト名を入力し、プロジェクト ID をメモしたら (後で使用します)、[Create] をクリックします。

次に、プロジェクトの Google クラウド メッセージング (GCM) サービスを有効にします。

  1. Google 開発者コンソールで、新しいプロジェクトが既に選択されています。選択されていない場合は、ページ上部にあるドロップダウンでプロジェクトを選択します。

  2. ページ左側のサイドバーから [APIs & auth (API と Auth)] を選択します。

  3. 検索ボックスに「Android 用 Google クラウドメッセージング」と入力し、Google Cloud Messaging for Android リンクをクリックします。

  4. [Enable API (API を有効化)] をクリックします。

最後に、API キーを取得します。

  1. Google 開発者コンソールで、[APIs & auth (API と Auth)]>[Credentials (認証情報)] の順に選択します。

  2. [Public API access (パブリック API アクセス)] で、[Create new key (新しいキーを作成)] をクリックします。

  3. [Create a new key (新しいキーの作成)] ダイアログで、[Server key (サーバーキー)] をクリックします。

  4. 表示されたダイアログボックスで [Create (作成)] を選択し、表示された API キーをコピーします。この API キーは、後で認証を実行するために使用します。

SNS コンソールでプロジェクト ID を使用してプラットフォーム ARN を作成する

  1. SNS コンソールに移動します。

  2. 画面の左側にある [アプリケーション] をクリックします。

  3. [プラットフォームアプリケーションの作成] をクリックして、新しい SNS プラットフォームアプリケーションを作成します。

  4. アプリケーション名を入力します。

  5. [Push notification platform] で [Google Cloud Messaging (GCM)] を選択します。

  6. [API キー] と表示されているテキストボックスに API キーを貼り付けます。

  7. [プラットフォームアプリケーションの作成] をクリックします。

  8. 作成したプラットフォームアプリケーションを選択して、アプリケーション ARN をコピーします。

SNS の NuGet パッケージをプロジェクトに追加する

AWS Mobile SDK for .NET and Xamarin をセットアップする」のステップ 4 に従って、Amazon Simple Notification Service の NuGet パッケージをプロジェクトに追加します。

SNS クライアントを作成する

var snsClient = new AmazonSimpleNotificationServiceClient(credentials, region);

アプリケーションにリモート通知を登録する

Android にリモート通知を登録するには、BroadcastReceiver を作成する必要があります。これにより、Google クラウドメッセージを受信できるようになります。以下のパッケージ名を変更します。ここで、次のように表示されます。

[BroadcastReceiver(Permission = "com.google.android.c2dm.permission.SEND")] [IntentFilter(new string[] { "com.google.android.c2dm.intent.RECEIVE" }, Categories = new string[] { "com.amazonaws.sns" /* change to match your package */ })] [IntentFilter(new string[] { "com.google.android.c2dm.intent.REGISTRATION" }, Categories = new string[] { "com.amazonaws.sns" /* change to match your package */ })] [IntentFilter(new string[] { "com.google.android.gcm.intent.RETRY" }, Categories = new string[] { "com.amazonaws.sns" /* change to match your package */ })] public class GCMBroadcastReceiver: BroadcastReceiver { const string TAG = "PushHandlerBroadcastReceiver"; public override void OnReceive(Context context, Intent intent) { GCMIntentService.RunIntentInService(context, intent); SetResult(Result.Ok, null, null); } } [BroadcastReceiver] [IntentFilter(new[] { Android.Content.Intent.ActionBootCompleted })] public class GCMBootReceiver: BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { GCMIntentService.RunIntentInService(context, intent); SetResult(Result.Ok, null, null); } }

以下は、BroadcastReceiver よりプッシュ通知を受け取り、デバイスの通知バーに通知を表示するサービスです。

[Service] public class GCMIntentService: IntentService { static PowerManager.WakeLock sWakeLock; static object LOCK = new object(); public static void RunIntentInService(Context context, Intent intent) { lock(LOCK) { if (sWakeLock == null) { // This is called from BroadcastReceiver, there is no init. var pm = PowerManager.FromContext(context); sWakeLock = pm.NewWakeLock( WakeLockFlags.Partial, "My WakeLock Tag"); } } sWakeLock.Acquire(); intent.SetClass(context, typeof(GCMIntentService)); context.StartService(intent); } protected override void OnHandleIntent(Intent intent) { try { Context context = this.ApplicationContext; string action = intent.Action; if (action.Equals("com.google.android.c2dm.intent.REGISTRATION")) { HandleRegistration(intent); } else if (action.Equals("com.google.android.c2dm.intent.RECEIVE")) { HandleMessage(intent); } } finally { lock(LOCK) { //Sanity check for null as this is a public method if (sWakeLock != null) sWakeLock.Release(); } } } private void HandleRegistration(Intent intent) { string registrationId = intent.GetStringExtra("registration_id"); string error = intent.GetStringExtra("error"); string unregistration = intent.GetStringExtra("unregistered"); if (string.IsNullOrEmpty(error)) { var response = await SnsClient.CreatePlatformEndpointAsync(new CreatePlatformEndpointRequest { Token = registrationId, PlatformApplicationArn = "YourPlatformArn" /* insert your platform application ARN here */ }); } } private void HandleMessage(Intent intent) { string message = string.Empty; Bundle extras = intent.Extras; if (!string.IsNullOrEmpty(extras.GetString("message"))) { message = extras.GetString("message"); } else { message = extras.GetString("default"); } Log.Info("Messages", "message received = " + message); ShowNotification(this, "SNS Push", message); //show the message } public void ShowNotification(string contentTitle, string contentText) { // Intent Notification.Builder builder = new Notification.Builder(this) .SetContentTitle(contentTitle) .SetContentText(contentText) .SetDefaults(NotificationDefaults.Sound | NotificationDefaults.Vibrate) .SetSmallIcon(Resource.Drawable.Icon) .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification)); // Get the notification manager: NotificationManager notificationManager = this.GetSystemService(Context.NotificationService) as NotificationManager; notificationManager.Notify(1001, builder.Build()); } }

SNS コンソールからエンドポイントにメッセージを送信する

  1. [SNS コンソール] > [アプリケーション] の順に移動します。

  2. プラットフォームアプリケーションを選択し、エンドポイントを選択したら、[エンドポイントへの発行] をクリックします。

  3. テキストボックスにテキストメッセージを入力し、[メッセージの発行] をクリックしてメッセージを発行します。