[ios] 앱이 백그라운드에있는 동안 푸시 알림으로 배지 업데이트

푸시 알림이 작동하고 앱이 포 그라운드로 전환 될 때 아이콘 배지 수를 업데이트했습니다.

나는 이것에 대해 약간 혼란 스럽습니다 … iPhone이 알림을 받고 팝업 메시지가 내 앱을 활성화하는 것처럼 보이며 배지는 앱을 시작한 후에 만 ​​업데이트됩니다.

이것은 사용자 경험 측면에서 옳지 않은 것 같습니다. 내 이해는 배지 카운트는 증가 된 카운트를 통해 사용자에게 조치가 필요한 사항을 알려야한다는 것입니다. 그러나 이는 앱이 라이브 상태 인 이후 단계까지 발생하지 않습니다.

그렇다면 앱이 푸시 알림을 수신하고 백그라운드에있을 때 배지 수를 업데이트하도록 지시하는 방법이 있습니까?

내 앱은 위치를 사용하지 않으며 UIRemoteNotificationTypeBadge알림 등록 요청에 있습니다.

건배 AF



답변

푸시 알림은 앱이 아닌 iOS에서 처리되므로 푸시 알림 수신시 애플리케이션 배지를 변경할 수 없습니다.

그러나 푸시 알림의 페이로드에 배지 번호를 보낼 수 있지만 계산 서버 측에서 수행해야합니다.

로컬 및 푸시 알림 프로그래밍 가이드 , 특히 알림 페이로드를 읽어야 합니다.

페이로드는 다음과 같습니다.

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9
    }
}

이제 앱 애플리케이션 배지 아이콘에 9가 표시됩니다.


답변

푸시 알림 패키지 의 “badge” 매개 변수를 전송하여 백그라운드 상태에있을 때 배지 번호를 변경할 수 있습니다 . @rckoenes가 지적했듯이 JSON배지 의 매개 변수는 INTEGER 여야합니다 .

동일한 작업을 수행하는 샘플 PHP 코드

// Create the payload body
$body['aps'] = array(
        'alert' => $message,
        'badge' => 1,
        'sound' => 'default'
        );

badge => 1 여기서 1은 문자열이 아닌 정수입니다 (예 : 아포스트로피 없음).


답변

실제로 iOS 10에서는 원격 알림이 didReceiveRemoteNotificationAppDelegate에서 자동으로 Method를 호출 합니다.

백그라운드에서 배지 수를 업데이트하는 두 가지 방법이 있습니다.
현재 앱에서도이 작업을 수행했습니다. 알림 서비스 확장도 필요하지 않습니다.

첫 번째 방법 :

페이로드와 함께 APS 배지 키를 APN에 보냅니다.
그러면 배지 페이로드의 정수 값에 따라 배지 수가 업데이트됩니다. 전의:

// Payload for remote Notification to APN
{
    "aps": {
        "content-available": 1,
        "alert": "Hallo, this is a Test.",
        "badge": 2, // This is your Int which will appear as badge number,
        "sound": default
    }
}

두 번째 방법 :

application.applicationState가에있을 때 application.applicationState를 전환하고 배지 Count를 업데이트 할 수 있습니다 .background. 하지만 APN으로 전송할 때 알림 페이로드에 배지 키 매개 변수를 설정하지 않도록주의해야합니다.

// Payload to APN as silent push notification
{
    "aps": {
        "content-available": 1
    }
}

애플리케이션 상태에 따라 배지 업데이트를 처리합니다.

다음은 APN 페이로드에서 배지 키없이 배지 카운트 업데이트를위한 작업 코드입니다.

func application(_ application: UIApplication, didReceiveRemoteNotification
   userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("APN recieved")
    // print(userInfo)

    let state = application.applicationState
    switch state {

    case .inactive:
        print("Inactive")

    case .background:
        print("Background")
        // update badge count here
        application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1

    case .active:
        print("Active")

    }
}

배지 수 재설정 :

앱이 활성 상태로 돌아갈 때 배지 수를 재설정하는 것을 잊지 마십시오.

func applicationDidBecomeActive(_ application: UIApplication) {
    // reset badge count
    application.applicationIconBadgeNumber = 0
}


답변

    **This is the APNS payload get back from server.**

    {
        "aps" : {
            "alert" : "You got your emails.",
            "badge" : 9,
            "sound" : "bingbong.aiff"
        },
        "acme1" : "bar",
        "acme2" : 42
    }

키 뱃지의 값은 자동으로 뱃지 개수로 간주되며 iOS 앱 측에서는 개수를 계산하거나 처리 할 필요가 없습니다. 위의 예에서 9는 배지 개수이므로 앱 아이콘에 9가 표시됩니다.

참고 앱이 닫혀있는 동안에는 배지를 직접 처리 할 수 ​​없습니다. 따라서 우리는 APNS 페이로드의 배지 키를 사용하고 있습니다. 알림에 대한 자세한 설명은 문서를 참조하십시오.

직접 배지 수를 줄이려면 수를 줄이고 직접 업데이트하십시오.


답변

NotificationServiceExtension을 사용하는 경우 배지를 업데이트 할 수 있습니다.

var bestAttemptContent : UNMutableNotificationContent? // 
bestAttemptContent.badge = 0//any no you wanna display

애플리케이션이 알림을받을 때마다 서비스 확장이 호출됩니다. 해당 값을 사용자 기본값에 저장하고 표시합니다. 애플리케이션과 확장간에 사용자 기본값을 공유하려면 애플리케이션에서 앱 그룹을 활성화해야합니다.
여기에서 더 많은 것을 읽으십시오


답변

iOS 10부터 앱에 대한 알림 서비스 확장을 개발할 수 있습니다. 알림을 받으면 시스템에서 시작되며 배지에 대한 유효한 번호를 계산하고 설정할 수 있습니다.

https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension 문서를 살펴보십시오.


답변

Firebase 클라우드 메시징 (FCM)의 경우 다음과 같아야합니다.

{
  "to": "some_token",

  "notification": {
    "body": "this is a body",
    "title": "this is a title",
    "badge" : 1
  },

  "priority": "high",
}