2016-11-30 16 views
10

Tôi đang phát triển trò chuyện trên iOS với thông báo đẩy và tôi sử dụng Nhắn tin qua đám mây của Firebase nhưng tôi gặp sự cố này:Thông báo đẩy iOS với ứng dụng đã bị giết - swift

Khi ứng dụng bị chết (không phải ở chế độ nền), có cách nhận được cuộc gọi lại từ thông báo để nhận nội dung (tin nhắn trò chuyện)?

Cách duy nhất để nhận tin nhắn và lưu nó trong cơ sở dữ liệu nội bộ là kiểm tra trên máy chủ của tôi khi tôi khởi động ứng dụng nếu có tin nhắn chưa đọc?

Tài liệu về Firebase dường như không rõ ràng về lập luận này. Chỉ khi tôi gửi thông báo im lặng (không có trường "thông báo"), ứng dụng didReceiveRemoteNotification gọi lại được gọi khi tôi mở ứng dụng nhưng tôi chỉ có thể nhận được thông báo cuối cùng. callback này không được gọi trong nền

CẬP NHẬT 2016/02/12:

Sau rất nhiều thử nghiệm, tôi đã liên lạc với hỗ trợ táo và họ đã phản ứng với tôi với email này:

Tôi đang trả lời câu hỏi của bạn về thông báo đẩy nền.

Chủ đề này được thảo luận lần đầu trong phiên WWDC 2013 204 WWDC 2013: Tính năng đa nhiệm mới. Thông báo đẩy im lặng (những thông báo có trọng tải chỉ chứa khóa nội dung khả dụng và không có cảnh báo, huy hiệu, hoặc phím âm thanh) được phân phối chỉ khi iOS xác định rằng tiết kiệm năng lượng để làm như vậy.

Thông báo đẩy với các phím hiển thị của người dùng như cảnh báo, âm thanh hoặc huy hiệu được gửi ở mức độ ưu tiên cao (ưu tiên 10) luôn được hiển thị. Tuy nhiên, nếu thông báo cũng chứa khóa nội dung khả dụng, thông báo có thể bị điều chỉnh và do đó không được gửi đến ứng dụng trong nền trừ khi người dùng nhấn vào thông báo.

Thông báo được gửi ở mức độ ưu tiên thấp (mức độ ưu tiên 5) được điều chỉnh, bất kể tải trọng. Thông báo đẩy im lặng phải luôn được gửi ở mức độ ưu tiên thấp.

Khi phiên WWDC cho biết, bạn có thể mong đợi một vài lần nhấn im lặng thông báo mỗi giờ trên tất cả các ứng dụng trên thiết bị. Nhưng nó hoàn toàn là có thể và phù hợp mà bạn có thể không nhận được gì cả.

Mục đích của ga là để dự đoán khi nào người sử dụng sẽ khởi động một ứng dụng và do đó cho phép hoạt động nền để cập nhật nội dung của ứng dụng trong một cách tiết kiệm năng lượng. Nó cũng ngăn chặn các ứng dụng từ tiêu thụ quá nhiều dữ liệu di động hoặc pin của người dùng với lưu lượng truy cập nền .

Khi pin hoặc ngân sách dữ liệu trên toàn bộ thiết bị đã hết, không có thông báo đẩy nào khác sẽ được gửi đến khi ngân sách được đặt lại. Ngân sách được đặt lại sau mỗi 24 giờ và không thể thay đổi lịch này do hành động của người dùng hoặc nhà phát triển.

Vì các ngân sách này được áp dụng trên tất cả các ứng dụng trên thiết bị, có thể rằng một ứng dụng không phải là của riêng bạn đã cạn hết ngân sách. Bạn có thể kiểm tra mức sử dụng pin chung của một ứng dụng trong Cài đặt> Chung> Cách sử dụng> Sử dụng pin.

Biến tần cũng theo dõi khi thiết bị có kết nối kém mạng , bởi vì nhiều lần cố gắng kết nối với APN khi kết nối mạng là điểm có thể gây mất điện đáng kể. này là lý do phổ biến nhất khiến các thông báo đẩy không đạt được thiết bị . Để kiểm tra xem kết nối mạng kém có ảnh hưởng đến thông báo đẩy của bạn hay không, bạn có thể sử dụng các bước trong Quan sát Trạng thái Đẩy Tin nhắn.

Bộ giảm tốc bị tắt nếu bạn chạy ứng dụng của bạn với trình gỡ lỗi được đính kèm. Điều này cho phép bạn kiểm tra rằng các thông báo của bạn đang được nhận chính xác, nhưng chỉ nên được coi là trường hợp tốt nhất.

Ngoài ra, bắt đầu với iOS 9, người dùng có thể bật điều khiển bất kỳ lúc nào họ muốn bằng cách bật Chế độ điện năng thấp trong Cài đặt> Pin.

Để kiểm tra thông báo đẩy nền, hãy làm theo các bước sau.

  1. Đính kèm thiết bị của bạn vào máy Mac.
  2. Khởi động ứng dụng của bạn từ Xcode.
  3. Khi đã khởi chạy, hãy dừng ứng dụng của bạn từ bên trong Xcode bằng cách nhấp vào nút Dừng (biểu tượng hình vuông ở phía trên bên trái).
  4. Trong Xcode, hãy gỡ lỗi -> Đính kèm quy trình -> [Điền vào tên quy trình để chờ] -> Đính kèm
  5. Gửi thông báo đẩy với nội dung khả dụng: 1 và ứng dụng của bạn sẽ nhận được thông báo mỗi lần.

