应用终止后,Firebase推送通知和IOS APNs通知

时间:2019-03-08 09:53:52

标签: ios firebase apple-push-notifications firebase-cloud-messaging

我正在使用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
    }



}

0 个答案:

没有答案