programing

Firebase 자동 apns 알림

powerit 2023. 6. 7. 23:22
반응형

Firebase 자동 apns 알림

구글의 파이어베이스를 사용하여 사일런트 APNS를 보낼 수 있는 방법이 있습니까?앱이 백그라운드에 있으면 항상 사용자에게 알림을 표시하는 것 같습니다.

고마워요?

FCM 서버 API https://firebase.google.com/docs/cloud-messaging/http-server-ref 를 사용하여 자동 APNS 메시지를 보낼 수 있습니다.

특히 다음을 사용해야 합니다.

  • 데이터 필드:

이 매개 변수는 메시지 페이로드의 사용자 지정 키-값 쌍을 지정합니다.

예를 들어, 데이터를 사용하는 경우:{"score":"3x1"}:

iOS에서 메시지가 APNS를 통해 전송되면 사용자 지정 데이터 필드를 나타냅니다.FCM 연결 서버를 통해 전송되는 경우 AppDelegate 응용 프로그램:didReceiveRemoteNotification:에 키 값 사전으로 표시됩니다.

키는 예약된 단어("from" 또는 "gcm"로 시작하는 단어)가 아니어야 합니다.이 표에 정의된 단어(예: collapse_key)는 사용하지 마십시오.

문자열 형식의 값을 사용하는 것이 좋습니다.개체 또는 기타 문자열이 아닌 데이터 형식(예: 정수 또는 부울)의 값을 문자열로 변환해야 합니다.

  • content_available 필드:

iOS에서 이 필드를 사용하여 APNS 페이로드에서 사용 가능한 콘텐츠를 표시합니다.알림 또는 메시지가 전송되고 true로 설정되면 비활성 클라이언트 앱이 깨집니다.Android에서 데이터 메시지는 기본적으로 앱을 깨웁니다.Chrome에서는 현재 지원되지 않습니다.

전체 설명서: https://firebase.google.com/docs/cloud-messaging/http-server-ref#downstream-http-messages-json

FCM 서버를 사용하여 진정한 무음 통지(전경 및 배경 모두)를 수행하려면 다음 필드를 사용합니다.

"to" : "[token]",
"content_available": true,
"priority": "high",
"data" : {
  "key1" : "abc",
  "key2" : 123
}

참고: FCM과 함께 "content-available"이 아닌 "content_available"을 사용하고 있는지 확인합니다.APNS용으로 변환되어 있으며, 그렇지 않으면 제대로 수신되지 않습니다.그 차이 때문에 나는 한동안 발이 묶였습니다.

저는 이 주제를 제 블로그에서 더 자세히 설명합니다.http://blog.boxstory.com/2017/01/how-to-send-silent-push-notification-in.html

키포인트: "content_available:true"

이것은 샘플 JSON입니다.

{
    "to" : "<device>",
    "priority": "normal",
    "content_available": true, <-- this key is converted to 'content-available:1'
    "notification" : {
      "body" : "noti body",
      "title" : "noti title",
      "link": "noti link "
    }
}

참고: 위의 샘플 JSON이 전송되면 사용자에게 알림이 표시됩니다.사용자가 푸시 알림을 표시하지 않으려면 아래를 사용합니다.

{
  "to": "<device>",
  "priority": "normal",
  "content_available": true <-- this key is converted to 'content-available:1'
}

사용하지 않는 사용자용Legacy HTTP다른 답변에 나와 있는 것처럼 최신 정보를 사용합니다.v1 HTTP protocol저는 마침내 침묵의 알림을 보내는 올바른 방법을 알아냈습니다.

JS를 사용하는 firebase-admin:

    const message = {
      apns: {
        payload: {
          aps: {
            "content-available": 1,
            alert: ""
          }
        }
      },
      token: "[token here - note that you can also replace the token field with `topic` or `condition` depending on your targeting]"
    };

    admin
      .messaging()
      .send(message)
      .then(response => {
        // Response is a message ID string.
        console.log("Successfully sent message:", response);
      })
      .catch(error => {
        console.log("Error sending message:", error);
      });

설명:

  • 화물 적재량은 다음과 같습니다.apns"Firebase"에서 Firebase에 v1 HTTP protocol그래서 당신은 원본이 필요합니다."content-available": 1그것 때문에
  • alert: ""또한 필요합니다.▁something우▁not▁▁silent▁like▁if와 같은 것을 사용하여 자동 알림을 보내려고 할 때.Pusher당신은 오직 찾을 것입니다.content-available트리거할 수 없습니다. 대신다같추필추가드가와 합니다.sound또는alert성공할 수 있습니다.iOS 7에서 자동 푸시 알림이 작동하지 않습니다를 참조하십시오.파이어베이스는 빈 소리를 금지하므로 빈 경보를 사용할 수 있습니다.

