1つのAndroidデバイスからFirebaseデータベースに接続されている別のデバイスにアップストリーム通知メッセージをFCM経由で送信する方法はありますか。
XMPPサーバーがアップストリームメッセージを受信し、他のデバイスに通知を送信できることを知っています。アップストリームAPIで送信されたメッセージを受信するには、XMPPサーバーを実装する必要がありますが、他の方法があります。
何度も試してみて、ようやく1つのソリューションとその機能を完全に手に入れました
ステップ1:2つのライブラリを含める
compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'com.google.firebase:firebase-messaging:9.2.0'
ステップ2:MainActivityまたは通知を送信する場所から
OkHttpClient mClient = new OkHttpClient();
String refreshedToken = "";//add your user refresh tokens who are logged in with firebase.
JSONArray jsonArray = new JSONArray();
jsonArray.put(refreshedToken);
ステップ3:すべてのデバイスに通知を送信する1つの非同期タスクを作成します。
public void sendMessage(final JSONArray recipients, final String title, final String body, final String icon, final String message) {
new AsyncTask<String, String, String>() {
@Override
protected String doInBackground(String... params) {
try {
JSONObject root = new JSONObject();
JSONObject notification = new JSONObject();
notification.put("body", body);
notification.put("title", title);
notification.put("icon", icon);
JSONObject data = new JSONObject();
data.put("message", message);
root.put("notification", notification);
root.put("data", data);
root.put("registration_ids", recipients);
String result = postToFCM(root.toString());
Log.d("Main Activity", "Result: " + result);
return result;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
try {
JSONObject resultJson = new JSONObject(result);
int success, failure;
success = resultJson.getInt("success");
failure = resultJson.getInt("failure");
Toast.makeText(MainActivity.this, "Message Success: " + success + "Message Failed: " + failure, Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "Message Failed, Unknown error occurred.", Toast.LENGTH_LONG).show();
}
}
}.execute();
}
String postToFCM(String bodyString) throws IOException {
public static final String FCM_MESSAGE_URL = "https://fcm.googleapis.com/fcm/send";
final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, bodyString);
Request request = new Request.Builder()
.url(Url.FCM_MESSAGE_URL)
.post(body)
.addHeader("Authorization", "key=" + "your server key")
.build();
Response response = mClient.newCall(request).execute();
return response.body().string();
}
ステップ4:ボタンのonclickを呼び出す
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage(jsonArray,"Hello","How r u","Http:\\google.com","My Name is Vishal");
}
});
1つのAndroidデバイスからFirebaseデータベースに接続された別のデバイスにFCMを介してアップストリーム通知メッセージを送信する方法はありますか?
現在、あるデバイスから別のデバイスにメッセージを直接送信することはできません。
(または、少なくとも、巨大なセキュリティ脆弱性を導入しないと不可能です:詳細は以下)
完全な詳細:
SERVER-API-KEY
を必要とする理由です。SERVER-API-KEY
を追加する(または他の方法でアプリに通信する)は安全ではありません。これは、apkの抽出、逆コンパイル、検査、エミュレーターでの実行、デバッグでの実行などが可能なためです。今日これを実装する最良の方法:は2つのデバイスの間に何らかのサーバーを置くことです:
[DeviceA] -- please send message to B --> [SERVER] -- fcmSendAPI --> [DeviceB]
サーバーは、PHPページ、またはより複雑なXMPP実装のようにシンプルにすることができます。
Node.jsの例は次の場所にあります。
Firebase DatabaseとCloud Messagingを備えたデバイス間で通知を送信
最後に、信頼できるサーバースクリプトを自分で2か月間維持しようとして、突然 OneSignal を見つけました。完全に無料で、iOS、Android、WPおよびブラウザでのデバイス間プッシュメッセージをサポートしています。
希望、プロモーションスパムのフラグは表示されませんが、 しかし、これは現在、完全に「バックエンドレス」になる唯一の(そして最も簡単な)方法です。
また、完全に安全な方法です。ルールで保護されたFirebase Databaseに保存できる特別なOSユーザーIDを知らない限り、誰もプッシュを送信できません。
UPD:Firebaseに代わるものではありません。プッシュサービスのみがあり、他には何もありません
UPD2:Firebaseに関数が追加され、その使用例に送信FCMが含まれています。これで、他のサーバーやサービスは必要ありません。公式のサンプルで詳細をご覧ください https://github.com/firebase/functions-samples