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


82

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

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

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

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

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

건배 AF


앱 아이콘에 배지를 표시 하시겠습니까?
Aman Aggarwal 2013 년

탭 수를 표시하고 있습니다. 그리고 같은 문제에 직면하고 있습니다. 앱이 백그라운드에있을 때 카운트가 증가하지 않습니다. 어떻게 설정할 수 있습니까?
Srusti Thakkar

답변:


79

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

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

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

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

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

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


4
이미 그렇게하고 있지만이 값은 내 앱을 포 그라운드로 가져올 때만 검색되며 나중에 [UIApplication sharedApplication] .applicationIconBadgeNumber = count를 사용하여 배지 값을 업데이트하는 데 사용합니다.
Abolfoooud

7
푸시 알림 페이로드에서 배지 번호를 설정할 필요가 없습니다.
rckoenes 2013 년

11
내 페이로드 구조를 다시 보았고 배지 매개 변수의 값을 int 4가 아닌 문자열 '4'로 전달하는 것 같습니다 !!! 지금은 그것이 도움을 ... 감사 작업 있어요
Abolfoooud

페이로드 구조 배지를 변경할 때 작동하지 않는 것으로 테스트했습니다
wod

1
@wod 의미 : 페이로드 구조 배지 변경.
rckoenes 2013 년

11

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

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

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

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


11

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

앱이 백그라운드에서 실행되지 않는 경우 배지를 어떻게 업데이트합니까?
Nagendra Rao

1
콘텐츠 사용 가능 키와 함께 APS를 보내면 앱의 상태에 관계없이 didReceiveRemoteNotification 메서드가 실행됩니다. 기본 장치로 시도해보십시오. iOS를 사용하는 경우이 도구를 사용하여 JSON 개체를 APN으로 보낼 수 있습니다. github.com/noodlewerk/NWPusher
Gkiokan

와우, 좋습니다. 콘텐츠를 사용할 수없는 알림을 보내면 어떻게 되나요? (백그라운드가 아닌 알림에 관한 것입니다). didReceiveRemoteNotification호출되지 않습니다
StackExploded

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

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


4

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

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

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


해당 알림 수를 서버에 저장하고 알림과 함께 보낼 수 있습니다.
Surjeet Rajput

저는 Firebase 클라우드 메시징을 사용하고 있습니다. 어떻게 할 수 있는지 아십니까?
Ghiggz Pikkoro


1

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

{
  "to": "some_token",

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

  "priority": "high", 
}

0
-(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]);
}

NSInteger 인 integerValue 대신 intValue를 사용하는 이유는 무엇입니까? @property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
Alex Zavatone 2015 년

0

@rckoenes가 말했듯이 계산 서버 측을 수행해야하지만 페이로드로 보내야하는 배지 번호 값을 언제 늘릴 지 어떻게 알 수 있습니까?

응용 프로그램을 시작할 때 응용 프로그램이 시작되었음을 나타내는 메시지를 서버에 보냅니다. 따라서 서버 측에서는 badge = 0에서 다시 시작하고 서버에서 수신 한 메시지가없는 동안 모든 푸시 알림 페이로드에서 배지 번호를 늘립니다.


0

apns 페이로드에서는 백그라운드 모드에서 업데이트 배지 개수에 대해 "content-available": 1을 정의해야합니다.

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

}

예를 들어.

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

}

content-available = 1의 목적은 배지가 아닌 자동 알림입니다.
Manish 2011

0

유산에서 "배지"세트 카운트

{
  "to": "token",
  "notification": {
    "title": "Example",
    "body": "Tiene 22 actualizaciones.",
    "badge":278
  },
  "data": {
    "story_id": "story_12345",
    "count_vaca":22
  }
}

-1

앱을 열 때 원격 알림을받은 후,

의 " didBecomeActive"방법 에서 현재 배지 번호를 가져옵니다 AppDelegate.

아래 코드를 사용하는 파일 :

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

3
사용자가 앱을 탭하거나 앱을 실행하라는 알림을 탭하기 전까지는 작동하지 않습니다. 앱이 백그라운드에있을 때와 사용자가 앱 또는 알림과 상호 작용 하기 전에 배지를 업데이트하기 위해 OP가 원하는 작업을 수행하지 않습니다 .
Alex Zavatone 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.