다른 해결책들은 저에게 효과가 없었습니다.저는 iOS와 Android 모두에 데이터 메시지를 보내는 솔루션을 원했습니다.

테스트 결과 iOS 앱이 백그라운드에 있을 때 데이터 메시지를 안정적으로 보낼 수 있는 유일한 방법은 빈 알림 페이로드를 포함하는 것입니다.

답들도했듯이, 은 또한, 다답에언듯이급했합, 당은다포야니다함해을음신서변른다를 포함해야 .content_available그리고.priority.

컬 명령을 사용하여 테스트하려면 FCM 서버 키와 앱의 FCM 토큰이 필요합니다.

iOS 전용 샘플 curl 명령어(보이는 알림이 없는 신뢰할 수 있는 데이터 메시지)

curl -X POST \
  https://fcm.googleapis.com/fcm/send \
  -H 'authorization: key=server_key_here' \
  -H 'content-type: application/json' \
  -d '{
  "to": "fcm_token_here", 
  "priority": "high",
  "content_available": true,
  "notification": {
    "empty": "body"
  },
  "data": {
    "key1": "this_is_a_test",
    "key2": "abc",
    "key3": "123456",
  }
}'

를 바꿉니다.server_key_here그리고.fcm_token_here당신의 것으로 위에.

당신이 사용하는 방법다같다습니음 .AppDelegate앱이 백그라운드에 있고 UI 메시지가 표시되지 않을 때 클래스를 호출해야 합니다.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    //get data from userInfo

    completionHandler(UIBackgroundFetchResult.newData)
}

다음은 클라우드 기능을 사용하여 이 작업을 수행하고 주제로 보낼 스크립트를 입력하는 방법입니다.

const payload = {
    notification: {
        empty: "message"
    },
    data: {
        key1: "some_value",
        key2: "another_value",
        key3: "one_more"
    }
}

const options = {
    priority: "high",
    contentAvailable: true //wakes up iOS
}

return admin.messaging().sendToTopic("my_topic", payload, options)
    .then(response => {
        console.log(`Log some stuff`)
    })
    .catch(error => {
        console.log(error);
    });

위의 내용은 iOS에서 지속적으로 작동하며 때때로 Android에서도 작동하는 것으로 보입니다.가장 효과적으로 사용하려면 푸시 알림을 보내기 전에 백엔드에서 플랫폼을 결정해야 한다는 결론에 도달했습니다.

항목에 예약된 알림을 보내야 했습니다.위의 어떤 것도 나에게 효과가 없었지만, 나는 마침내 앱 대표자를 얻었습니다.application(application:didReceiveRemoteNotification:fetchCompletionHandler:)계속 호출됩니다.여기 제가 제 인생에서 하게 된 것에 대한 완벽한 예가 있습니다.index.js클라우드 함수 파일(필요한 참고)"apns-push-type": "background"그리고."apns-priority": "5"리글"content-available": 1의 내부 aps객체):

const admin = require("firebase-admin");
const functions = require("firebase-functions");

exports.sendBackgroundFetchNotification = functions.pubsub.schedule("every 1 hours").onRun((context) => {
  const message = {
    data: {},
    apns: {
      headers: {
        "apns-push-type": "background",
        "apns-priority": "5",
      },
      payload: {
        aps: {
          "content-available": 1,
          "alert": {},
        },
      },
    },
    topic: "[Topic_Name_Here]",
  };

  return admin
    .messaging()
    .send(message)
    .then(response => {
      // Response is a message ID string.
      console.log("Successfully sent message:", response);
      return null;
    })
    .catch(error => {
      console.log("Error sending message:", error);
      return null;
    });
});

일단 배포한 기능이 트리거될 때까지 기다리지 않으려면 Google 클라우드 콘솔 기능 섹션(https://console.cloud.google.com/functions/list) 으로 이동하여 기능 이름을 클릭한 다음 "테스트"를 클릭하고 마지막으로 "기능 테스트"를 클릭합니다.

이 코드는 애플의 사양을 기반으로 메시지 개체를 만들 수 있는 FCM의 새로운 HTTP v1 프로토콜을 사용한다는 점에 주목할 필요가 있습니다(아래 도움말 링크).

https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/generating_a_remote_notification

언급URL : https://stackoverflow.com/questions/37570200/firebase-silent-apns-notification

반응형