2011-02-03 125 views
3

我有一个Rails网络应用程序,用于从运行我开发的应用程序的iOS设备收集数据。Rails网络应用程序和Mac应用程序之间的通信

Rails Web服务器将处理与Apple推送通知服务的通信,因此iOS应用程序将向其发送所需的设备令牌和其他特定于应用程序的数据。

Mac应用程序将与Rails应用程序通信以将消息推送到iOS设备。 Mac应用程序和Rails网络应用程序都将在相同的Mac服务器上运行,使用相同的用户帐户。

iPhone和Mac应用程序与Rails网络应用程序之间的通信将使用Web应用程序公开的RESTful Web服务完成。

一旦iOS应用程序将其数据发送到Rails Web服务,我需要将该数据发送到Mac应用程序,该应用程序将与Rails Web应用程序在同一服务器上运行,以便它知道哪些消息需要被推到哪里以及他们应该被推到哪里。

如果我想在同一个盒子上的Rails Web应用程序和Mac应用程序之间进行通信,应该寻找什么?

我已经研究了从Mac应用程序通过RESTful服务轮询web应用程序,但我不认为这是最优雅或有效的解决方案。有什么方法可以从Ruby的Mac应用程序调用某些操作?

编辑:

我刚刚看了一下NSDistributedNotifications和分布式通知中心。这听起来像我在找什么。

是否可以使用Rails应用程序中的RubyCocoa发送分布式通知并让Mac应用程序监听此通知?

+0

这似乎有点奇怪的安排。为什么Mac应用程序不能充当服务器?为什么要使用Rails? – 2011-11-30 05:04:04

+0

我想因为rails应用程序已经存在。集成rails应用程序的功能需要花费一些时间和精力,但我想这应该是更好的安排,并且可能是解决这个问题的方法。 – Jasarien 2011-11-30 09:22:49

回答

2

我觉得你可以让你的可可应用程序实现其监听本地端口像本地主机服务器:28888,虽然Rails应用程序从您的iOS应用接收数据,你可以发送到本地主机:28888

0

我不认为NSDistributedNotifications实施将帮助你。可能这里的基本概念是可应用的。您需要在iPhone上实现REST服务器以检索数据。我不知道现成的API方式。

请纠正我,如果我是正确的!

2

也许不是最好的解决方案,但是如果Rails应用程序可以将通知数据写入轻量级本地数据库,或者只写入特定本地目录中的纯文本文件,并让Mac应用程序及时读取数据,那么数据已经读取可以被删除或移动到另一个表/目录。这可能是一个临时解决方案,理想的解决方案应该是Rob提到的单个Mac Web应用程序。

2

我在OS X上没有任何这方面的个人经验,所以请带上一粒盐。

如果您的应用程序的主要对象符合KVC/KVO标准,您可以将其属性暴露给AppleScript,并使用Ruby的脚本桥改变Mac应用程序属性的值。

然后,在应用程序内部,您可以听取这些属性并采取相应措施。

如果该应用程序是基于文档开发的,那么KVC/KVO的许多遵从性和暴露于AppleScript将会自动进行。请参阅:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ScriptableCocoaApplications/SApps_implement/SAppsImplement.html#//apple_ref/doc/uid/20000037-BBCJEEEC

另一方面,如果应用程序是作为单窗口应用程序开发的,则必须自己实施脚本支持。

1

也许这不是最好的想法,他们都在同一台服务器上用同一个用户进行中继,因为有时在将来你可能需要调整它,然后你将不得不重新编写大块的代码。

如果您继续使用宁静的apis,您可以随意移动任何地方。

有很多方法可以做到这种IPC的寿 例如,你可以有:插座 - 插座(2),FIFO文件 - mkfifo(3),共享内存 - shmget的(2) 非常简单的解决方案是让Mac应用程序监听UDP套接字,并等待命令

这里是UDP回应的例子:

http://developer.apple.com/library/mac/#samplecode/UDPEcho/Listings/UDPEcho_m.html#//apple_ref/doc/uid/DTS40009660-UDPEcho_m-DontLinkElementID_5

更简单的是mkfifo:

$ mkfifo /tmp/app_communication_fifo 
$ echo 'rails app message' > /tmp/app_communication_fifo & #this will block until somebody reads it 
[1] 34415 
$ cat /tmp/app_communication_fifo 
rails app message 
[1]+ Done 

但我会推荐udp服务器或者只是坚持使用restful api,因为你可以按照你想要的那样扩展它(希望当你有数百万用户时你可以创建更多的rails前端,并且他们都可以发送消息到mac服务器)

相关问题