Cập nhật huy hiệu bằng thông báo đẩy khi ứng dụng ở chế độ nền


82

Tôi đã nhận được thông báo đẩy đang hoạt động và quản lý để cập nhật số lượng huy hiệu biểu tượng khi ứng dụng được đưa lên nền trước.

Tuy nhiên, tôi hơi bối rối về điều này ... iPhone nhận được thông báo và thông báo bật lên xuất hiện để kích hoạt ứng dụng của tôi và huy hiệu chỉ cập nhật sau khi tôi khởi động ứng dụng.

Điều này có vẻ không đúng về mặt trải nghiệm người dùng. Tôi hiểu rằng số lượng huy hiệu sẽ thông báo cho người dùng về những gì cần hành động, thông qua số lượng tăng dần, nhưng điều này sẽ không xảy ra cho đến giai đoạn sau khi ứng dụng hoạt động.

Vì vậy, có cách nào để yêu cầu ứng dụng cập nhật số lượng huy hiệu của nó khi nó nhận được thông báo đẩy và trong khi ở chế độ nền không?

Lưu ý rằng ứng dụng của tôi không sử dụng vị trí và tôi có UIRemoteNotificationTypeBadgetrong yêu cầu đăng ký thông báo.

Cổ vũ AF


Bạn có muốn hiển thị huy hiệu trên biểu tượng ứng dụng không?
Aman Aggarwal

Tôi đang hiển thị số lượng trên các tab. Và đối mặt với cùng một vấn đề. Khi ứng dụng ở chế độ nền, số lượng không tăng. Tôi có thể thiết lập như thế nào?
Srusti Thakkar

Câu trả lời:


79

Vì thông báo đẩy do iOS xử lý chứ không phải ứng dụng của bạn nên bạn không thể thay đổi huy hiệu ứng dụng khi nhận thông báo đẩy.

Nhưng bạn có thể gửi số huy hiệu trong trọng tải của thông báo đẩy, nhưng bạn sẽ phải thực hiện phía máy chủ tính toán.

Bạn nên đọc Hướng dẫn lập trình thông báo cục bộ và đẩy và đặc biệt là Tải trọng thông báo .

Tải trọng có thể trông như thế này:

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

Bây giờ biểu tượng huy hiệu ứng dụng ứng dụng sẽ hiển thị số 9.


4
Tôi đã làm điều đó ... nhưng giá trị này chỉ được truy xuất khi ứng dụng của tôi được đưa lên nền trước, sau này tôi sử dụng để cập nhật giá trị huy hiệu bằng cách sử dụng [UIApplication sharedApplication] .applicationIconBadgeNumber = count;
Abolfoooud

7
Bạn không cần đặt số huy hiệu trong tải thông báo đẩy.
rckoenes

11
Tôi đã có một cái nhìn khác về cấu trúc trọng tải của mình và có vẻ như tôi đã chuyển giá trị của tham số huy hiệu dưới dạng chuỗi '4' chứ không phải là int 4 !!! Bây giờ tôi đã nhận nó làm việc ... cảm ơn vì sự giúp đỡ
Abolfoooud

Tôi đã kiểm tra nó không hoạt động khi thay đổi trên huy hiệu cấu trúc tải trọng
wod

1
@wod ý bạn là gì: thay đổi trên huy hiệu cấu trúc trọng tải.
rckoenes

11

Chúng tôi có thể thay đổi số huy hiệu khi chúng tôi ở trạng thái nền bằng cách gửi thông số "huy hiệu" trong gói thông báo đẩy. Như @rckoenes đã chỉ ra JSONthông số cho huy hiệu phải là INTEGER .

Mã PHP mẫu để làm điều tương tự

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

badge => 1 trong đó 1 là một số nguyên không phải là một chuỗi (tức là không có dấu nháy đơn)


11

Trên thực tế, trong iOS 10, Thông báo từ xa sẽ tự động gọi didReceiveRemoteNotificationPhương thức trong AppDelegate của bạn.

Bạn có 2 cách để cập nhật số lượng huy hiệu trong nền.
Tôi cũng đã làm điều này cho ứng dụng hiện tại của mình. Bạn cũng không cần Tiện ích mở rộng dịch vụ thông báo.

Cách thứ nhất:

Gửi khóa huy hiệu APS cùng với tải trọng của bạn tới APN.
Thao tác này sẽ cập nhật số lượng huy hiệu theo giá trị Số nguyên trong khối lượng huy hiệu của bạn. Ví dụ:

// 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
    }
}

Cách thứ 2:

Bạn có thể chuyển đổi application.applicationState của mình và cập nhật số lượng huy hiệu của bạn khi có applicationState .background. NHƯNG bạn phải chú ý không đặt tham số khóa huy hiệu trong tải trọng Thông báo của mình khi gửi tới APN ex

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

Xử lý huy hiệu Cập nhật phù hợp với trạng thái ứng dụng:

Đây là mã hoạt động của tôi để cập nhật số lượng huy hiệu mà không có khóa huy hiệu trong tải trọng cho 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")

    }
}

Đặt lại số lượng huy hiệu:

Đừng quên đặt lại số lượng huy hiệu khi ứng dụng của bạn trở lại trạng thái hoạt động.

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

Làm cách nào để cập nhật huy hiệu nếu ứng dụng không chạy trong nền?
Nagendra Rao

1
Nếu bạn gửi APS với khóa có sẵn nội dung, nó sẽ chạy Phương thức didReceiveRemoteNotification bất kể trạng thái của ứng dụng. Chỉ cần dùng thử với Thiết bị gốc. Nếu bạn đang sử dụng iOS, bạn có thể sử dụng công cụ này để gửi Đối tượng JSON của mình tới APN: github.com/noodlewerk/NWPusher
Gkiokan

wow, tuyệt vời, và điều gì sẽ xảy ra nếu tôi gửi thông báo mà không có sẵn nội dung? (là về bất kỳ thông báo không có nền nào). didReceiveRemoteNotificationkhông được gọi
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
    }

Giá trị của huy hiệu khóa tự động được coi là số lượng huy hiệu. Về phía ứng dụng iOS, không cần tính toán hoặc xử lý số lượng. Trong ví dụ trên, 9 là số lượng huy hiệu, vì vậy biểu tượng ứng dụng của bạn sẽ hiển thị số 9.

LƯU Ý Trong khi ứng dụng của bạn đóng, bạn không thể tự xử lý huy hiệu.

nếu bạn muốn tự mình giảm số lượng huy hiệu. Hãy tự xác định số lượng và cập nhật nó. như sau


4

Nếu bạn đang sử dụng NotificationServiceExtension, bạn có thể cập nhật huy hiệu trong đó.

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

Mỗi khi ứng dụng của bạn nhận được thông báo, tiện ích mở rộng dịch vụ của bạn sẽ được gọi. Lưu giá trị đó ở chế độ mặc định của người dùng và hiển thị nó. Để chia sẻ mặc định của người dùng giữa ứng dụng và tiện ích, bạn cần bật nhóm ứng dụng trong ứng dụng. Đọc thêm tại đây


bạn có thể lưu số lượng thông báo đó trên máy chủ và gửi thông báo đó cùng với thông báo.
Surjeet Rajput

Tôi sử dụng Nhắn tin qua đám mây của Firebase, bạn có biết cách thực hiện không?
Ghiggz Pikkoro


1

Đối với Nhắn tin qua đám mây Firebase (FCM), nó sẽ như thế này:

{
  "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]);
}

Tại sao bạn lại sử dụng intValue thay vì integerValue là NSInteger? @property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
Alex Zavatone

0

Như @rckoenes đã nói, bạn sẽ phải thực hiện phía máy chủ tính toán, nhưng làm thế nào bạn có thể biết khi nào tăng giá trị số huy hiệu mà bạn nên gửi trong tải trọng ?.

Liệu khi bạn khởi chạy ứng dụng có gửi một thông báo đến máy chủ của bạn cho biết rằng ứng dụng đã được khởi chạy hay không. Vì vậy, ở phía máy chủ, bạn bắt đầu lại từ huy hiệu = 0 và trong khi máy chủ không nhận được thông báo nào, hãy tăng số huy hiệu với mỗi trọng tải thông báo đẩy.


0

trong tải trọng apns phải xác định "nội dung có sẵn": 1 để cập nhật số huy hiệu ở chế độ nền

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

}

ví dụ.

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

}

mục đích của content-available = 1 là thông báo im lặng không dành cho huy hiệu.
Manish

0

kế thừa công việc của nó, số bộ "huy hiệu"

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

-1

Sau khi nhận được Thông báo từ xa khi bạn mở Ứng dụng,

lấy số Huy hiệu hiện tại trong " didBecomeActive" Phương pháp của bạn AppDelegate.

Tệp bằng mã bên dưới:

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

3
Điều đó sẽ không hoạt động cho đến khi người dùng chạm vào ứng dụng hoặc thông báo khởi chạy ứng dụng. Nó sẽ không làm những gì OP muốn, cập nhật huy hiệu khi ứng dụng ở chế độ nền và trước khi người dùng tương tác với ứng dụng hoặc thông báo.
Alex Zavatone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.