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ởi application: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 actions
  • badge
  • 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

  1. Ứ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
  1. Ứng dụng ở trạng tháiBackground
  • Alert của hệ thống được hiện thị
  • application:didReceiveRemoteNotification:fetchCompletionHandler: được gọi
  1. Ứ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
  1. Ứ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ỏi Payload
  1. Ứ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
  1. Ứ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
  1. Ứ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: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 Suspendedapplication: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.