Thông báo đẩy im lặng trong iOS 7 không hoạt động


87

Trong phần trình bày "Có gì mới với đa nhiệm" của WWDC 2013, có một phần về Thông báo đẩy im lặng. Nó có vẻ thẳng về phía trước. Theo bản trình bày, nếu bạn gửi trọng tải APS chỉ với nội dung có sẵn được đặt thành 1, người dùng sẽ không được thông báo về thông báo.

// A. This doesn't work
{ 
  aps: { 
          content-available: 1 
       }
}

Thử nghiệm của tôi cho thấy rằng điều này không hoạt động vì không nhận được đẩy. Nhưng nếu tôi bao gồm thuộc tính âm thanh nhưng loại trừ thuộc tính cảnh báo, nó hoạt động (mặc dù không im lặng nữa).

// B. This works
{ 
  aps: {
          content-available: 1,
          sound: "default"
       }
}

Tuy nhiên, nếu tôi thay đổi thuộc tính âm thanh để phát âm thanh im lặng, tôi có thể bắt chước tiếng đẩy im lặng.

// C. This works too.
{ 
  aps: {
          content-available: 1,
          sound: "silence.wav"
       }
}

Có ai biết không:

  1. Nếu đây là một lỗi?
  2. Và nếu giả định rằng B hoặc C đang được coi là Thông báo từ xa (chứ không phải lỗi với Silent Push, nơi bạn cần thuộc tính âm thanh) có đúng không? Nếu vậy, điều này có nghĩa là nó không bị giới hạn tỷ lệ như Silent Pushes ... mà Apple có thể sẽ sửa chữa. Vì vậy, tôi có lẽ không nên dựa vào nó.
  3. Giới hạn tốc độ là bao nhiêu (N đẩy mỗi X giây, v.v.)?

Cảm ơn trước.

Chỉnh sửa với nhiều thông tin hơn

Đối với A, trạng thái của ứng dụng không quan trọng. Thông báo không bao giờ nhận được.

Có vẻ như B và C chỉ hoạt động nếu bạn đặt các thuộc tính và giá trị trong dấu ngoặc kép, như bên dưới.

{"aps":{"content-available": 1, "sound":"silent.wav"}}

Và thông báo đến trong ứng dụng: didReceiveRemoteNotification: fetchCompletionHandler: bất kể trạng thái.


Nó không hoạt động ở bất kỳ trạng thái ứng dụng nào? Đối với tôi, " A " hoạt động miễn là ứng dụng đang chạy ở nền trước (didReceiveRemoteNotification được gọi). Nhưng khi ứng dụng không chạy, ứng dụng không nhận được thông báo (tôi chỉ nghe thấy âm thanh, khi tôi thử " B "). Ứng dụng của bạn có bị đánh thức (didReceiveRemoteNotification) trong nền khi bạn sử dụng " B " hoặc " C " không?
DerBernie

Tôi đang thấy hành vi tương tự, tôi nghĩ có thể là do tôi đã thử điều này trong một thời gian và tôi đã không thiết lập ứng dụng đúng cách lúc đầu nên Apple có thể đã điều chỉnh tôi trước khi tôi thiết lập chính xác.
nickthedude

4
Dude ... Tôi ước gì có thể cung cấp cho bạn 10 phiếu
Michael Wiles

Hãy xem bạn có Background fetchchọn hộp kiểm trong Project Capabilities> không Background Modesvì tùy chọn đầu tiên sẽ hoạt động. Tính năng đẩy im lặng không cần thuộc tính âm thanh và luôn đến application:didReceiveRemoteNotification:fetchCompletionHandler:ngay cả khi ứng dụng đang chạy ở chế độ nền / nền trước hoặc không chạy.
IgniteCoders

Câu trả lời:


73

Điều này cũng hoạt động và không phát âm thanh khi nó đến:

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}

BIÊN TẬP

Những người gặp sự cố này có thể muốn xem liên kết này . Tôi đã tham gia vào một chuỗi trên diễn đàn Nhà phát triển của Apple về tất cả các trạng thái ứng dụng và khi nhận được và không nhận được các lần đẩy im lặng.


Cảm ơn các liên kết. Có nhiều chủ đề thảo luận về vấn đề này trên Diễn đàn của ADC. Điểm mấu chốt: có một lỗi - sau khi thiết bị khởi động lại - mà đại diện của Apple đã thừa nhận nên được sửa trong bản cập nhật (cuối cùng).
SG1

