Android FCMを始めてみる② 個別のスマホにサーバーからメッセージ送信するサンプルコード

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に出力されます。

バックグラウンド時は、ノーティフィケーションに表示されます。

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です