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に出力されます。
バックグラウンド時は、ノーティフィケーションに表示されます。