Bạn có thể sử dụng danh sách quy trình trong Công cụ để xác nhận rằng ứng dụng của bạn đang chạy ở chế độ nền.

Bạn cũng có thể kiểm tra bằng Wi-Fi và thiết bị được cắm vào tường nguồn.

Nếu bạn đang gửi thông báo đẩy im lặng, hãy chắc chắn bạn đang sử dụng APN Provider API hoặc các nhà cung cấp API Binary để bạn có thể thiết lập các ưu tiên thông báo đến 5. (Các ưu tiên mặc định là 10.)

Nếu bạn tin rằng điều chỉnh không hoạt động đúng, vui lòng gửi báo cáo lỗi tại https://developer.apple.com/bug-reporting. Chi tiết của cách hoạt động của công trình điều chỉnh không phải là API công khai, nhưng iOS Engineering xem xét các báo cáo lỗi này và có thể xác định xem thông báo có đang là được điều chỉnh như mong đợi hay không.

Điểm quan trọng là các ứng dụng sẽ không bao giờ được thiết kế mong đợi rằng mọi thông báo đẩy sẽ được nhận. Đây không phải là cách APNs là có ý định làm việc; nó nhằm mục đích thông báo cho người dùng hoặc ứng dụng rằng một số sự kiện đáng chú ý đã xảy ra tại .Ứng dụng được mong đợi hoạt động bình thường, mặc dù có lẽ với chức năng bị hỏng, nếu thông báo đẩy là không nhận được. Người dùng có thể tắt thông báo đẩy hoặc nền cập nhật ứng dụng bất kỳ lúc nào và tất nhiên thông báo đẩy sẽ không được nhận được nếu thiết bị không có kết nối Internet.

Bắt đầu với iOS 7, tất cả các danh mục nền ngoại trừ vị trí và VoIP (trên iOS 9.3 trở lên) hoạt động nhất quán khi người dùng buộc thoát ứng dụng khỏi màn hình đa nhiệm. Một ứng dụng sẽ không được tự động khởi chạy lại cho đến khi người dùng chọn khởi chạy lại nó . Điều này tôn trọng ý định của người dùng không có ứng dụng đang chạy, có thể là một kỹ thuật khôi phục rất quan trọng nếu ứng dụng bị hoạt động sai và gặp sự cố khi khởi chạy.

Nếu bạn đóng ứng dụng đã được định cấu hình để nhận thông báo nền, ứng dụng sẽ không nhận được chúng cho đến khi ứng dụng được mở lại.

Sau email này, tôi đã cố gắng gửi thông báo với Telegram bị giết. Telegram nhận được thông báo đẩy và hiển thị nó nhưng nếu tôi mở ứng dụng sau khi cài đặt chế độ ngoại tuyến, tin nhắn sẽ không được hiển thị trong cuộc trò chuyện (điều này có nghĩa là máy chủ liên lạc điện báo chắc chắn sẽ kiểm tra tin nhắn chưa đọc khi tôi mở nó)! Thay vào đó WhatsApp có thể thêm tin nhắn trong nền vì nó là một ứng dụng VoIP và nó có thể gọi một cuộc gọi lại nền.

Vì vậy, cách duy nhất để thêm tin nhắn là liên hệ với máy chủ và nhận tin nhắn chưa đọc.

Có vấn đề tương tự trong Android nhưng có lẽ bạn có thể giải quyết nó bằng dịch vụ nền (và khởi động lại khi nó bị giết).

Bây giờ tôi phải chọn nếu sử dụng thông báo Đẩy của Apple hoặc thông báo đẩy FCM. Độ tin cậy là như nhau? (Vì, ví dụ, Telegram trong Android sử dụng cả dịch vụ push độc quyền và FCM vì họ nói rằng FCM không đáng tin cậy)

Trả lời

2

01 Ứng dụng nhắn tin trên iOS cần phải kiểm tra trên máy chủ khi chúng khởi chạy để bắt kịp một địa phương cơ sở dữ liệu với trạng thái của máy chủ. Thông báo đẩy không phải là cơ chế phù hợp để sử dụng để giữ cho cơ sở dữ liệu nội bộ iOS của bạn được đồng bộ hóa với máy chủ của bạn.

+0

Ok, nhưng bây giờ tôi có một câu hỏi. Nếu thông báo đẩy không đúng cách để lưu thư trong cơ sở dữ liệu nội bộ, vì trong trường hợp tôi đã mô tả (khi ứng dụng bị giết), gọi lại không được gọi, cách Whatsapp/Telegram/.. . làm? Bởi vì, ví dụ, nếu tôi gửi một tin nhắn đến Whatsapp (khi nó bị giết) thông báo được hiển thị chính xác, như trong ứng dụng của tôi, nhưng nếu sau đó (không mở Whatsapp) tôi đặt chế độ offline trên điện thoại và tôi mở whatsapp tin nhắn được hiển thị chính xác và chắc chắn điện thoại không thực hiện yêu cầu đến máy chủ. Cảm ơn – diegocom

+0

Bạn đã thử cài đặt làm mới ứng dụng nền của thông tin ứng dụng của bạn thành true? –

+0

@ZonilyJame Có, trong plist thông tin của tôi, tôi cũng thiết lập lấy nền và thông báo từ xa – diegocom

Các vấn đề liên quan