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

我正在开发一个消息应用程序,我有一个关于如何将数据从服务器发送到客户端的困境。

我正在使用一个集中的服务器devise,其中客户端使用NSURLConnection发送消息到服务器,服务器不保留和pipe理打开的套接字,不能发送消息的客户端之一。 因此,客户端使用计时器并每2秒查询一次服务器,以查看是否有新数据正在等待它们。

这种方法的问题是,每2秒钟轮询一次服务器似乎会非常快地closures电池,所以我想可能不是客户端轮询服务器,而是使用APNS *,这样当服务器为客户端提供了一些新的信息时 ,服务器会向客户端发送推送通知 * **,然后客户端将从服务器获取数据。

*使用APNS – 如果客户端允许,客户端当然可以禁用此选项。 所以我会检查每次应用程序进入前台时是否允许推送,如果不是,我将返回到投票方式。

** 新的信息可以是从短信到服务器pipe理消息的任何信息。 (并且有很多pipe理消息…)
例如,在我的应用程序中,用户可以看到他们的好友状态(在线/离线),所以如果user1和user2是好友,并且user2只是将他的状态从在线切换到离线,那么服务器需要发送这个新的信息(admin message = user2_offline )到user1。

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

这种方法是否需要大量的消息应用程序,需要大量的推送通知使用?

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

APNS是否足够可靠,我可以将其用作我的核心服务器到客户端消息机制?

NO 。 只是为了完整,让我重复一下原因。

  1. 苹果公司自己放弃了编程指南的可靠性
  2. 此外,APNS有一个QoS组件,可以以实时为代价提高可靠性(例如,我可以要求APNS在4周内随时发送通知,如果设备无法访问,请重试),这对您的情况没有用处。
  3. 按照您的要求,如果您发送无声推送(推送没有用户可见消息),则无法将其作为高优先级推送进行发送,从而进一步降低可靠性。 这是一个相关的报价

    “无声通知并不意味着保持您的应用程序在后台保持清醒状态,也不是为了获得高优先级的更新.APN将无提示通知视为低优先级,如果总数过多,可能会将其交付完全限制,实际限制是dynamic的,可以根据条件进行更改,但是尽量不要每小时发送几个通知。“

苹果是否会从我的服务器每天批准数千或数十万个推送通知?

一般来说,APNS在负载方面不会有任何问题,但是它已经被限制了,他们可能会限制你的通知,见上面的第3点

恕我直言,你应该看看XMPP,因为这个协议的devise只是像你这样的用例,他们在所有平台上都有广泛的社区支持。 我会build议你看看https://github.com/robbiehanson/XMPPFramework之类的东西,并在你的后台安装一个XMPP服务器,它将处理消息和在线消息以及pipe理消息。

如果您已经评估过XMPP并且不想去使用它,我build议您需要在iOS应用中使用基于App State的不同策略的智能系统,如下所示,您可以采取以下策略

  1. 一个基于实时套接字的方法 – >build立一个永久套接字连接并尽可能保持数据同步(这是当你的应用程序运行到前台或后台时)
  2. 您提到的轮询系统有问题,当您的应用程序被调用用于后台获取/位置更新等时可以使用这个系统。
  3. 如果服务器检测到设备没有活动的套接字,并且在很长一段时间内没有轮询,则使用带有用户可见消息+自定义数据的APNS

我已经在这方面工作了一段时间,从我的经验不足,我认为你解决问题的方法将无处可达。 请允许我首先强调关于APN特征的一些重要事实:

  1. APN不可靠,它们不能100%保证到达客户端。
  2. 从苹果的文档来看,APN是最好的努力 ,很多时候他们可能达不到。
  3. APN不会在内部保存数据,所以即使他们到达您的客户端应用程序,他们也不会在应用程序中留下任何内容。
  4. APN只是为用户发送与您的应用程序相关的事件的通知,而有消息(APN的Alert Box中显示的文本)则由iOS处理,而不是由您的应用程序处理。 这就是为什么具有iOS 4的设备将以与iOS 5设备不同的方式显示APN,而不是您的应用。
  5. 当通知到来时,应用程序图标上显示的徽章值是服务器的责任,而不是设备操作系统。 换句话说,当APN到达设备时,它应该有你的应用程序的新的通知计数值。 操作系统将不会为此做任何事情。

说了一下,我想解释一下通常这样的应用程序是如何devise的。 首先,这不是通过URL连接完成的,客户端不会每隔一段时间检查一次服务器。 通常你有一个客户机/服务器体系结构,你的客户机是设备上的应用程序,而服务器是驻留在服务器机器上的真正的服务器程序。 服务器可以是微软(例如使用C#)或MAC(使用目标C)。 服务器有一个存储信息的数据库。 一些重要的信息(与您的问题有关)是APN计数值,您要传递的消息,客户端的状态,如果在线或离线。

当一个客户端喜欢发送一些东西给另一个客户端,或者当服务器想要发送一些东西给客户端(或所有的客户端)时,检查接收者客户端是否在线或离线。 如果他在线,则直接发送消息,通常在TCP套接字上完成通信。 如果用户处于脱机状态,则服务器将存储需要发送给客户端的消息,增加APN计数值,向该接收者发送APN。 当收件人变为在线时,服务器会注意到(因为有build立的连接和握手),因此将从数据库中提取所有未传递的消息并将其发送给他…

这是一个漫长的过程,我希望我能够向你解释一些事情。 在任何情况下,我都不认为你的方式是实际的,或者使你能够实现真正的工作。