Đẩy không im lặng không được gửi đến ứng dụng trên iOS 11


168

Tôi nhận thấy rằng trên iOS 11 beta 2, các thông báo im lặng không được gửi đến application:didReceiveRemoteNotification:fetchCompletionHandlerbất kể trạng thái của ứng dụng (nền / tiền cảnh).

Tôi đã thực hiện UIApplicationDelegetephương pháp application:didReceiveRemoteNotification:fetchCompletionHandlervà tôi gửi sự thúc đẩy im lặng sau đây

{  
  "aps": {  
    "content-available": 1  
  },  
  "mydata": {  
    "foo": "bar"  
  }  
} 

nhưng phương thức đại biểu không được gọi trên iOS 11.

Nó hoạt động tốt trên các phiên bản iOS khác và phần tài liệu Cấu hình Thông báo Im lặng không đề cập đến bất kỳ điều gì khác nên được thực hiện.

Đây có phải là một lỗi trong iOS 11 hay tôi đã bỏ lỡ điều gì mới trong iOS 11?

Xin lưu ý rằng tôi không nói về hoặc sử dụng UserNotificationkhuôn khổ không cần thiết để gửi các cú đẩy im lặng.

Đây là một dự án mẫu minh họa vấn đề (bạn sẽ phải đặt id gói của riêng bạn)

Khi bạn ăn trưa dự án mẫu và gửi một trọng tải trên cho ứng dụng, bạn có thể sử dụng bảng điều khiển macOS để thấy rằng việc đẩy được phân phối chính xác đến thiết bị nhưng không phải cho ứng dụng.

CẬP NHẬT 10,08

Có vẻ như hành vi là ngẫu nhiên. Đôi khi sau khi khởi động lại thiết bị, tải trọng được phân phối chính xác nhưng nó sẽ ngừng hoạt động sau một thời gian.

Như bạn có thể thấy trên ảnh chụp màn hình sau đây, lần đẩy được đánh dấu là 1 chỉ được phân định cho thiết bị và lần đẩy 2 (sau khi khởi động lại thiết bị) cũng được gửi đến ứng dụng.

nhập mô tả hình ảnh ở đây

CẬP NHẬT 14,08 - iOS 11 Beta 6

Vẫn hành vi tương tự. Một điều khác được cho là hoạt động nhưng không phải là sau đây. Khi lược đồ của ứng dụng được đặt thành "Đợi cho thực thi được khởi chạy", một cú đẩy im lặng được cho là sẽ đánh thức ứng dụng và khởi động nó ở chế độ nền.

nhập mô tả hình ảnh ở đây

CẬP NHẬT 21,08 - iOS 11 Beta 7

Vẫn hành vi tương tự và không cập nhật từ Apple trong báo cáo lỗi.

CẬP NHẬT 29,08 - iOS 11 Beta 8

Vẫn là vấn đề tương tự. Các bước để sao chép tôi sử dụng bây giờ là như sau:

  • Trong sơ đồ dự án Xcode, chọn "Đợi thực thi được khởi chạy"
  • Thêm một điểm dừng trong didReceiveRemoteNotification: fetchCompletionHandler
  • Khởi động ứng dụng trên thiết bị
  • Gửi sự thúc đẩy thầm lặng ở trên

Dự kiến : Ứng dụng được đưa từ trạng thái treo sang nền và didReceiveRemoteNotification: fetchCompletionHandlerđược gọi là

Thực tế : không có gì xảy ra

CẬP NHẬT 06,09 - iOS 11 Beta 10

Tôi vẫn có hành vi lỗi tương tự. Vé từ Apple đã được cập nhật với câu trả lời sau:

Quan hệ nhà phát triển của Apple ngày 6 tháng 9 năm 2017, 10:42 PM Engineering đã cung cấp các phản hồi sau về vấn đề này:

Chúng tôi đã có thể chạy ứng dụng mẫu và kiểm tra hành vi. Chúng tôi đã không thấy bất kỳ vấn đề khi chúng tôi kiểm tra điều này như được mô tả.

Đẩy không được đảm bảo để đến ứng dụng khi ứng dụng chạy ẩn và nhật ký ở đây cho thấy chúng tôi không tin rằng ứng dụng đang được sử dụng đủ để khởi chạy ứng dụng.

