Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9707

Azure Notification Hubsを使ってXamarin.Android アプリにプッシュ通知を試す

$
0
0

はじめに

最近AZ-204を受験して合格しました。
普段仕事で使わない機能についてかなり問われたのですが、
そのなかでAzure Notification Hubsをしっかり使ってみたいなと思ったので試してみました。
Xamarin.Androidも今回初めて使用。

環境とか必要なもの

  • Visual Studio 2019
  • Azureのアカウント
  • Googleのアカウント

私の携帯がAndroidということと、macを持っていなかったので今回Androidを採用しました。

作ってみたもの

Xamarin.Android側のアプリの発行はしていないので、デバックでのみの確認ですが。。。
Azure Functionsのタイマートリガーを使って、毎週火曜日の7:25に
もうすぐモルカーが始まるプッシュ通知を送信。
image.png

つくりかた

公式のチュートリアルを基本的に参考にして作ったのですが、うまくいかないところがあり、
こちらのサイトAzure Notification HubsでXamarin.FormsアプリにPush通知 メモ (Android編)を真似て作ったらうまくいきました。

Firebase プロジェクトを作成

Googleのアカウントを持っていれば無料で作れました。
作成方法はMSの公式チュートリアル通りです。

Azureポータルから通知ハブの作成

こちらもMSの公式チュートリアル通りに作成しました。

Xamarin.Android アプリを作成し、通知ハブに接続

Visual Studio プロジェクトを作成し、NuGet パッケージを追加する、Google Services JSON ファイルを追加するという部分までは、MSの公式チュートリアル通りに作成しました。

その先のソースコードはAzure Notification HubsでXamarin.FormsアプリにPush通知 メモ (Android編)を参考にして作成しています。

Firebase Cloud Messaging の登録

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"android:versionCode="1"android:versionName="1.0"package="Google Firebase ConsoleでプロジェクトにFirebase Cloud Messagingを追加するときに入力したパッケージ名"><uses-sdkandroid:minSdkVersion="21"android:targetSdkVersion="29"/><uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="com.google.android.c2dm.permission.RECEIVE"/><uses-permissionandroid:name="android.permission.WAKE_LOCK"/><uses-permissionandroid:name="android.permission.GET_ACCOUNTS"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"></application><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/></manifest>

定数値を定義

Constants.csクラスを作成し、定数値を定義します。

Constants.cs
publicstaticclassConstants{publicconststringListenConnectionString="Azureで作成したNotification Hub内のAccess Policiesの名前(DefaultListenSharedAccessSignature)";publicconststringNotificationHubName="Azureで作成したNotification Hubの名前";}

MainActivity.csの編集

