Cách xử lý notification với chế độ background
Bài đăng này đã không được cập nhật trong 6 năm
Thông báo đẩy iOS đã phát triển rất nhiều trong nhiều năm, từ việc bắt đầu bằng việc 1 chuỗi thông báo đến thiết bị thì ngày nay chung ta đã có thể tuỷ chỉnh các hành động, đa ngôn ngữ và chế độ background
Bài đăng này là để giải thích điều gì sẽ xảy ra khi gửi thông báo đến 1 thiết bị.
1.Which delegate method is called?
Đó là câu hỏi để trả lời khi gửi 1 notification đến thiết bị
3 điều có thể xảy xa:
application:didReceiveRemoteNotification:fetchCompletionHandler:
application:didFinishLaunchingWithOptions:
- Không điều gì sẽ xảy ra Có các phương thức gọi lại khác trong UIApplicationDelegate, nhưng chúng ta bỏ qua chúng trong bài viết này trừ khi nó là cần thiết. Cụ thể là:
application:didReceiveRemoteNotification:
Đây là API ban đầu khi dịch vụ gửi thông báo được khởi chạy (iOS 3.0), nhưng bây giờ nó được superceded bởiapplication:didReceiveRemoteNotification:fetchCompletionHandler:
application:handleActionWithIdentifier:forRemoteNotification:completionHandler:
2.Configuring The Payload & Silent Push
Nội dung gửi thông báo bao gồm:
alert
- the alert string and actionsbadge
sound
content-available
content-available
là một tính năng mới, và chính là chìa khóa có thể kích hoạt chế độ slient push trong gửi thông báo. Để kịch hoạt chế độ này trong ứng dụng, bạn cần check vào remote-notification
trong UIBackgroundModes
.
Điều gì xảy ra khi content-available
tồn tại trong payload:
- Nếu ứng dụng bị Suspended hệ thống sẽ đưa nó vào Background
- Nếu ứng dụng đã bị người dùng hủy, không có gì xảy ra và ứng dụng vẫn còn trong Not Running Bạn khởi chạy nó với gán content-available = 1.Nhưng không phải vô hiệu nó bằng việc gán lại bằng 0, mà phải xoá nó ra khỏi Payload
3.Playing out the Scenarios
Với content-available
được bật
- Ứng dụng ở trạng thái Foreground
- Alert của hệ thống không được hiện thị
application:didReceiveRemoteNotification:fetchCompletionHandler:
được gọi
- Ứng dụng ở trạng tháiBackground
- Alert của hệ thống được hiện thị
application:didReceiveRemoteNotification:fetchCompletionHandler:
được gọi
- Ứng dụng ở trạng thái Suspended
- Ứng dụng sẽ chuyển qua trạng thái Background
- Alert của hệ thống được hiện thị
application:didReceiveRemoteNotification:fetchCompletionHandler:
được gọi
- Ứng dụng ở trạng tháiNot Running bởi vì được tắt bởi user
- Alert của hệ thống được hiện thị
- Không phương thức nào được gọi
Với
content-available
được xoá khỏiPayload
- Ứng dụng ở trạng thái Foreground
- Alert của hệ thống không được hiện thị
application:didReceiveRemoteNotification:fetchCompletionHandler:
được gọi
- Ứng dụng ở trạng thái Suspended hoặc Background
- Alert của hệ thống được hiện thị
- Không phương thức nào được gọi, nhưng nếu người dùng tap vào alert của notification thì ứng dụng sẽ được khởi động và
application:didReceiveRemoteNotification:fetchCompletionHandler:
được gọi
- Ứng dụng ở trạng thái Not Running bởi vì được tắt bởi user
- Alert của hệ thống được hiện thị
- Không phương thức nào được gọi, nhưng nếu người dùng tap vào alert của notification thì ứng dụng sẽ được khởi động thì
application:didFinishLaunchingWithOptions:
vàapplication:didReceiveRemoteNotification:fetchCompletionHandler:
sẽ đồng thời được gọi
Phần kết luận
Nếu ứng dụng ở Foreground, hệ thống sẽ không hiển thị cảnh báo và nó phụ thuộc vào ứng dụng để hiển thị UI sau khi application:didReceiveRemoteNotification:fetchCompletionHandler:
được gọi
Bật content-available
và đưa ứng dụng xuống Background (trừ khi ứng dụng đã bị người dùng hủy) và khi đó application:didReceiveRemoteNotification:fetchCompletionHandler:
được gọi ngay lập tức
Trong khi content-available
không có, ứng dụng sẽ vẫn ở trạng thái Suspended và application:didReceiveRemoteNotification:fetchCompletionHandler:
bị trì hoãn cho đến khi ứng dụng được mở.
Cuối cùng, application:didFinishLaunchingWithOptions:
chỉ được gọi khi ứng dụng ở trạng thái Not Running và người dùng nhấn vào alert. Sau đó nó sẽ gọi application:didReceiveRemoteNotification:fetchCompletionHandler:
. Do đó, tốt hơn là xử lý việc được đưa vào trong application:didReceiveRemoteNotification:fetchCompletionHandler:
, vì nó bao gồm tất cả các kịch bản.
All rights reserved