我有一个Rails网络应用程序,用于从运行我开发的应用程序的iOS设备收集数据。
Rails Web服务器将处理与Apple推送通知服务的通信,因此iOS应用程序将向其发送所需的设备令牌和一些其他特定于应用程序的数据。
Mac应用程序将与Rails应用程序通信以将消息推送到iOS设备。 Mac应用程序和Rails Web应用程序都将在同一个用户帐户下的同一台Mac服务器上运行。
iPhone和Mac应用程序与Rails Web应用程序之间的通信将使用Web应用程序公开的RESTful Web服务完成。
一旦iOS应用程序将其数据发送到Rails Web服务,我需要将这些数据发送到将与Rails Web应用程序在同一服务器上运行的Mac App,以便它知道需要哪些消息被推,应该被推到哪里。
如果我想在同一个盒子上的Rails网络应用程序和Mac应用程序之间进行通信,我应该寻找什么?
我已经考虑通过RESTful服务从Mac应用程序轮询Web应用程序,但我不认为这是最优雅或最有效的解决方案。有什么办法可以从Ruby的Mac应用程序中调用一些动作吗?
修改
我刚刚阅读了NSDistributedNotifications
和分布式通知中心。这听起来像我正在寻找的。 p>
是否可以使用Rails应用程序中的RubyCocoa发送分布式通知并让Mac应用程序监听此通知?
答案 0 :(得分:2)
我认为你可以让你的cocoa app实现一个服务器来监听localhost:28888这样的本地端口,当你的rails应用程序从你的iOS应用程序接收数据时,你可以将它发送到localhost:28888
答案 1 :(得分:2)
也许不是最好的解决方案,但是如果Rails应用程序可以将通知数据写入轻量级本地数据库或只是将特定本地目录中的纯文本文件写入,并让您的Mac应用程序及时读取数据,数据已被读取可以删除或移动到另一个表/目录。这可能是一个临时解决方案,理想的解决方案应该是Rob提到的单个Mac网络应用程序。
答案 2 :(得分: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
另一方面,如果应用程序是作为单窗口应用程序开发的,则必须自己实现脚本支持。
答案 3 :(得分:1)
或许最好的做法是继续'他们在同一个服务器上使用同一个用户',因为有时将来你可能需要扩展它,然后你将不得不重写大块的代码。
如果您继续使用restful apis,您可以将所有内容移动到任何地方。
有很多方法可以做这种IPC 例如,你可以有:socket - socket(2),fifo文件 - mkfifo(3),共享内存 - shmget(2) 非常简单的解决方案是让mac app监听udp socket并等待命令
这是udp echo的一个例子:
更简单的是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服务器)
答案 4 :(得分:0)
我认为NSDistributedNotifications实施不会对您有所帮助。可能是潜在的概念在这里适用。您需要在iPhone上实现REST服务器才能检索数据。我不知道现成的API方法。
如果我是对的,请纠正我!