Chúng tôi thấy chúng tôi cung cấp đẩy theo thời gian khi điều kiện là tốt.

Chúng tôi tin rằng điều này là hành xử chính xác.

Cập nhật 11,09

Báo cáo lỗi của Apple của tôi đã đóng cửa và đánh dấu là bản sao của 33278611mà vẫn mở

CẬP NHẬT 13,09 - iOS 11 GM

Nhờ những bình luận của kam800 (xem bên dưới) tôi đã thử nghiệm nhiều hơn và đưa ra những quan sát đó:

Dường như có một trình nền mới trong iOS 11 dasd DuetActivitySchedulerDaemonhoặc loại bỏ hoàn toàn việc đẩy dữ liệu hoặc trì hoãn việc phân phối đẩy dữ liệu:

Giao hàng hoãn

Nhật ký giao diện điều khiển

default 13:11:47.177547 +0200   dasd    DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>!   lifecycle   com.apple.duetactivityscheduler
default 13:11:47.178186 +0200   dasd    DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private>   default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200   dasd    DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017   default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200   dasd    DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>)  scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200   dasd    DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private>  default com.apple.duetactivityscheduler

Vấn đề giao hàng bị hoãn

  • Khi việc phân phối đẩy dữ liệu bị hoãn và ứng dụng được khởi chạy, việc đẩy dữ liệu chỉ được phân phối khi đạt đến ngày giao hàng có thể là vài phút trong tương lai. Điều này đánh bại hoàn toàn mục đích của việc sử dụng dữ liệu đẩy để giữ cho nội dung của ứng dụng mới sẵn sàng cho lần ra mắt tiếp theo. Tôi xin trích dẫn ở đây một lần nữa tài liệu của Apple:

"Thông báo im lặng cải thiện trải nghiệm người dùng bằng cách giúp bạn cập nhật ứng dụng của mình, ngay cả khi ứng dụng không chạy."

  • Khi hai lần đẩy dữ liệu được gửi đến một ứng dụng bị treo, chúng sẽ bị hoãn lại bởi iOS 11 thay vì đánh thức ứng dụng trực tiếp. Khi đạt được thời gian giao hàng, chỉ có lần đẩy dữ liệu cuối cùng được gửi! Các lần đẩy trước bị mất và không được phân phối thông qua phương thức ủy nhiệm dẫn đến mất dữ liệu.

Giao hàng bị hủy

Nhật ký giao diện điều khiển

default 13:35:05.347078 +0200   dasd    DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
 ], FinalDecision: Must Not Proceed}    scoring com.apple.duetactivityscheduler

Sự cố giao hàng bị hủy

Trong trường hợp này, việc đẩy dữ liệu hoàn toàn bị mất và không bao giờ được phân phối trên iOS 11 trong khi nó được phân phối chính xác trên iOS 10.

CẬP NHẬT 19,09 - iOS 11 GM

Tôi cũng nhận thấy rằng khi ứng dụng ở phía trước và thông báo không được gửi đến ứng dụng, tôi thấy các nhật ký sau trong bảng điều khiển:

default 08:28:49.354824 +0200   apsd    apsd    <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO   courier-oversized   com.apple.apsd

fault   08:33:18.128209 +0200   dasd    Foundation  <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
    NSArray,
    NSData,
    NSString,
    NSNumber,
    NSDictionary,
    NSUUID,
    _DASActivity,
    NSSet,
    _DASFileProtection,
    NSDate,
    NWParameters,
    NWEndpoint
)}'.    general com.apple.foundation.xpc

