我正在开发一个消息传递应用程序,我对如何从服务器向客户端发送数据感到困惑。
我正在使用集中式服务器设计,客户端使用NSURLConnection
向服务器发送消息,服务器不保留和管理打开的套接字,也无法为其中一个客户端发送消息。因此,客户端每隔2秒使用一个计时器并查询服务器,以查看新数据是否在等待它们。
这种方法的问题是每2秒轮询一次服务器似乎会非常快地杀死电池,所以我想也许不是客户端轮询服务器,而是使用APNS * 所以当服务器对于客户端有一些新信息 **,服务器会向客户端发送推送通知 * **,然后客户端将获取来自服务器的数据。
*使用APNS - 如果客户端允许,客户端当然可以禁用此选项。因此,我会检查每次应用程序进入前台时是否允许推送,如果不是,我将返回轮询方法。
** 新信息可以是从短信到服务器管理消息的任何内容。 (并且有很多管理员信息...)
例如,在我的应用中,用户可以看到他们的朋友状态(在线/离线),因此如果user1和user2是朋友,而user2只是将他的状态从在线更改为离线,那么服务器需要发送此新信息(admin message = user2_offline )到user1。
*** 推送通知服务器发送为空(没有数据/声音),它是只是客户端获取新信息的触发器,因此如果将推送发送到客户端并且客户端应用程序已关闭,他将不会注意到任何内容。 (如果应用程序正在运行,那么它将从服务器获取新信息)
此方法是否适用于需要大量推送通知的大量消息传递应用程序?
更清楚我的主要关注点是:
1. APNS是否足够可靠,我可以将其用作我的核心服务器到客户端消息传递机制?
2.苹果每天会从我的服务器批准成千上万或数十万次推送通知吗?
答案 0 :(得分:1)
APNS是否足够可靠,我可以将其用作我的核心服务器到客户端消息传递机制?
否即可。只是为了完成,让我重复原因。
根据您的要求,如果您发送静默推送(没有用户可见消息的推送),则无法将其作为高优先级推送发送,这进一步降低了可靠性。这是一个相关的引用
"无声通知并不意味着让您的应用程序保持清醒状态 背景,也不是高优先级更新。的APN 将无声通知视为低优先级,并可能限制它们 如果总数过多,则完全交付。实际上 限制是动态的,可以根据条件改变,但尽量不要 每小时发送一些以上的通知。"
苹果每天会从我的服务器批准数千或数十万次推送通知吗?
一般来说,APNS在加载方面不会出现任何问题,但它有限制并且可能会限制您的通知,请参阅上面的第3点
恕我直言,你应该看一下XMPP,因为这个协议只是像你这样的用例,它们在所有平台上都有广泛的社区支持。我建议您查看https://github.com/robbiehanson/XMPPFramework之类的内容,并在后端设置一个XMPP服务器,它将处理消息和状态消息以及管理消息。如果您已经评估过XMPP并且不想使用它,我建议您需要在iOS App中组合一个智能系统,该系统采用基于App State的不同策略,如下所示,您可以采取以下策略
答案 1 :(得分:-1)
我已经在这个领域工作了一段时间,从我的微薄经验来看,我认为你解决问题的方法无处可及。首先请允许我强调APN特征的一些重要事实:
话虽如此,我想解释一下这些应用程序通常是如何设计的。首先,它不是由URL连接完成的,并且客户端不会在每个时间段检查服务器。通常,您有一个客户端/服务器体系结构,其中您的客户端是设备上的应用程序,服务器是驻留在服务器计算机上的真实服务器程序。服务器可以是Microsoft(例如使用C#)或MAC(使用Objective C)。服务器有一个数据库,用于存储信息。一些重要信息(与您的问题相关)是APN计数值,您要传递的消息,在线或离线时的客户状态。
当客户端喜欢向其他客户端发送内容时,或者当服务器想要向客户端(或所有客户端)发送内容时,将对收件人客户端进行检查以查看他是在线还是离线。如果他在线,则直接发送消息,并且通常在TCP套接字上完成通信。如果用户处于离线状态,则服务器将存储需要发送给客户端的消息,增加APN计数值,将APN发送给该接收者。当该收件人上线时,服务器会注意到(因为已建立连接和握手),因此将从数据库中获取所有未传递的邮件并将其发送给他......
这是一个漫长的过程,我希望我能够向你解释一些事情。在所有情况下,我都不认为你的方式是实用的,或者让你能够达到真正的工作。