用于管理推送通知的 iOS API

Posted

技术标签:

【中文标题】用于管理推送通知的 iOS API【英文标题】:iOS API to manage push notifications 【发布时间】:2017-04-06 16:49:36 【问题描述】:

这是一个很长的尝试,但是否有任何公共(或私有)API 允许我们读取 ios 设备上现有的推送通知?例如,在后台运行的应用程序能否每隔 X 秒对系统进行一次检测,以确定设备是否已收到来自 Stack Exchange 应用程序的推送通知并获取其内容?

这里的想法是有些服务(例如 Ring Video Doorbell)还没有公共 REST API。但是,当 Ring 摄像头检测到运动时,它会发送推送通知。与流行的 IFTTT 服务类似,此应用会在设备上获取该通知,然后根据用户设置的标准执行某些操作。

我想至少必须有一个私有 API,因为 Apple 在通知中心显示设备的最近通知。

【问题讨论】:

【参考方案1】:

即使可以使用违反应用安全的不受支持的 API,推送通知的内容也会被加密,您可能无法读取内容。

但是,Apple 的开发者网站提供了有关通过蓝牙中继和交互其他应用程序的推送通知以实现蓝牙 ANCS 的信息。

“Apple 通知中心服务 (ANCS) 的目的是 提供蓝牙配件(通过 蓝牙低功耗链接)一个简单方便的方式来访问许多 在 iOS 设备上生成的各种通知。”

https://developer.apple.com/library/content/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Introduction/Introduction.html#//apple_ref/doc/uid/TP40013460-CH2-SW1

这可能不适用于您,但它是 Apple 认可的用于与其他应用程序交互并将推送通知中继到蓝牙设备的方法。

【讨论】:

这是迄今为止我最喜欢的答案。您至少提供了一个可能的替代方案,而不是简单的“不,不可能”。大多数事情总是有办法做的。无论如何,此应用永远不会发布到商店。 虽然这是一种解释,但我已经回答了另一种可能的解决方案,以及为什么您无法阅读另一个应用程序的纯推送的核心原因(这不是因为它们刚刚加密,隐私明智的 Apple 希望每个应用程序都位于沙箱中,用户授予系统控制的外部权限)。 @TheValyreanGroup 我希望我的回答也有帮助 @TheValyreanGroup:不要忘记通过点击左侧绿色勾下的位来奖励赏金。【参考方案2】:

不,这是不可能的。如果其他应用会读取其他应用的推送通知内容,这似乎是一个隐私问题。

【讨论】:

不知道为什么有人不赞成这个。如果您不喜欢答案,请不要向信使开枪,但这就是答案。以反对票反对。 这似乎是一个合理的否决答案,因为它没有从任何来源获取,而这正是赏金所要求的。 @BHendricks 没有这样的来源。如果是,我肯定会提供它的链接。 这正是我的回答。您了解其他应用程序无法访问您的内容的原因是因为 Apple 的沙箱,无论您是否意识到它都是您可以获取的核心机制 :) 所以@Shmidt 这就是我的第一条评论的来源。 【参考方案3】:

Apple 绝不会提供此类 API 私有/公共,这将违反应用程序的安全性。您只能阅读您的应用程序推送通知。

如果您使用私有 API,您的应用在提交到应用商店时很有可能会被拒绝。

您的应用的一些可能解决方案。

1) 弄清楚您的应用是否可以通过任何方式获得该推送通知。

2) 或者你必须使用应用间通信。

【讨论】:

在纯嗅探推送通知的解释下,这绝对是相当准确的(虽然没有来源)。还有其他获取设备级通知的方法,尽管它们不是严格意义上的“推送通知”,但对于您的应用程序而言,可能会被视为一种类似的更新形式。所有这些都由系统使用您的用户习惯的系统标准权限对话框控制。【参考方案4】:

我将此问题解释为专门从 IFTTT 设备的角度提出问题,该设备已经可以将数据读/写到“标准”IFTTT 应用程序,您想知道这是如何完成的。对我来说,这就是问题所在,而不是问一个骇人听闻的私有 API 推送通知系统。

考虑到这一点,据我所知,该解决方案通常称为HomeKit。它是 Apple 的“工具包”之一,可以找到一般文档 here

我认为您希望做的更多是数据库观察,您可能希望构建存储在设备上的该数据集的一些聚合器应用程序(Apple 有一种询问用户的标准方法权限,并且在系统上完全允许,就像相机/健康/照片权限等)。

在第一个链接的开发人员文档中找到了观察 HomeKit 数据库更改,但找到了 here

我自己之前没有使用过这个,但是从文档中,我可以看到使用常规的旧 iOS KVO 进行观察的方法:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateHomes:) name:@"UpdateHomesNotification" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatePrimaryHome:) name:@"UpdatePrimaryHomeNotification" object:nil];

那里有更多信息,我确信 *** 本身(当然还有旧的 WWDC 视频)有很多关于 HomeKit 的信息。 我希望这是提问者的预期解释。 但是,类似地,每个受支持的事件通道(HealthKit、MapKit 等)都可以向您发送“推送通知”类型的更新,了解您的用户正在使用内置 API 做什么。

如果您尝试简单地从其他应用程序的推送有效负载中读取,那么其他答案是正确的,并且 Apple 对您的应用程序进行沙箱处理纯粹基于隐私是不可能的:Apple Sandbox Docs Link

【讨论】:

很高兴您提供了沙盒文档的链接。顺便说一句,NSNotificationCenter 不是 KVO。 我的意思是 KVO 更多的是被使用的通用范式,但你说得对,我提供的通知中心示例不是 KVO,尽管它在通用机制方面肯定遵循非常相似的模式(中心仍然对事件进行观察,与纯 KVO 相比,它们只是以不同的方式实现)。无论如何,核心思想保持不变,并且也适用于我提到/暗示用于通知和更新原始问题似乎感兴趣的几个工具包的委托模式。再次,我的解释似乎与此 1 中的大多数人完全不同

以上是关于用于管理推送通知的 iOS API的主要内容,如果未能解决你的问题,请参考以下文章

如何从我的 iOS 应用程序中删除推送通知?

用于生产的 iOS 推送通知

ejabberd 和推送通知

删除推送通知 API?

应用在前台时如何触发苹果推送通知事件?

丰富的推送通知不适用于 IOS 中的 FCM