7

我正在开发一个消息应用程序,我对如何将数据从服务器发送到客户端存在困难。服务器到客户端的消息传递是否依赖于APNS?

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

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

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

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

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

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

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

+0

看一看SocketIO(长轮询)你拥有投票机制。 – Till

回答

-1

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

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

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

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

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

+0

如果有兴趣从客户端/服务器开始使用套接字,您可能有兴趣从[这里]开始阅读(http://stackoverflow.com/questions/10823544/iphone-communication-using-sockets/10824560#10824560) – antf

+2

“APN不会在内部保存数据,因此即使他们到达您的客户端应用程序,他们也不会在应用程序内部留下任何数据。”这是不正确的 - 你可以把你自己的有效载荷放在里面(虽然APN的总大小有限制) – Gruntcakes

+0

首先感谢你的回答,但我认为有一些误解......关于APNS的事实:(1,2 )我知道APNS是最好的努力,服务器可以检查客户是否得到推动,如果不是,他会重新发送。 (3)这是不正确的,我可以用它发送负载,但这不是我的目的,因为我写道:“推送通知服务器发送是空的(没有数据/声音),它只是客户端获取的触发器新的信息“(4,5)我知道但与我的需求无关.. – Eyal

0

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

NO。为了完整起见,让我重复一下原因。

  1. 苹果本身不承担可靠性阅读Programming Guide
  2. 此外,APNS,具有QoS的组件,它可以被实时成本提高可靠性(对于例如,我可以问APNS内随时传递通知4周,如果设备无法访问,请重试),这对您的情况无效。
  3. 根据您的要求,如果您发送无声推送(推送时没有用户可见消息),它将无法作为高优先级推送发送,从而进一步降低可靠性。下面是相关报价

    “沉默的通知并不意味着作为一个方式,让您的应用程序醒着 背景,也不是意味着高优先级更新。APN的 对待无声的通知为低优先级,并可能扼杀他们的 如果总数量变得过多,实际 限制是动态的,可以根据条件变化,但尽量不要发送 每小时发送多个通知。“

将苹果批准潜在的几千或几十万推送通知,每天从我的服务器?

一般来说,APNS不会有负载方面任何与此问题,但它有节流的地方,他们可能会扼杀你的通知,见上面第3点

恕我直言,你应该看看XMPP,因为这个协议的设计只是像你这样的用例,他们有无线de社区在所有平台上的支持。我建议你看看类似https://github.com/robbiehanson/XMPPFramework的东西,并在后端安装一个XMPP服务器,它将处理消息和状态消息以及管理消息。

如果你已经评估过XMPP并且不想去用它,我建议你需要将一个智能系统放在iOS应用程序中,该应用程序采用基于应用程序状态的不同策略,如下所示:策略

  1. A可实时插座为基础的方法 - >建立您永久套接字连接,并保持同步,尽可能的数据(这是当你的应用程序运行到前台或后台)
  2. 轮询系统你说话了有关问题,可以在您的应用程序被调用以用于后台提取/位置更新等时使用。
  3. 使用APNS与用户可见的消息+自定义数据,当您的服务器建立之前检测到设备没有活动的套接字,也没有调查的很长一段时间
相关问题