1
Vẫn chưa được sửa trong Beta 8, khi tôi nhìn vào bảng điều khiển, tôi thấy lỗi sau: <NSXPCConnection: 0x123f43620> kết nối từ pid 58: Ngoại lệ bị bắt trong khi giải mã tin nhắn nhận được, làm rơi tin nhắn đến. Ngoại lệ: Ngoại lệ trong khi giải mã đối số 0 (# 2 của lệnh gọi): Ngoại lệ: giá trị cho khóa 'NS.objects' là của lớp không mong đợi 'NSNull'. Các lớp được phép là '{(NWParameter, NWEndpoint, NSArray, NSData, NSString, NSNumber, NSDipedia, NSUUID, _DASActivity, NSSet, _DASFileProtection, NSDate)}'.
Thomas Einwaller

2
Tôi đang nhận được kết quả tương tự với iOS 11 (không phải trước đây), nếu tôi gửi bằng cách đẩy "content-available": 1và ứng dụng ở phía trước, cuộc gọi lại sẽ không bị hủy.
GoRoS

4
Sau khi thử nghiệm với iOS11.1 beta 1 mới, có vẻ như nó đã được sửa và hiện đang hoạt động như trước trên iOS 10
Lee

3
Whatsapp dường như đã có một vấn đề tương tự whatsappen.com/news/5465/ trộm Một cái gì đó về người dùng "thường xuyên đóng ứng dụng của họ" mà hầu hết các nhà phát triển ...
toxaq

3
Và chính xác tương tự với bản phát hành công khai 11.1. Nếu bạn đang sử dụng các chế độ đẩy im lặng và ứng dụng của bạn ở phía trước, đừng hy vọng chúng sẽ được phân phối tùy thuộc vào một số thứ, nhưng chủ yếu là mức pin, ngay cả khi thiết bị được cắm vào nguồn điện.
Gruntcakes

Câu trả lời:


31

Vì vậy, các ghi chú phát hành của iOS 11.1 beta 1 nói

iOS 11.1 beta 1 vừa được phát hành và họ đề cập: "Thông báo các vấn đề được giải quyết • Thông báo đẩy im lặng được xử lý thường xuyên hơn. (33278611)

Tôi đã làm một số thử nghiệm và nó dường như đã được sửa chữa:

Nhà nước bị đình chỉ

Khi tôi khởi chạy ứng dụng ở chế độ treo và gửi một cú đẩy im lặng, ứng dụng sẽ được đưa trở lại nền và didReceiveRemoteNotification:fetchCompletionHandlerđại biểu được gọi.

Nhà nước tiền cảnh

Theo cách tương tự, khi ứng dụng ở phía trước và một cú đẩy im lặng được gửi, đại biểu dường như được gọi như mong đợi. Điều này ngẫu nhiên không hoạt động trong các phiên bản iOS 11 trước đó vì vậy tôi sẽ xác nhận điều này sau khi thử nghiệm thêm.


3
Trong các thử nghiệm ban đầu của tôi, tôi nghĩ rằng nó đã được sửa chữa. Nó làm việc trong một thời gian. Nhưng sau một số thử nghiệm nặng nề, mọi thứ bắt đầu giảm một phần. Đột nhiên, nó ngừng gọi đại biểu cho mỗi lần đẩy im lặng, ngay cả với ứng dụng ở phía trước. Rõ ràng, hệ thống "song ca" mới này đang chặn đại biểu của ứng dụng của tôi để được gọi do thiếu "EnergyBocate". Vì vậy, thật không may, vẫn không cố định.
Abras

không thể tin được :(
Thomas Einwaller

Kinh nghiệm của tôi giống như Abras ở trên. Làm việc được một lúc rồi sụp đổ và người xử lý không còn được gọi nữa - chuyện này thật tệ,
Lee

Sau nhiều thử nghiệm, tôi đã có thể tìm cách khiến thiết bị nhận lại thông báo. Kết nối nó với sức mạnh. Ngay khi bạn kết nối thiết bị với nguồn, thiết bị sẽ bắt đầu nhận lại tất cả Thông báo từ xa. Nếu bạn ngắt kết nối nó, thì nó dừng lại. Điều này không có ý nghĩa gì, bởi vì trong tất cả các thử nghiệm của tôi, ứng dụng đã ở phía trước. Và các ứng dụng tiền cảnh được đảm bảo để nhận Thông báo từ xa.
Abras

Đối với tôi, tất cả đều hoạt động tốt ngay cả khi kết nối di động mà không được kết nối với nguồn điện. Chỉ khi tôi đặt thiết bị ở chế độ tiết kiệm năng lượng thì tôi mới không được đẩy ngay cả khi ở phía trước. Nhưng đó là điều tôi hiểu
ngày

18

Chỉ muốn thêm 2 xu của tôi vào đây vì tôi cũng gặp phải vấn đề này và tôi nhận thấy rằng Apple đã đóng một số radar về vấn đề này nói rằng họ không thể sao chép. Một điều thú vị tôi tìm thấy là các lần đẩy sẽ được phân phối nếu ứng dụng được chạy nền trong khi nó được gắn vào trình gỡ lỗi.

Nếu tôi giết trình gỡ lỗi, rút ​​phích cắm điện thoại của tôi, khởi chạy ứng dụng và gửi tải trọng đẩy im lặng, tôi thấy ứng dụng KHÔNG bị đánh thức. Tôi thấy trong nhật ký Console rằng hệ thống sẽ hủy việc phân phối tải trọng cho ứng dụng của tôi.

Tôi đã gửi một radar với một ứng dụng mẫu nhỏ tái tạo vấn đề. Tôi cũng đã lưu ý rõ ràng trong radar rằng người làm việc trên vé của tôi không được chạy ứng dụng được đính kèm với trình gỡ lỗi để tái tạo vấn đề. Đây là liên kết: https://bugreport.apple.com/web/?probolsID=34461063

Hy vọng rằng điều này sẽ gây ra một số tiến bộ được thực hiện về vấn đề này.


2
Cảm ơn báo cáo. Btw, liên kết lỗi Apple sẽ không giúp đỡ ở đây vì chúng là riêng tư và chỉ có phóng viên và Apple mới có thể nhìn thấy chúng
ngày

Tôi muốn thấy nhiều người sử dụng openradar.appspot.com để chúng tôi có thể theo dõi các radar của người khác
Thomas Einwaller

Có bất kỳ cập nhật nào về báo cáo lỗi của bạn với apple @bill
MagicFlow

Tôi chưa nhận được bất kỳ bản cập nhật nào trên radar của mình từ Apple nhưng chúng tôi đã cài đặt bản beta của iOS 11.1 và có vẻ như sự cố đã được khắc phục.
Bill Dunay

Có, chúng tôi cũng đang đối mặt với vấn đề tương tự trong iOS 11.2.6, Bất kỳ giải pháp hoặc cập nhật nào?
Gopik

14

Trông giống như một hành vi mới của iOS 11. iOS 11 beta 10 cung cấp một số nhật ký mô tả về vấn đề này:

default 23:18:51.806011 +0200   dasd    com.apple.pushLaunch.com.acme.Acme:F7E7D0:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Can Proceed, Score: 0.50}}
    {name: BatteryLevelPolicy, policyWeight: 1.000, response: {Decision: Can Proceed, Score: 0.87, Rationale: [{batteryLevel == 62}]}}
    {name: DeviceActivityPolicy, policyWeight: 5.000, response: {Decision: Can Proceed, Score: 0.20}}
 ] sumScores:52.279483, denominator:81.410000, FinalDecision: Can Proceed FinalScore: 0.642175}
