Android FCMを始めてみる① 一番簡単なNotification Composerでのメッセージ送信を実装してみる
上記の続きで、今度はみんなやりたい!単体のスマホに個別にメッセージを送る編です。サンプルコードも載せておきます。
とっても簡単ですが!落とし穴もいくつかあったので、書いておきます。
前回作ったAndroidアプリに、Tokenを取得するサービスを追加します。
MyFirebaseInstanceIDService.java
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d("MyFirebaseInstanceIDS", "Refreshed token: " + refreshedToken); } }
メッセージを受け取ったら、Logに表示するサービスも追加します。
MyFcmService.java
public class MyFcmService extends FirebaseMessagingService { private static final String TAG = "MyFcmService"; /** * Called when message is received. * * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. */ // [START receive_message] @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher. //scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } } /** * Handle time allotted to BroadcastReceivers. */ private void handleNow() { Log.d(TAG, "Short lived task is done."); } }
この2つのサービスを、忘れないように、AndroidManifest.xmlに記載します。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="smart.location.admin.fcmdemo"> <application android: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"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyFcmService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> </application> </manifest>
これでアプリはOKです。
MyFirebaseInstanceIDService 内の onTokenRefresh() で、FCM用のトークンが取得できるのですが、罠1がこれです。
「うーん。全然、onTokenRefresh() 呼ばれないな~(´・ω・)」
と思っていたら、これはアプリのインストール時にしか走らないらしい!!
面倒ですが、一度アプリをアンインストールしてから、インストールして、onTokenRefresh() が呼ばれるのを確認しましょう。
えー、無事、トークンがLogCatで確認できたら、それはどっかにメモっておきます。
次はサーバーサイドを実装します。
これも、とっても簡単!!⊂(^-^)⊃
私はPHPで実装します。
function sendFCM($mess,$id) { $url = 'https://fcm.googleapis.com/fcm/send'; $fields = array ( 'to' => $id, 'notification' => array ( "body" => $mess, "title" => "Title", "icon" => "myicon" ) ); $fields = json_encode ( $fields ); $headers = array ( 'Authorization: key=' . "AAAAJI69Yqs:APA91bFA***", 'Content-Type: application/json' ); $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $url ); curl_setopt ( $ch, CURLOPT_POST, true ); curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields ); $result = curl_exec ( $ch ); var_dump($result); if ($result === FALSE) { die('Oops! FCM Send Error: ' . curl_error($ch)); } curl_close ( $ch ); } //2個目の変数は、さきほどAndroidアプリで取得したトークンです。 sendFCM("こんにちは!世界さん","f2aEszM_9qE:APA91bHNy5XZfyVoVOV**********");
落とし穴その2 !!!
‘Authorization: key=’ . “AAAAJI69Yqs:APA91bFA***”,
のところには、APIキーを入れますが、Firebaseのコントロールパネルにある、「設定」→「全般」で表示される、「ウェブ API キー」ではありません!!!
「設定」→「クラウド メッセージング」で表示されている、「
」が、ここに入るべきAPIキーです。APIキーが正しくないと、401 unauthorized error が帰ってきます。(>_<)
落とし穴その3。
ま、これは落とし穴というほどでもないですが、SSL証明書があるサーバーじゃないと
SSL certificate problem: unable to get local issuer certificate
ってエラーになって送信できません。
気軽にローカルとかから試せないのは残念ですね。
さてさて、上記の落とし穴を潜り抜けて、先程のfcm_test.phpを実行すると、アプリにメッセージが届きます!
これ、このコードだと、アプリが前面にある場合は、LogCatに出力されます。
バックグラウンド時は、ノーティフィケーションに表示されます。