3
Trong iOS7, nó hoạt động tuyệt vời ngay cả khi không có phím âm thanh / cảnh báo. Nội dung khả dụng là chìa khóa đủ! Nhưng trong iOS8, chúng tôi có hành vi thực sự kỳ lạ khi thậm chí chúng tôi đặt khóa cảnh báo với chuỗi không trống ngoài "nội dung có sẵn": 1 chúng tôi chỉ nhận được biểu ngữ có chuỗi "cảnh báo", nhưng "có sẵn nội dung" bị bỏ qua vì một số lý do
malex

Tôi đã thành công với việc khởi chạy ứng dụng từ thông báo có hoặc không có thêm âm thanh. Có thể, việc đặt âm thanh, cảnh báo hoặc huy hiệu (trống hoặc không) tăng mức độ ưu tiên thông báo mặc định lên 10, do đó tăng độ tin cậy của nó. Xem Apple nói gì về ưu tiên pans: developer.apple.com/library/ios/documentation/… Mức độ ưu tiên mặc định là 10 (cao), nhưng thật là lỗi khi sử dụng điều này cho thông báo đẩy chỉ có khóa có sẵn nội dung. Vì vậy, có thể giá trị mặc định được đặt thành 5 nếu chỉ đặt khóa có sẵn nội dung.
emem

1
không hoạt động trên iOS10. Tôi phải đẩy một cái gì đó để "âm thanh".
Stony

Làm việc trên iOS10 cho tôi. Nhưng hiện không hoạt động trên iOS11
Slav

30

Vì vậy, tôi vừa gặp sự cố này ngày hôm qua và sau khi thử gửi tải trọng có âm thanh được đặt thành một chuỗi trống, nó vẫn gây ra rung / âm thanh trên thiết bị. Cuối cùng, tôi tình cờ thấy một bài đăng trên blog từ Urban Airship đề xuất rằng cần gửi:

{ priority: 5 }

trong thông báo đẩy mà tôi chưa từng thấy. Sau khi xem xét tài liệu của Apple cho thông báo đẩy, tôi tình cờ vào trang này:

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

Điều này cho biết mức độ ưu tiên nên được đặt là "5" hoặc "10" và giải thích:

Mức độ ưu tiên của thông báo. Cung cấp một trong các giá trị sau:

10 Tin nhắn đẩy được gửi ngay lập tức.

Thông báo đẩy phải kích hoạt cảnh báo, âm thanh hoặc huy hiệu trên thiết bị. Đó là một lỗi khi sử dụng mức độ ưu tiên này cho lần đẩy chỉ chứa khóa có sẵn nội dung.

5 Tin nhắn đẩy được gửi tại thời điểm bảo toàn nguồn điện trên thiết bị nhận tin nhắn đó.

Cuối cùng, chúng tôi có thể nhận được thông báo đẩy im lặng hoạt động với số lượng huy hiệu (và tôi nghi ngờ bạn thậm chí có thể làm điều tương tự với một cảnh báo) với định dạng sau:

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };

Câu trả lời tuyệt vời Dave! Mức độ ưu tiên là 5 được cho phép trong khi "thật là lỗi khi sử dụng mức độ ưu tiên này [10] cho một lần đẩy chỉ chứa khóa có sẵn nội dung." developer.apple.com/library/ios/documentation/…
rjobidon

4
Có nên ưu tiên đưa vào tải trọng không? IMO nó là riêng một byte trong lần đẩy bạn gửi.
Foriger

6
Mức độ ưu tiên không được đặt trong tải trọng. Điều này được đặt trong thông báo nhị phân.
Sandy D.

10

Tôi đã thử đặt một chuỗi trống làm thuộc tính cảnh báo và nó cũng hoạt động:

{
    aps =     {
        "content-available" = 1;
        "alert" = "";
    };
}

Có vẻ như APNS đang kiểm tra sự tồn tại của các thuộc tính này nhằm mục đích xác thực tải trọng đẩy. Điều thú vị là họ không kiểm tra nội dung thực tế. Nó có vẻ hơi hacky mặc dù ...


Giải pháp này với alert=""tải trọng cũng làm việc cho tôi iOS 9.0. Các sound=""không làm việc để thay thế.
loretoparisi

5

Tôi sử dụng công cụ- Knuff gửi thông báo đẩy tới thiết bị của tôi.

Nó giống như: nhập mô tả hình ảnh ở đây

Sau đó, tôi đã thử ví dụ này.