MainActivity.cs
[Activity(Label="@string/app_name",Theme="@style/AppTheme",MainLauncher=true)]publicclassMainActivity:AppCompatActivity{publicconststringTAG="MainActivity";internalstaticreadonlystringCHANNEL_ID="my_notification_channel";protectedoverridevoidOnCreate(BundlesavedInstanceState){base.OnCreate(savedInstanceState);if(Intent.Extras!=null){foreach(varkeyinIntent.Extras.KeySet()){if(key!=null){varvalue=Intent.Extras.GetString(key);Log.Debug(TAG,"Key: {0} Value: {1}",key,value);}}}IsPlayServicesAvailable();CreateNotificationChannel();}publicoverridevoidOnRequestPermissionsResult(intrequestCode,string[]permissions,[GeneratedEnum]Android.Content.PM.Permission[]grantResults){Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode,permissions,grantResults);base.OnRequestPermissionsResult(requestCode,permissions,grantResults);}publicboolIsPlayServicesAvailable(){intresultCode=GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this);if(resultCode!=ConnectionResult.Success){if(GoogleApiAvailability.Instance.IsUserResolvableError(resultCode))Log.Debug(TAG,GoogleApiAvailability.Instance.GetErrorString(resultCode));else{Log.Debug(TAG,"This device is not supported");Finish();}returnfalse;}Log.Debug(TAG,"Google Play Services is available.");returntrue;}privatevoidCreateNotificationChannel(){if(Build.VERSION.SdkInt<BuildVersionCodes.O){// Notification channels are new in API 26 (and not a part of the// support library). There is no need to create a notification// channel on older versions of Android.return;}varchannelName=CHANNEL_ID;varchannelDescription=string.Empty;varchannel=newNotificationChannel(CHANNEL_ID,channelName,NotificationImportance.Default){Description=channelDescription};varnotificationManager=(NotificationManager)GetSystemService(NotificationService);notificationManager.CreateNotificationChannel(channel);}}

MyFirebaseMessagingService.csの追加

ここでは受信したメッセージの処理をしています。
SetContentTitleのところを変えてあげれば、push通知時のタイトルが変えられますね。

MyFirebaseMessagingService.cs
[Service][IntentFilter(new[]{"com.google.firebase.MESSAGING_EVENT"})][IntentFilter(new[]{"com.google.firebase.INSTANCE_ID_EVENT"})]publicclassMyFirebaseMessagingService:FirebaseMessagingService{conststringTAG="MyFirebaseMsgService";NotificationHubhub;publicoverridevoidOnMessageReceived(RemoteMessagemessage){Log.Debug(TAG,"From: "+message.From);if(message.GetNotification()!=null){//These is how most messages will be receivedLog.Debug(TAG,"Notification Message Body: "+message.GetNotification().Body);SendNotification(message.GetNotification().Body);}else{//Only used for debugging payloads sent from the Azure portalSendNotification(message.Data.Values.First());}}voidSendNotification(stringmessageBody){varintent=newIntent(this,typeof(MainActivity));intent.AddFlags(ActivityFlags.ClearTop);varpendingIntent=PendingIntent.GetActivity(this,0,intent,PendingIntentFlags.OneShot);varnotificationBuilder=newNotificationCompat.Builder(this,MainActivity.CHANNEL_ID);notificationBuilder.SetContentTitle("FCM Message").SetSmallIcon(Resource.Drawable.ic_launcher).SetContentText(messageBody).SetAutoCancel(true).SetShowWhen(false).SetContentIntent(pendingIntent);varnotificationManager=NotificationManager.FromContext(this);notificationManager.Notify(0,notificationBuilder.Build());}publicoverridevoidOnNewToken(stringtoken){Log.Debug(TAG,"FCM token: "+token);SendRegistrationToServer(token);}voidSendRegistrationToServer(stringtoken){// Register with Notification Hubshub=newNotificationHub(Constants.NotificationHubName,Constants.ListenConnectionString,this);vartags=newList<string>(){};varregID=hub.Register(token,tags.ToArray()).RegistrationId;Log.Debug(TAG,$"Successful registration of ID {regID}");}}

Azure Functionsのタイマートリガー作成

私はVisual Studioから作成したものをAzureで発行しました。
こちらの方の作成記事がわかりやすくていいかもです。

TestFunction.cs
[FunctionName("TestFunction")]publicstaticasyncTaskRun([TimerTrigger("0 25 7 * * 2")]TimerInfomyTimer,ILoggerlog){NotificationHubClient_hub=NotificationHubClient.CreateClientFromConnectionString("Azureで作成したNotification Hub内のAccess Policiesの名前(DefaultListenSharedAccessSignature)","Azureで作成したNotification Hubの名前");stringmessage="もうすぐモルカーの時間です。";varandroidMessage="{\"data\":{\"message\": \""+message+"\"}}";await_hub.SendFcmNativeNotificationAsync(androidMessage);}

本当はhubの情報は違うクラスに持っといたほうがいいですが、今回お試しだったので直書きしてます。

試してみる

AzureFunctionsからテストで動かしているので時間がおかしいですが。
image.png

すごく寂しい感じなので、画像とかも載せたいですね。

さいごに

Xamarinをよくわかってないのもあってか、公式のチュートリアル通りにやってもうまくいかず、???となったのですが、最初に紹介したサイトのおかげでうまく通知させることまでひとまずできました。
AZ-204とりあえず取ったはいいのですが、このテストで出てきた他の機能ももう少し見てみたいところです。

参考URL


Viewing all articles
Browse latest Browse all 9707

Trending Articles