简体   繁体   中英

iOS push notification with killed app - swift

I'm developing an iOS chat with push notifications and I use Firebase Cloud Messaging but I have this problem:

When the app is killed (not in background) there is a way to get a callback from the notification to get the content (the chat message)?

The only way to get a message and save it in the internal database is check on my server when I start the app if there is a unread message?

The documentantion of Firebase doesn't seem very clear on this argument. Only if I send a silent notification (without "notification" field) the app didReceiveRemoteNotification callback was called when I open the app but I can get only last notification. This callback isn't called in background

UPDATE 02/12/2016:

After a lot of tests, I have contacted apple support and they have responded to me with this email:

I'm responding to your question about background push notifications.

This topic was first discussed in the WWDC 2013 session 204 WWDC 2013: What's New with Multitasking. Silent push notifications (those whose payloads contain only the content-available key and no alert, badge, or sound keys) are throttled to be delivered only when iOS determines that it's energy-efficient to do so.

Push notifications with user-visible keys such as alert, sound, or badge sent at high priority (priority 10) are always displayed. However, if the notification also contains the content-available key, the notification may be throttled and thus not be sent to the app in the background unless the user taps the notification.

Notifications sent at low priority (priority 5) are throttled, regardless of payload. Silent push notifications should always be sent at low priority.

As the WWDC session says, you may expect up to several silent push notifications per hour across all apps on a device. But it is entirely possible and appropriate that you may receive none at all.

The purpose of the throttle is to predict when the user will launch an app and thus allow background activity to update the app's content in an energy-efficient manner. It also serves to prevent apps from consuming too much of the user's battery or cellular data with background traffic.

Once the device-wide battery or data budgets have been exhausted, no more background push notifications will be delivered until the budgets are reset. The budgets are reset every 24 hours, and this schedule cannot be changed by user or developer action.

Since these budgets apply across all apps on a device, it's possible that an app other than your own has exhausted the budgets. You can check the overall battery usage of an app in Settings > General > Usage > Battery Usage.

The throttle also tracks when the device has poor network connectivity, because repeated attempts to connect to APNs when network connectivity is spotty can cause significant power drain. This is by far the most common reason why push notifications do not reach a device. To check if poor network connectivity is affecting your push notifications, you can use the steps in Observing Push Status Messages.

The throttle is disabled if you run your app with a debugger attached. This allows you to test that your notifications are being received correctly, but should only be considered a best-case scenario.

Additionally, starting with iOS 9, users have the ability to turn the throttle on any time they please by turning on Low Power Mode in Settings > Battery.

To test background push notifications, follow these steps.

  1. Attach your device to your Mac.
  2. Start your app from Xcode.
  3. When it has launched, stop your app from within Xcode by clicking the Stop button (square icon at upper left).
  4. In Xcode, do Debug -> Attach to Process -> [Fill in Process Name to wait for] -> Attach
  5. Send the push notification with content-available:1 and your app will receive the notification every time.

You can use the process list in Instruments to confirm that your app is running in the background.

You can also test using Wi-Fi and a device that is plugged in to wall power.

If you're sending silent push notifications, be sure you're using the APNs Provider API or the Binary Provider API so you can set the notification priority to 5. (The default priority is 10.)

If you believe throttling is not working properly, please file a bug report at https://developer.apple.com/bug-reporting . The details of how throttling works are not public API, but iOS Engineering looks at these bug reports and can determine if notifications are being throttled as expected.

The important point is that apps should never be designed expecting that every push notification will be received. This is not how APNs is intended to work; it is intended to inform the user or app that some event of interest has occurred. Apps are expected to work properly, albeit perhaps with degraded functionality, if push notifications are not received. The user can turn off push notifications or background app updates at any time, and of course push notifications will not be received if the device doesn't have Internet connectivity.

Starting with iOS 7, all background categories except location and VoIP (on iOS 9.3 and later) behave consistently when a user force-quits an app from the multitasking display. An app will not be launched again automatically until the user chooses to launch it again. This respects the user's intent not to have the app running, which can be a very important recovery technique if an app is misbehaving and crashing on launch.

If you close an app that has been configured to receive background notifications, it won't receive them until it has been reopened.

After this email, I have tried to send a notification with Telegram killed. Telegram receive the push notification and show it but if I open the app after setting the offline mode the message isn't shown in the chat (this mean that surely telegram contact server to check unread message when I open it)! Instead whatsapp can add message in background because it is a VoIP app and it can call a background callback.

So the only way to add message is contact the server and get the unread message.

There is the same problem in android but probably you can solve it with a background service (and restart it when it is killed).

Now I have to choose if use Apple Push notifications or FCM push notifications. The reliability is the same? (Because, for example, Telegram in android uses both a proprietary push service and FCM because they say that FCM isn't very reliable)

Messaging apps on iOS need to check on the server when they launch to catch up a local database with the state of the server. Push notifications are not the right mechanism to use to keep your iOS internal database synchronized with your server.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM