Programing

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

lottogame 2020. 11. 25. 07:30
반응형

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


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

나는 이것에 대해 약간 혼란 스럽습니다 ... 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은 문자열이 아닌 정수입니다 (예 : 아포스트로피 없음).


    **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 페이로드의 배지 키를 사용하고 있습니다. 알림에 대한 자세한 설명은 설명서를 참조하십시오.

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


실제로 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
}

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

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

Every time your application receive notification your service extension will be called.Save that value in user default and display it. To share user defaults between application and extension you need to enable app group in application. Read more here


Since iOS 10 you can develop a Notification Service extension for your app. It will be started by the system when you receive a notification and you can calculate a valid number for the badge and set it.

Take a look at the documentation: https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension


-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    application.applicationIconBadgeNumber = 0;
    NSLog(@"userInfo %@",userInfo);

    for (id key in userInfo) {
        NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
    }

    [application setApplicationIconBadgeNumber:[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]];
    NSLog(@"Badge %d",[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue]);
}

As @rckoenes said you will have to do the calculation server side, but how could you know when to increment the badge number value you should send in payload?.

Will when you launch the application send a message to your server indicating that the application is have been launched. So, on the server side you start again from badge=0, and while there is no messages received by server increase the badge number with every push notification payload.


in apns payload have to define "content-available":1 for update badge count in background mode

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


// increase badge count, but no need if you include content-available

application.applicationIconBadgeNumber = application.applicationIconBadgeNumber + 1

}

func applicationDidBecomeActive(_ application: UIApplication) {

// reset badge count

application.applicationIconBadgeNumber = 0

}

for eg.

"aps":{
    "alert":"Test",
    "sound":"default",
    "content-available":1

}

After receiving remote Notification when you open App,

get current Badge number in "didBecomeActive" Method of your AppDelegate.

File using below code:

int badgeCount = [UIApplication sharedApplication].applicationIconBadgeNumber;
    badgeCount = badgeCount + 1;

참고URL : https://stackoverflow.com/questions/14256643/update-badge-with-push-notification-while-app-in-background

반응형