default 23:18:51.806386 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' has compatibility score of 1.000000 with 'com.apple.CFNetwork-cc-111-79:E7272D'. Relaxing scores.
default 23:18:51.806855 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' CurrentScore: 0.642175, ThresholdScore: 0.738454 DecisionToRun:0

Có vẻ như mọi thao tác đẩy im lặng đều được gửi tới iOS, nhưng dasd daemon sử dụng một vài chính sách để quyết định xem có nên gửi im lặng cho ứng dụng hay không (ví dụ: mức pin). Tôi đã xoay sở để nhận được một lần đẩy im lặng vào tối hôm qua, nhưng iPhone của tôi đã được kết nối với bộ sạc vào thời điểm đó - có lẽ điểm số của BatteryLevelPolicy đủ cao để nhận được một lần nhấn im lặng đó.

Apple không cung cấp thông tin chính thức nào về hành vi phía iOS này, chỉ có thông tin về điều chỉnh phía máy chủ:

Thông báo im lặng không có nghĩa là một cách để giữ cho ứng dụng của bạn luôn ở chế độ nền, cũng không có nghĩa là để cập nhật mức độ ưu tiên cao. APN coi các thông báo im lặng là mức ưu tiên thấp và có thể điều tiết việc phân phối của chúng hoàn toàn nếu tổng số trở nên quá mức. Các giới hạn thực tế là động và có thể thay đổi dựa trên các điều kiện, nhưng cố gắng không gửi nhiều hơn một vài thông báo mỗi giờ.

