【问题标题】:sending fcm push notifications using retrofit library in android使用 android 中的改造库发送 fcm 推送通知
【发布时间】:2018-12-09 13:59:39
【问题描述】:

尝试使用 android 中的改造库发送 fcm 通知。我想向其他 android 设备显示带有标题和消息的通知。 这是用于推送通知的代码和示例文件。

使用改造调用发送推送通知的功能:

private void sendNotification(String deviceId,String sender,String message)
{
FirebaseApi apiService =   
FirebaseClient.getClient().create(FirebaseApi.class);
NotifyData notifydata = new NotifyData(sender,message);
Call<FirebaseMessage> call = apiService.sendMessage(new 
FirebaseMessage(deviceId, notifydata));
call.enqueue(new Callback<FirebaseMessage>() {

        @Override
        public void onResponse(Call<FirebaseMessage> call, 
Response<FirebaseMessage> response) {
        Log.e("Message Response","Send");
        }
        @Override
        public void onFailure(Call<FirebaseMessage> call, Throwable t) {
            Log.e("Message Response","Fail");
        }
    });
 }

FirebaseMessage 类:

public class FirebaseMessage {
String to;
NotifyData notification;

public FirebaseMessage(String to, NotifyData notification) {
    this.to = to;
    this.notification = notification;
}

}

NotifyData 类:

public class NotifyData {
String title;
String body;
public NotifyData(String title, String body ) {

this.title = title;
this.body = body;
}

}

FirebaseClient 类:

public class FirebaseClient {
public static Retrofit RETROFIT     = null;

public static Retrofit getClient(){
    if(RETROFIT==null){
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new LoggingInterceptor())
                .build();
        RETROFIT = new Retrofit.Builder()
                .baseUrl(StaticConfig.FIREBASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return RETROFIT;
}
}

FirebaseApi 类:

public interface FirebaseApi {
@Headers({"Authorization: key=Legacy Service Key",
        "Content-Type:application/json"})
@POST("fcm/send")
Call<FirebaseMessage> sendMessage(@Body FirebaseMessage message);
}

在 MyFirebaseMessagingService 类中:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
String title=remoteMessage.getData().get("title");
String body=remoteMessage.getData().get("body");
    sendNotification(title, body);
}

但它每次都显示空白通知,标题为空,正文为空。 如何正确通过 remoteMessage 检索我的 notifydata。

【问题讨论】:

  • 使用 FCM 发送消息需要您指定所谓的服务器密钥。顾名思义,此密钥应仅在您控制的环境中使用,这通常意味着它不应在 Android 设备上使用。在您的 Android 应用程序中包含此密钥意味着恶意用户可能(因此将)找到它,并可以使用它代表您向您的所有用户发送消息。要使用 FCM 安全地发送消息,您应该始终从受信任的环境(例如您控制的服务器或 Cloud Functions)发送它们。
  • Frank van Puffelen 你能给我一些示例代码如何实现 fcm 发送消息吗?
  • 有关示例,请参阅firebase.google.com/docs/functions/…。
  • 谢谢.. 我会处理的。

标签: android firebase push-notification firebase-cloud-messaging retrofit


【解决方案1】:

模块:应用程序依赖项

implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'

ApiClient

public class ApiClient {

    private static final String BASE_URL = "https://fcm.googleapis.com/";
    private static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

API接口

public interface ApiInterface {

    @Headers({"Authorization: key=" + ConstantKey.SERVER_KEY, "Content-Type:application/json"})
    @POST("fcm/send")
    Call<ResponseBody> sendNotification(@Body RootModel root);
}

根模型

public class RootModel {

    @SerializedName("to") //  "to" changed to token
    private String token;

    @SerializedName("notification")
    private NotificationModel notification;

    @SerializedName("data")
    private DataModel data;

    public RootModel(String token, NotificationModel notification, DataModel data) {
        this.token = token;
        this.notification = notification;
        this.data = data;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public NotificationModel getNotification() {
        return notification;
    }

    public void setNotification(NotificationModel notification) {
        this.notification = notification;
    }

    public DataModel getData() {
        return data;
    }

    public void setData(DataModel data) {
        this.data = data;
    }
}

通知模型

public class NotificationModel {

    private String title;
    private String body;

    public NotificationModel(String title, String body) {
        this.title = title;
        this.body = body;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

}

数据模型

public class DataModel {

    private String name;
    private String age;

    public DataModel(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

}

使用此方法发送通知

private void sendNotificationToUser(String token) {
    RootModel rootModel = new RootModel(token, new NotificationModel("Title", "Body"), new DataModel("Name", "30"));

    ApiInterface apiService =  ApiClient.getClient().create(ApiInterface.class);
    retrofit2.Call<ResponseBody> responseBodyCall = apiService.sendNotification(rootModel);

    responseBodyCall.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
            Log.d(TAG,"Successfully notification send by using retrofit.");
        }

        @Override
        public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {

        }
    });
}

【讨论】:

    【解决方案2】:

    哇,当我尝试来自@Mustofa Kamal 的回答时。我遇到了关于模型的问题,因为我得到了错误代码 400,这意味着使用 JSON 格式解析时出错。所以,我使用 JsonObject 作为数据解析成这样的 json 格式

    JsonObject jNotif = new JsobObject()
    jNotif.addProperly("title","hello world");
    jNotif.addProperly("body","hello this world");
    
    JsonObject jFCM = new JsonObject()
    jFCM.add("notification",jNotif);
    jFCM.addProperly("to",<your_token_from_firebase>);
    

    我在这样的 ApiInterface 界面中使用:

    @Headers({"Content-Type: application/json","Authentication: <your_server_key>"})
    @POST("/fcm/send")
    Call<<your_model_response>> createFirebaseCloudM(@Body <your_model_class>);
    

    我在方法填充改造响应中包含该代码。我知道你如何处理改造的响应,它与上述答案相同。但是,发送数据时没有模型

    希望对你有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2022-08-22
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多