Tất cả đều là công việc! Nhưng bạn phải đặt ưu tiên 10!

Vì vậy, nếu bạn không sử dụng công cụ, bạn cũng lưu ý nó.


ví dụ:

  • không có cảnh báo, không có âm thanh

{
    "aps":{
        "content-available":1,
    }
}

  • chỉ cảnh báo

{
    "aps":{
        "content-available":1,
        "alert":""
    }
}

  • chỉ âm thanh

{
    "aps":{
        "content-available":1,
        "sound":""
    }
}


4

Điều này phù hợp với tôi:

{ 
  aps: { 
          content-available: 1 
       }
}

Xem nếu bạn Background fetchchọn hộp kiểm trong Project Capabilities>Background Modes


2

Tôi đang gặp vấn đề tương tự. Nếu tôi gửi thông báo đẩy với "nội dung có sẵn": 1 và không có thuộc tính nào khác được đặt, thì thông báo sẽ không bao giờ nhận được. Khi tôi thêm bất kỳ thuộc tính nào khác, nó hoạt động hoàn hảo.

Là một công việc tạm thời, tôi đang thêm thuộc tính huy hiệu vì điều này không cảnh báo người dùng theo bất kỳ cách nào ngoài việc thêm huy hiệu vào biểu tượng.

Hãy cho tôi biết nếu bạn đã tìm thấy giải pháp tốt hơn.


1

Mức độ ưu tiên phải được đặt thành một mục trong luồng nhị phân nhưng không phải trong chuỗi json tải trọng. Rõ ràng chỉ có định dạng loại 2 mới nhất có thể được sử dụng để đặt mức độ ưu tiên như sau:

$token      = chr(1) . pack('n', 32)     . pack('H*', $deviceToken);
$payload    = chr(2) . pack('n', strlen($json)) . $json;
$identifier = chr(3) . pack('n', 4)      . pack('N', $notification);
$expiration = chr(4) . pack('n', 4)      . pack('N', time()+86400);
$priority   = chr(5) . pack('n', 1)      . chr($priority);

$frame_data = $token.$payload.$identifier.$expiration.$priority;
$frame_length = strlen(bin2hex($frame_data))/2;

$msg = chr(2) . pack('N', $frame_length) . $frame_data;

Các kiểu định dạng (byte đầu tiên) cho thông báo nhị phân thông báo từ xa:

0 - đơn giản (cũ) 1 - nâng cao (cũ) 2 - mới nhất với nhiều tham số hơn (mới)


0

Argh! Cũng kéo tóc của tôi ra - đây không phải là một câu trả lời quá nhiều như một ví dụ khác về tải trọng KHÔNG hoạt động. Phương thức didReceiveRemoteNotification không bao giờ được gọi, mặc dù nếu thiết bị đang ngủ, văn bản cảnh báo IS sẽ hiển thị.

 {"aps":
    {  "alert":"alert!",
       "sound":"default",
       "content-available" : 1},
    "content-id":21482,
    "apt":"1"
}

"apt" là trường tùy chỉnh mà chúng tôi sử dụng để biểu thị loại thông báo.


2
Nếu ứng dụng ở chế độ nền, và nếu bạn loại bỏ các thuộc tính 'cảnh báo', bạn sẽ nhận được gọi lại trong ứng dụng: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon

@mkwon và nếu tôi muốn xem cảnh báo (đẩy thường xuyên) khi đang ở trong ứng dụng gọi BG +: didReceiveRemoteNotification: fetchCompletionHand‌ ler :? Tnx
DaNLtR 27/12/16


0

đặt mức độ ưu tiên thành 5 không hoạt động đối với tôi, nhưng việc đặt âm thanh hoặc cảnh báo cho một chuỗi trống đã khiến thông báo được xử lý như một mức độ ưu tiên cao


0

Chúng tôi đã gặp vấn đề tương tự khi không có Thông báo nào được gửi. Trong trường hợp của chúng tôi, chúng tôi đã sử dụng một động lực không ngừng để cập nhật số huy hiệu. Khi chúng tôi đặt các chuỗi trống cho cảnh báo (nội dung và tiêu đề) và âm thanh, nó sẽ hoạt động, nhưng nếu bất kỳ phím nào không có thì nó không thành công. Đây là những gì đã hoạt động, cập nhật huy hiệu mà không có âm thanh hoặc cảnh báo (nhật ký của từ điển userInfo kết quả trong didReceiveRemoteNotification)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
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.