Apple 推送通知 - 收货收据

Posted

技术标签:

【中文标题】Apple 推送通知 - 收货收据【英文标题】:Apple push notifications - delivery receipt 【发布时间】:2013-03-07 20:28:31 【问题描述】:

我编写了一个简单的消息传递系统,它允许以推送通知的形式从 Web 界面向设备发送简短消息。

android 上,一切顺利,一旦设备收到通知,就会将交付确认收据发送回服务器,然后读取确认。显然,交付确认通常发生在应用程序在后台运行或手机处于睡眠状态时。

我为 ios 编写了类似的应用程序。我对那个应用程序感到多么惊讶:当应用程序不活动时,不会调用 didReceiveRemoteNotification!

当应用处于非活动状态时,没有用户交互真的不可能跟踪消息传递吗?其他人建议在服务器上保留消息日志并在应用打开时发送它们,但这仍然需要用户交互。

有没有办法绕过苹果对后台服务的限制?我能否以某种方式让我的应用使用声音或位置服务,以便在后台允许简单的 POST 请求?

【问题讨论】:

【参考方案1】:

在 iOS7 中,您可以使用带有后台获取的推送通知,这是一个设置了内容可用标志的远程通知。有效负载示例:aps: content-available: 1。 在这种情况下,iOS 会唤醒您的应用程序(有一些限制,请参阅:Will iOS launch my app into the background if it was force-quit by the user?)。

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

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

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

我希望这会有所帮助。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我已阅读文档。但该程序的全部目的是确认交付——尤其是在后台运行时。这就是为什么用户会首先下载它。【参考方案3】:

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

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

application 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

【讨论】:

【参考方案4】:

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

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

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

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

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

【讨论】:

这里有更多信息:logisticinfotech.com/blog/…【参考方案5】:

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

检查一下,对于源,点击开发者页面。

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

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

我会说,根据您的需求,制作一个新版本的 Backgrounder,以您需要的方式工作。

【讨论】:

现在这很好,但我无法说服所有用户使用 JB 那里的设备... 有数以百万计的越狱用户,其中数以百万计的用户会很乐意为您的应用付费。我自己花了很多美元来调整我的手机,让它变得更好,苹果永远不会做到。不要因为进入不同的社区而气馁,发布越狱应用非常强大,而且覆盖范围很远!

以上是关于Apple 推送通知 - 收货收据的主要内容,如果未能解决你的问题,请参考以下文章

Apple 推送通知的用户定义声音?

如何使用 Firebase 在 Xamarin 中实现推送通知和使用 C# 后端的 Apple 推送通知

Apple 推送通知 - 查看按钮操作

从 Apple 推送通知中解析数据

使用 APNS 的 Apple 推送通知是不是免费?

Apple 推送通知令牌