Tôi giữ ngón tay của mình vượt qua họ đã thay đổi hành vi đó, bởi vì điều đó sẽ khắc phục ứng dụng của tôi :) Mặt khác, sự thay đổi này là tốt - một trong nhiều điều làm cho pin iPhone tồn tại lâu hơn điện thoại Android.


1
Có, các lần đẩy được chuyển đến thiết bị nhưng không đến ứng dụng. Đó là những gì tôi đã viết trong bài viết gốc của mình. "Thông báo im lặng không có nghĩa là một cách để giữ cho ứng dụng của bạn luôn ở chế độ nền" điều này vẫn ổn miễn là chúng được gửi "đôi khi". Vấn đề lớn là thông báo im lặng không bao giờ được gửi tới ứng dụng trong iOS 11 khi nó ở chế độ nền. Điều này đánh bại hoàn toàn toàn bộ mục đích đẩy dữ liệu.
ngày

Vâng, bạn đã viết rằng, tôi chỉ muốn cung cấp giải thích đầy đủ về các chính sách đẩy mới này. Tôi đã trích dẫn các tài liệu của Apple để cho thấy rằng họ đã cảnh báo về sự không chắc chắn trong giao hàng đẩy. Như tôi đã viết: "Tôi đã xoay sở để nhận được một cú đẩy thầm lặng vào tối hôm qua" (trong ứng dụng mà tôi muốn nói) và ứng dụng này ở chế độ nền. Nhưng vào ban ngày - ứng dụng của tôi không nhận được sự thúc đẩy nào :( Theo tôi, Apple sẽ nới lỏng các chính sách đẩy này trong phiên bản RC. Mặt khác, họ có thể khôi phục hành vi đẩy ban đầu - họ đã sử dụng để loại bỏ các tính năng chỉ được cung cấp trong phiên bản beta (ví dụ: tự động khóa 10,3).
kam800

Tôi thấy các bản ghi tương tự khi nhận được đẩy và ứng dụng bị treo. Các dasd quá trình sau đó đăng nhập default 10:17:42.994236 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.3 minutes to Wed Sep 13 10:24:03 2017. Sự thúc đẩy im lặng dường như được đưa ra tại thời điểm đó.
ngày

đã bắt đầu thử nghiệm với iOS 11 GM, vẫn thấy hành vi kỳ lạ, nhật ký như com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
Thomas Einwaller

1
Ngoài ra - Tôi đã quản lý để giải quyết ứng dụng của mình bằng cách gửi đẩy không im lặng với một số thông báo còn sơ khai và điền thông báo với nội dung phù hợp bằng Tiện ích mở rộng dịch vụ thông báo.
kam800

9

Ghi chú phát hành beta iOS 11.1 bao gồm: Thông báo Các vấn đề được giải quyết Thông báo đẩy im lặng được xử lý thường xuyên hơn. (33278611)


7

iOS 11.1 Beta 2 cũng chứa

Notifications
Resolved Issues
 Silent push notifications are processed more frequently. (33278611)

trong Ghi chú phát hành - sẽ kiểm tra ngay bây giờ.

CẬP NHẬT - 11.10.2017 - iOS 11.1 Beta 2

Sau khi sử dụng Ứng dụng của chúng tôi trong 2 ngày trong "kịch bản thế giới thực", có vẻ như có một sự cải tiến thực sự trong phiên bản iOS này. Tôi thận trọng bắt đầu tin rằng điều này là cố định.


1
Tôi đã thử nghiệm các kịch bản khác nhau: Nó đã hoạt động ở trạng thái nền trước và nền. Thật không may, nó không hoạt động, nếu ứng dụng bị chấm dứt bởi người dùng. Sau khi chấm dứt, thiết bị sẽ không nhận được bất kỳ sự thúc đẩy im lặng nào, miễn là ứng dụng không được người dùng chủ động khởi chạy lại. Bạn có kinh nghiệm tương tự?
AlexWoe89

bây giờ nó hoạt động ... sau một 'thời gian chết' xấp xỉ. 5 đến 10 phút các thông báo im lặng đang hoạt động như mong đợi ... xin lỗi vì sự thịnh hành của tôi. bình luận :)
AlexWoe89

1
đẩy im lặng không bao giờ hoạt động khi người dùng chấm dứt ứng dụng - xem developer.apple.com/documentation/uikit/uiapplicationdelegate/, "Tuy nhiên, hệ thống không tự động khởi chạy ứng dụng của bạn nếu người dùng buộc phải thoát ứng dụng."
Thomas Einwaller

1
Tôi đang thấy rằng iOS11.1 beta 3 đang hoạt động giống như iOS10 và tốt hơn rất nhiều so với iOS11.1 beta 2.
Lee

1
@Olecramoak đối với tôi iOS11.1 beta 4 đang hoạt động như iOS 10.
AlexWoe89

7

Quan hệ nhà phát triển của Apple vừa thêm một nhận xét vào radar của tôi:

Chúng tôi tin rằng vấn đề này đã được giải quyết trong bản iOS 11.2 beta mới nhất.

Vui lòng kiểm tra bản beta iOS mới nhất. Nếu bạn vẫn gặp sự cố, vui lòng cập nhật báo cáo lỗi của bạn với bất kỳ nhật ký hoặc thông tin liên quan nào có thể giúp chúng tôi điều tra.

https://developer.apple.com/doad/

hiện đang cài đặt iOS 11.2 beta - sẽ kiểm tra hành vi đẩy im lặng


Vì vậy, điều này có nghĩa là iOS 11.1 GM sẽ không khắc phục vấn đề? :(
Olecramoak

Đó là điều tốt để nghe, khi nào chúng ta thực sự có thể mong đợi bản phát hành chính thức của iOS11.1?
AlexWoe89

Giữ cho chúng tôi được đăng, hiện không thể cài đặt ứng dụng của tôi vì không có Xcode cho 11.2 khả dụng. (và tôi đã xóa ứng dụng khỏi thiết bị của mình)
Rool Paap

3

Tôi gặp vấn đề tương tự với ứng dụng của mình, cho đến iOS 10 tôi đã nhận được thông báo đẩy và application:didReceiveRemoteNotification:fetchCompletionHandlerđược gọi chính xác. Nhưng khi cập nhật lên iOS 11, thông báo đẩy đã ngừng hoạt động.

Vấn đề với mã của tôi là, mặc dù tôi đang sử dụng nội dung có sẵn: 1 và nội dung có thể thay đổi: 1 trong tải trọng thông báo đẩy, tùy chọn Tìm nạp nền không được bật. Nhưng nó đã hoạt động hoàn hảo cho đến iOS 10.

Hãy chắc chắn rằng bạn đã BẬT cả hai khả năng này.

Sau khi bật khả năng Tìm nạp nền BẬT, nó đang hoạt động


không, nó không hoạt động cho iOS11 - chỉ cần chấm dứt ứng dụng của bạn một lần, sau đó nó sẽ ngừng đánh thức ứng dụng của bạn. chỉ cần đọc câu trả lời và nhận xét trong chủ đề này
AlexWoe89

2
Đối với ứng dụng bị chấm dứt, mọi thông báo đẩy (đẩy mạnh hoặc đẩy chung) sẽ không kích hoạt phương thức ủy nhiệm trong đại biểu ứng dụng. đó là hành vi mặc định. Không có trường hợp đặc biệt nào cho iOS 11.0.
Sudeep george

3

iOS 11.4.1, Swift 4

Tôi đã gặp vấn đề với những cú đẩy thầm lặng không đến (từ CloudKit) và tôi đã thử mọi thứ mà mọi người đã đề cập ở đây. Sau đó, tôi quyết định thử đặt một khoảng trống alertBodycho CKNotificationInfo()các đối tượng của mình như thế này:

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""

Điều này làm cho các lần đẩy được gửi ở mức ưu tiên cao hơn (nhưng chúng vẫn là các lần đẩy im lặng) và tôi không còn gặp lỗi trong nhật ký thiết bị của mình rằng việc đẩy đã bị bỏ qua.

Tôi hy vọng điều đó sẽ giúp được ai đó. :)


Làm việc với tôi với CloudKit là tốt. Nếu không có alertBody, bạn sẽ cần phải cắm thiết bị để nhận RemoteNotutions. Hành vi rất kỳ quặc ...
powertoold

2

Vì vậy, đây thực sự là một lỗi trong iOS 11 và hiện đã được sửa trong iOS 11 beta 3. Hiện application:didReceiveRemoteNotification:fetchCompletionHandlertại được gọi chính xác khi nhận được một cú đẩy im lặng ở cả nền trước hoặc nền.

CẬP NHẬT

Không, nó không được sửa và vẫn đang diễn ra trong iOS beta 3 và 4


1
Trên thực tế không phải là :( Nó vẫn đang diễn ra trong iOS 11 beta 3
ngày

1
Apple cũng mở lại báo cáo lỗi. Tôi sẽ cho bạn biết
ngày

1
Tôi không nhận được các lần đẩy im lặng trong iOS 11 beta 4. Liên quan nhiều hơn, nếu ứng dụng không ở phía trước thì đôi khi chúng xuất hiện dưới dạng thông báo thông thường. Chắc chắn là một cái gì đó lên!
Ben Dodson

1
Vì vậy, tôi mới cài đặt iOS 11 beta 5 và nó có vẻ tốt hơn và các thông báo im lặng được gửi khi ứng dụng ở chế độ nền hoặc nền thông qua đại biểu didReceiveRemoteNotification trong một thời gian sau đó nó ngừng hoạt động bất kể tôi làm gì: / Bạn có hành vi tương tự?
Ngày

1
sẽ thật tuyệt nếu bạn kiểm tra cũng như điều này làm tôi đau đầu. Các nút ấn im lặng làm hoặc không hoạt động ngẫu nhiên sau khi khởi động lại thiết bị. Tôi đã cập nhật bài viết gốc của mình với một dự án mẫu để tất cả chúng ta đều sử dụng giống nhau
ngày

2

Như một giải pháp thay thế Chúng tôi thêm khóa "thông báo" và bên trong "tiêu đề" với chuỗi trống làm giá trị. Đây là đánh thức cuộc gọi lại didReceive trong appDelegate.


1
Điều này dường như hoạt động với tôi cũng như một cách giải quyết để có DuetActivitySchedulerDaemon cho phép thông báo đánh thức ứng dụng, cho đến khi apple sửa lỗi.
Joe Benton

Khi đẩy JSON chứa tiêu đề trống, tôi vẫn nhận được thông báo trên bảng điều khiển "Bỏ qua thông báo không có cảnh báo, âm thanh hoặc huy hiệu ..." {"aps": {"alert": {"title": ""}, "có sẵn nội dung": "1"}, "gcm.message_id": "0 ... bb"} Cấu trúc JSON này có hiệu quả với bạn không?
Olecramoak

bạn không nên gửi 1 (giá trị cho nội dung có sẵn) mà không có dấu ngoặc kép?
elkorb

Đó là cách Google Firebase định dạng Json (phiên bản 1) và nó luôn hoạt động. Chỉ cần iOS 11 với sự vô nghĩa dasd là tạo ra một vấn đề. Bạn có thể vui lòng gửi một ví dụ về một Json đang làm việc cho bạn?
Olecramoak

Vì vậy, những gì tôi đang quan sát trên iOS 11.1 là các chế độ đẩy im lặng sẽ không được cung cấp nếu thiết bị đang chạy bằng pin (không sạc) và mức pin dưới 20%, ngay cả khi chế độ năng lượng thấp KHÔNG được kích hoạt. Điều này tệ đây. Đẩy mạnh im lặng trên iOS 11 hoàn toàn không đáng tin cậy, gần như vô dụng.
Olecramoak

1

Khi viết câu trả lời này, tôi đang đối mặt với cùng một vấn đề giống như câu trả lời của Bill Dunay .

Yêu cầu của tôi là nhận được thông báo im lặng khi ứng dụng ở chế độ nền trước và không có gì khi ứng dụng ở chế độ nền / không chạy. Và cách giải quyết của tôi là điều này. Tôi không sử dụng huy hiệu do đó đặt nó thành 0 không phải là vấn đề đối với tôi.

{
    "aps" : {
        "badge" : 0,
        "sound" : ""
    },
    "mydata": {  
        "foo": "bar"  
    }  
}

Xin lưu ý rằng tôi cố tình không sử dụng "nội dung có sẵn". Cài đặt khiến logic tối ưu hóa của iOS có tác dụng trì hoãn / hủy việc gửi thông báo.


1

Tôi đã nhận được cùng một vấn đề cho một số thông báo (không nhất thiết phải im lặng).

Sau khi xem xét tất cả các bản cập nhật và câu trả lời, tôi có thể thêm hai bản cập nhật có thể giúp:

  • Tôi thấy rằng UIApplication.shared.isRegisteredForRemoteNotificationsphương thức truy cập trong khi nhận được thông báo khiến ứng dụng bị đình trệ mà không báo cáo bất cứ điều gì với Xcode. Kiểm tra xem bạn có đang chạy một số mã sau khi bạn nhận được thông báo truy cập phương thức đó không. ( isRegisteredForRemoteNotutions khóa UI với semaphore_wait_trap ).

    • Tôi phát hiện ra rằng tôi có lỗi phân tích thông báo đẩy trên bảng điều khiển do "title-loc-args" : [3333]không chấp nhận 3333 theo nghĩa đen nhưng chấp nhận nó dưới dạng chuỗi "title-loc-args" : ["3333"]. Điều này làm cho toàn bộ giao diện của tôi bị đình trệ sau khi tôi truy cập phương pháp trên, chỉ trên iOS 11, nó hoạt động trên iOS 12.
  • Tôi cũng phát hiện ra rằng, với cùng một mã, nó hoạt động mà không gặp vấn đề gì trên iOS 12.0 (16A5366a) . Nhưng trên iOS 11 thì điều đó đang xảy ra.


1

Trong trường hợp của tôi, các thông báo im lặng đã được sử dụng để cập nhật ui sau khi công việc được thực hiện trên trang web của máy chủ, vì vậy thật đau đớn khi có nội dung không liên quan trong ứng dụng. Vì tải trọng của chúng tôi cho thông báo im lặng chứa cả tiêu đề và nội dung, tôi thực hiện các phương pháp này để nhận thông báo hoạt động trong ứng dụng đang hoạt động / không hoạt động, không sạc và làm mới Ứng dụng nền bị tắt và ngay cả ở trạng thái Nguồn điện thấp.

Để làm việc này, tôi thêm đại biểu và tạo tiện ích mở rộng với UNUserNotificationCenterDelegategiao thức và phương thức willPresent notification(iOS 10+), được kích hoạt mỗi lần với tải trọng chính xác. Để không hiển thị thông báo khi ứng dụng được kích hoạt, chỉ cần hoàn thành cuộc gọi bằng huy hiệu hoặc âm thanh. Tôi đã kết thúc với một cái gì đó như thế này

    import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // MARK: - Lifecycle
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    //this was only method to handle notifications before
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //process silent notification
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //proces notification when app is active with `notification.request.content.userInfo`
        if UIApplication.shared.applicationState == .active {
            completionHandler(.badge)
        }else {
            completionHandler(.alert)
        }
    }
}

Và để làm việc với các trạng thái này khi ứng dụng ở chế độ nền và thông báo im lặng, đừng gọi phương thức của tôi, tôi nhận thông báo từ trung tâm thông báo trực tiếp applicationDidBecomeActivebằng cách:

UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
            debugLog(message: "unprocessed notification count: \(notifications.count)")
            if notifications.count > 0 {
                notifications.forEach({ (notification) in
                    DispatchQueue.main.async {
                        //handle `notification.request.content.userInfo`
                    }
                })
            }
        }

0

Trong trường hợp của tôi, "Làm mới ứng dụng nền" đã bị tắt trong cài đặt iPhone. Do thông báo đẩy này đã được gửi đến thiết bị nhưng không có trên ứng dụng. Bật ứng dụng nền Làm mới nhận được sự thúc đẩy thầm lặng trong ứng dụng.

Đây có thể không phải là câu trả lời thực sự cho câu hỏi này, chỉ trong trường hợp nếu bất cứ ai cần kiểm tra.

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.