我工作的一个消息应用程序,我有一个关于如何从服务器发送数据到客户端的困境。
我使用的是集中式服务器设计,其中客户使用NSURLConnection
将消息发送到服务器,服务器不保存和管理开放式插座,不能为一个客户端发送消息。 因此,客户端使用一个定时器和查询服务器每2秒钟,看看新的数据正等着他们。
这种方法的问题是轮询服务器每隔2秒似乎杀电池非常快,所以我想可能的,而不是客户端轮询服务器, 使用APNS *因此,当服务器有一些新的信息 **为客户端,服务器将发送推送通知 * **给客户端,客户端从服务器获取数据。
*使用APNS -如果客户允许的话,客户当然可以禁用此选项。 所以我会检查是否允许推每次进入应用前景,如果没有,我会回到轮询方法的时间。
** 新的信息可以从短信到服务器管理员的邮件什么。 (也有很多管理信息......)
举例来说,在我的应用程序的用户可以看到他们的朋友的状态(在线/离线),所以如果user1和user2是朋友,和user2只是改变从网上他的状态为脱机状态,则服务器需要发送新信息(管理信息= user2_offline )中的user1。
*** 推送通知服务器将是空的(没有数据/声音),它只是为客户端获取新信息的触发,所以如果一推被发送到客户端和客户端应用程序接近,他不会注意到什么。 (如果应用程序正在运行,那么它会获取来自服务器的新信息)
将这种方法与需要大量的推送通知使用巨型消息应用程序工作吗?
为了更清楚我的主要问题是:
1.是APNS足够可靠的,我可以用它作为我的核心服务器到客户端的消息机制?
2.将苹果批准潜在的几千或几十万推一天通知从我的服务器?
APNS是足够可靠,我可以用它作为我的核心服务器到客户端的消息机制?
NO。 只是为了完全被求让我遍历的原因。
- 苹果本身不承担读取可靠性编程指南
- 此外,APNS,具有QoS的组件,它可以在被实时的成本提高可靠性(对于例如,我可以问APNS至4周之内随时传递通知和重试,如果设备不可达的),这是不是在你的情况下是有用。
按照您的要求,如果你发送一个无声推送(没有用户可见的消息推送),它不能被发送,从而进一步降低了可靠性高优先级推。 下面是相关报价
“沉默的通知并不意味着作为一个方式,让您的应用程序清醒的背景下,也不是意味着高优先级更新。APN的把无声的通知为低优先级,并可能完全节制其交付,如果总人数过多,实际限制是动态的,根据条件可以改变,但尽量不要发送超过每小时几通知了。”
苹果是否会批准潜在的几千或几十万推一天通知从我的服务器?
一般来说,APNS不会有任何这方面的问题,在负载方面,但它在这里已节流,他们可能会扼杀你的通知,请参阅上面第3点
恕我直言,你应该看看XMPP作为该协议设计只用例像你和他们在所有平台上广泛的社会支持。 我会建议你看看像https://github.com/robbiehanson/XMPPFramework和安装在后端的XMPP服务器将处理的消息和状态消息以及管理信息。
如果您已经评价XMPP,不想去用它,我会建议你需要组建一个智能系统,在iOS应用中,其采用基于应用程序状态,像下面不同的策略,你可以有以下策略
- A可实时插座为基础的方法 - >建立您永久套接字连接,并保持同步,尽可能的数据(这是当你的应用程序正在运行到前台或后台)
- 轮询系统您有问题讲了,它可以在您的应用程序调用后台获取可利用/位置更新等。
- 当你的服务器检测到设备没有活动的套接字,也没有对调查很长一段时间使用APNS与用户可见的消息+自定义数据,
我已经在这个领域工作了一段时间,并从我的微薄的经验,我觉得你的方法来解决你的问题将无处找到您。 首先请允许我强调的APN特性一些重要的事实:
- 的APN是不可靠的,他们不是100%保证到达客户端。
- 作为苹果公司的文档,是的APN 最大的努力 ,所以很多时候他们可能无法达到。
- 的APN不要在他们里面保存数据,所以即使他们到达您的客户端应用程序,他们持有在他们里面没有任何的应用程序。
- 的APN是针对涉及您的应用程序的东西已经发生用户只需通知,同时有消息(出现在APN的提示框中的文本)是由iOS的处理,而不是你的应用程序。 这就是为什么与iOS 4设备将在比与iOS 5的设备以不同的方式显示的APN,它是操作系统的工作不是你的应用程序。
- 当通知来对你的应用程序图标将出现在徽章值是您的服务器的责任,而不是设备的操作系统。 换句话说,当一个APN达到它应该有你的应用程序的新通知的计数值的设备。 操作系统不会做这种事。
说了这么多,我想解释一下这样的应用程序是如何通常设计。 首先,它不是由URL连接完成,客户端不检查服务器的每一个时间段。 通常你有一个客户机/服务器架构,其中客户端是设备上的应用程序和服务器是驻留在服务器上一个真正的服务器程序。 所述服务器可以是微软(使用C#例如)或MAC(使用目标C)。 该服务器有它存储在它里面的信息的数据库。 一些重要的信息(与你的问题)是APN的计数值,要传递消息,客户端的状态,如果在线或离线。
当一个客户喜欢送东西到另一个客户端,或当服务器要送东西给客户端(或所有客户端),检查到接收方客户端,看他是否是在线还是离线。 如果他是在网上的消息直接发送,通常在通信上的TCP套接字进行。 如果用户离线,则服务器将存储需要被发送到客户端的消息,增加了APN的计数值,发送APN给该收件人。 当收件人成为在线,服务器会发现,(因为建立连接和握手),因此将会从数据库中获取所有未传递的消息,并将其发送给他...
这是一个漫长的过程,我希望我能够解释的事情有点给你。 在任何情况下,我不认为你的方式是可行的或使你达到真正的工作。