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:fetchCompletionHandler
bất kể trạng thái của ứng dụng (nền / tiền cảnh).
Tôi đã thực hiện UIApplicationDelegete
phương pháp application:didReceiveRemoteNotification:fetchCompletionHandler
và 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 UserNotification
khuô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.
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.
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 33278611
mà 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 DuetActivitySchedulerDaemon
hoặ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
"content-available": 1
và ứng dụng ở phía trước, cuộc gọi lại sẽ không bị hủy.