1

I wrote a simple messaging system, which allows sending brief messages from web interface to devices, in form of push notification.

On android, everything went well, once device receives notification is sends delivery confirmation receipt back to server, then read acknowledgement. Obviously, delivery confirmation often happens while app is running in background or phone is asleep.

I wrote similar app for iOS. How surprised I was that application: didReceiveRemoteNotification is not called when app is not active!

Is it really impossible to track message delivery without user interaction when app is not active? Others have suggested keeping log of messages on server and sending them when app opens, but this still requires user interaction.

Is there a way around apple restriction on background services? Can I somehow make my app use sound or location service, to allow simple POST request while in background?

4

5 回答 5

3

在 iOS7 中,您可以使用带有后台获取的推送通知,这是一个设置了 content-available 标志的远程通知。有效负载示例:{aps: {content-available: 1}}。在这种情况下,iOS 将唤醒您的应用程序(有一些限制,请参阅:如果用户强制退出,iOS 会在后台启动我的应用程序吗?)。

唤醒您的应用程序后,您有 30 秒的时间向您的服务器发送推送通知回执确认。您还必须在 Target 后台模式中启用“Background fetch”功能并更新 AppDelegate 以包含此方法:

- (void)application: (UIApplication *)application didReceiveRemoteNotification: 
  (NSDictionary *)userInfo fetchCompletionHandler: 
  (void (^)(UIBackgroundFetchResult))completionHandler

所以这需要你做一些工作。

我希望这有帮助。

于 2014-08-20T20:49:42.150 回答
0

滥用后台服务是让您的应用程序被拒绝的好方法。Apple 对应用程序可以在后台执行的操作非常严格。

作为用户,如果我发现我安装的某个应用无缘无故地在后台发出 Web 请求,它会被迅速删除!

推送通知是一种单向消息 - 甚至无法保证通知已送达,更不用说阅读了。我建议您在此处阅读 APNS 。

于 2013-03-07T20:33:22.093 回答
0

当应用程序不处于活动状态时应用程序:不会调用 didReceiveRemoteNotification 方法。

如果您想在应用程序未处于活动状态时跟踪通知信息,请按照以下步骤操作。

应用程序didFinishLaunchingWithOptions:每次打开应用程序时都会调用该方法

通过这个方法,我们得到了一个叫做launchOptions的NSDictionary对象。从这个 launchOptions 字典中,我们将以字典形式获取键 UIApplicationLaunchOptionsRemoteNotificationKey 的通知数据

从下面找到代码:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSDictionary *remoteNotify = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
//Accept push notification when app is not open
if (remoteNotify)         // it is only true when you get the notification{
    // use the remoteNotify dictionary for notification data}}
于 2014-07-18T13:20:42.017 回答
0

对于 iOS,没有任何直接的方式可以提供有关实际交付的任何信息,但我找到了一种我尝试过的解决方法,它工作正常。

使用“通知服务扩展”,它的主要用途是提供丰富的通知,所以它基本上会在新推送到来时唤醒我们的应用程序,并给大约 30 秒的时间来执行我们的任务,例如下载图像以显示在通知中。我们可以使用这个应用唤醒功能来调用我们的后端。

因此,发送一些带有有效负载的唯一 id,并通过此方法使用推送 id 调用您的后端服务器,通过这种方式,您可以确保推送通知已传递到设备中。

这将适用于应用程序的所有状态,即使在终止状态下也是如此,因此这是完整的证明,我们可以依靠此解决方法来获取交付信息。

参考链接:https ://developer.apple.com/documentation/usernotifications/unnotificationserviceextension

于 2018-08-01T17:51:09.930 回答
-3

http://cydia.saurik.com/package/backgrounder

检查一下,对于源,单击开发人员页面。

如果它不是苹果的方式,那就没有办法了。

这就是越狱的用武之地。您可能必须使您的应用越狱兼容并利用更多功能。

我会说你正在寻找什么,制作一个新版本的Backgrounder,以你需要的方式工作。

于 2013-03-07T20:33:12.967 回答