我正在使用Google Firebase发送推送通知。对于Android客户端,我仅发送数据(不发送通知),如果需要通知,则将其作为本地通知发送,并且工作正常。无论应用程序正在运行,被杀死还是在后台,数据都会到达。在IOS中,我使用Firebase配置了APN,但是我在后台数据和通知方面遇到了一些麻烦。下面的代码通过使用APN将背景数据发送到IOS客户端。 “ content_available”标志直接通知APN,但正如Firebase文档所述,不能保证APN会被交付。下面的链接对此进行了说明。
https://firebase.google.com/docs/cloud-messaging/http-server-ref
“在iOS上,使用此字段表示APNs负载中可用的内容。发送通知或消息并将其设置为true时,将唤醒不活动的客户端应用程序,并且该消息通过APN通过APN发送静默通知,而不是通过FCM连接服务器。请注意,不能保证APN中的静默通知会被传递,并且取决于用户打开低功耗模式,强制退出应用程序等因素。默认情况下唤醒应用程序。在Chrome上,当前不支持。”
如果我在注释行添加代码,则发送的APN始终会通知应用程序是处于前台,后台还是已终止。当然,如果应用程序在前台,我不希望推送通知。此外,如果用户未单击通知(单击应用程序图标),则不会触发代码。有什么办法可以将APNs用作Android上的Firebase?在Android中,无论应用是在前台,后台还是已终止,后台数据通知始终会成功发送到客户端。
private static String apiKey = "AIzaSy............";
public static void sendNotification(JSONObject jsonData, String token) {
try {
JSONObject jsonGCM = new JSONObject();
jsonGCM.put("to", token);
jsonGCM.put("data", jsonData);
jsonGCM.put("content_available", true);
//jsonGCM.put("priority", "high");
/*JSONObject jsonNotification = new JSONObject();
jsonNotification.put("title", "Some Title");
jsonNotification.put("body", "Some body.");
jsonGCM.put("notification", jsonNotification);*/
URL url = new URL(
//"https://gcm-http.googleapis.com/gcm/send");
"https://fcm.googleapis.com/fcm/send");
HttpsURLConnection conn = (HttpsURLConnection) url
.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Content-Type",
"application/json; charset=UTF-8");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "key="
+ apiKey);
OutputStream os = conn.getOutputStream();
os.write(jsonGCM.toString().getBytes("UTF-8"));
os.flush();
InputStream in = new BufferedInputStream(
conn.getInputStream());
System.out.println("Response code -->"
+ conn.getResponseCode());
os.close();
}
catch (Exception e) {
// TODO: handle exception
}
}