Push-уведомления Firebase и IOS APN, когда приложение убито - PullRequest
0 голосов
/ 08 марта 2019

Я использую Google Firebase для отправки push-уведомлений.Для клиента Android я отправляю только данные (не уведомление), а если требуется уведомление, отправляю их как локальное уведомление, и оно работает нормально.Данные поступают независимо от того, запущено ли приложение, убито или в фоновом режимеВ IOS я настроил APN с Firebase, но у меня есть некоторые проблемы с фоновыми данными и уведомлениями.Приведенный ниже код отправляет фоновые данные клиенту IOS с помощью APN.«content_available» помечает прямое уведомление APN, но, как упоминалось в документации Firebase, APN не гарантируется для доставки.Ссылка ниже объясняет это.

https://firebase.google.com/docs/cloud-messaging/http-server-ref

"В iOS используйте это поле для представления содержимого, доступного в полезной нагрузке APN. Когда отправляется уведомление или сообщение, и для него установлено значениеtrue, неактивное клиентское приложение пробуждается, и сообщение отправляется через APN в виде уведомления без вывода сообщений, а не через сервер соединений FCM. Обратите внимание, что уведомления без вывода сообщений в APN не гарантируются, и могут зависеть от таких факторов, как пользовательвключение режима низкого энергопотребления, принудительное завершение работы приложения и т. д. В Android сообщения данных по умолчанию запускают приложение. В Chrome в настоящее время не поддерживается. "

Если я добавляю коды в строках комментариев, отправляются APNвсегда уведомление, находится ли приложение на переднем плане, в фоне или убито.Конечно, я не хочу пуш-уведомления, если приложение находится на переднем плане.Кроме того, если пользователь не щелкает уведомление (щелкает значок приложения), код не срабатывает.Есть ли способ использовать APN в качестве Firebase на Android?В 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
    }



}
...