服务器到客户端的消息传递是否依赖于APNS?

Eya*_*yal 7 iphone objective-c push-notification apple-push-notifications ios

我正在开发一个消息传递应用程序,我对如何从服务器向客户端发送数据感到困惑.

我正在使用集中式服务器设计,客户端使用该设计NSURLConnection向服务器发送消息,服务器不保留和管理打开的套接字,也无法为其中一个客户端发送消息.因此,客户端使用计时器并每2秒查询服务器以查看新数据是否在等待它们.

这种方法的问题是每2秒轮询一次服务器似乎会非常快地杀死电池,所以我想也许不是客户端轮询服务器,使用APNS*所以当服务器有一些新的信息**为客户端,服务器将向客户端发送推送通知 ***,然后客户端将从服务器获取数据.

*使用APNS - 如果客户端允许,客户端当然可以禁用此选项.因此,我将检查每次应用程序进入前台时是否允许推送,如果不是,我将返回到轮询方法.

** 新信息可以是从短信到服务器管理员消息的任何内容.(并且有很多管理员消息......)
例如,在我的应用程序中,用户可以看到他们的朋友状态(在线/离线),因此如果user1和user2是朋友,而user2只是将他的状态从在线更改为离线,然后服务器需要将此新信息(admin message = user2_offline)发送给user1.

*** 推送通知服务器发送是空的(没有数据/声音),它只是客户端获取新信息的触发器,因此如果推送被发送到客户端并且客户端应用程序关闭,他将不会注意什么.(如果应用程序正在运行,那么它将从服务器获取新信息)

这种方法是否适用于需要大量推送通知用途的大型消息应用程序?

为了更清楚我的主要关注点是:
1.APNS是否足够可靠,我可以将它用作我的核心服务器到客户端消息传递机制?
2.苹果每天会从我的服务器批准数千或数十万个推送通知吗?

ant*_*ntf -1

我在这个领域工作了一段时间,从我的微薄经验来看,我认为你解决问题的方法不会有任何效果。首先请允许我强调有关 APN 特征的一些重要事实:

  1. APN 并不可靠,不能 100% 保证到达客户端。
  2. 根据 Apple 的文档,APN 是尽力而为,因此很多时候它们可能无法到达。
  3. APN 内部不保存数据,因此即使它们到达您的客户端应用程序,内部也不会保存该应用程序的任何数据。
  4. APN 只是通知用户发生了与您的应用程序相关的事情,而消息(显示在 APN 警报框中的文本)由 iOS 而不是您的应用程序处理。这就是为什么 iOS 4 的设备会以与 iOS 5 的设备不同的方式显示 APN,这是操作系统的工作而不是您的应用程序。
  5. 收到通知时应用程序图标上显示的徽章值由您的服务器负责,而不是设备操作系统。换句话说,当 APN 到达设备时,它应该具有应用程序的新通知计数值。操作系统不会为此做任何事情。

话虽如此,我想解释一下通常如何设计此类应用程序。首先,它不是由 URL 连接完成的,并且客户端不会每个时间段都检查服务器。通常,您有一个客户端/服务器架构,其中客户端是设备上的应用程序,服务器是驻留在服务器计算机上的真实服务器程序。服务器可以是 Microsoft(例如使用 C#)或 MAC(使用 Objective C)。服务器有一个数据库,在其中存储信息。一些重要信息(与您的问题相关)是 APN 计数值、您要传递的消息、客户端的状态(在线或离线)。

当一个客户端想要向另一个客户端发送某些内容时,或者当服务器想要向一个客户端(或所有客户端)发送某些内容时,就会检查接收客户端是否在线或离线。如果他在线,则直接发送消息,并且通常通信是在 TCP 套接字上完成的。如果用户离线,服务器将存储需要发送到客户端的消息,增加 APN 计数值,并将 APN 发送给该收件人。当该收件人在线时,服务器会注意到这一点(因为建立了连接并握手),因此将从数据库中获取所有未传递的消息并将其发送给他......

这是一个漫长的过程,我希望我能够向你解释一些事情。在所有情况下,我都不认为你的方法是实用的或能让你完成真正的工作。

  • “APN 内部不保存数据,因此即使它们到达您的客户端应用程序,内部也不会保存该应用程序的任何数据。” 这是不正确的 - 您可以将自己的有效负载放入其中(尽管 APN 的总大小有限制) (3认同)