ユーザのアクションを他のユーザにPush通知でお知らせしたい時ってありますよね。せっかく届いたPush通知をクリックしたらアプリのトップ画面って・・・少しがっかりさせちゃいますよねー。そんな時に利用したいのがこのDeepLinkです!
AndroidManufest.xml の編集
まずは、AndroidManufest.xml の編集をします。クリックした時に表示させたいActivityに下記の記述を追加
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="map" android:scheme="mobileapp" /> </intent-filter>
フラグメント使っているよという場合もあるでしょ。私もそうでした。試してみたけれどうまくいかなかったので、表示させたいフラグメントだけを呼び出すActivityを作ってあげることでうまくいきます
Push通知のコンテンツを編集
AWS SNS →FCM (Firebase Cloud Messaging)を使った例です。AWS SNSではアプリケーション名としてFCMでもGCMを指定します。GCMデータとして、"deepLink"のキーとバリューを設定します
"deepLink":"mobileapp://map"
この値はManufestに設定したschema://hostの形で記述します
snsClient = boto3.client('sns') snsClient.publish( TopicArn="arn:aws:sns:ap-northeast-1:xxxxxxxx:{Topic名}", MessageStructure='json', Message=json.dumps({"default":"message", "GCM":json.dumps({"data":{"custom_title":"hogehoge","custom_body":"hogehoge", "deepLink":"mobileapp://map"}}) }), MessageAttributes={"pinType": {"DataType": "Number", "StringValue": pin_type}} )
MessageAttributesはAWS SNSでフィルタリング機能を利用するためです。SNSについても今度書きますね
Push通知受信時のコードを編集
FCMを使っている例です。FirebaseMessagingService内で処理を行います
FirebaseMessagingServiceコードの要約public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Data Message"); Mapdata = remoteMessage.getData(); String customTitle = data.get("custom_title"); Log.d(TAG, "Data Message Title :"+ customTitle); String customBody = data.get("custom_body"); Log.d(TAG, "Data Message Body:" + customBody); String deepLink = data.get("deepLink"); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(deepLink)); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); Notification.Builder notificationBuilder = new Notification.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(customTitle) .setContentText(customBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); setChannel(manager, notificationBuilder); manager.notify(0,notificationBuilder.build()); } } }
開いたActivityにデータを渡したい場合もそのデータをintentに格納して渡します
intent.putExtra("key", value);
Activity側でintentから読み取ります
Integer val = getIntent().getIntExtra("key", defaultValue);