【问题标题】:Communication between a Rails web app and a Mac appRails Web 应用程序和 Mac 应用程序之间的通信
【发布时间】:2011-02-03 17:11:08
【问题描述】:

我有一个 Rails Web 应用程序,用于从运行我开发的应用程序的 iOS 设备收集数据。

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

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

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

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

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

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

编辑:

我刚刚了解了NSDistributedNotifications 和分布式通知中心。这听起来像我正在寻找的。​​p>

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

【问题讨论】:

  • 这似乎有点奇怪。为什么 Mac 应用程序不只是充当服务器?为什么要使用 Rails?
  • 我猜是因为 rails 应用程序已经存在。集成 rails 应用的功能需要一些时间和精力,但我想这会是更好的安排,并且可能是解决这个问题的方法。

标签: ruby-on-rails cocoa ipc push-notification


【解决方案1】:

我认为你可以让你的 cocoa 应用程序实现一个服务器来监听本地端口,比如 localhost:28888 ,当你的 rails 应用程序从你的 iOS 应用程序接收数据时,你可以将它发送到 localhost:28888

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我在 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

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

      【讨论】:

        【解决方案4】:

        可能不是最好的想法是“它们都在同一个服务器上,具有相同的用户”,因为有时将来您可能需要对其进行扩展,然后您将不得不重写大量代码。

        如果您继续使用 restful api,您可以将所有内容移动到任何您想要的地方。

        有很多方法可以实现这种 IPC 例如你可以有:socket - socket(2),fifo 文件 - mkfifo(3),共享内存 - shmget(2) 非常简单的解决方案是让 mac 应用程序监听 udp 套接字并等待命令

        这里是 udp echo 的示例:

        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 服务器)

        【讨论】:

          【解决方案5】:

          我认为 NSDistributedNotifications 实现不会对您有所帮助。可能是这里适用的基本概念。您需要在 iPhone 上实现一个 REST-Server 才能检索数据。我不知道有现成的 API 方法可以这样做。

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

          【讨论】:

          • 抱歉,真的延迟响应。但是您似乎误解了我的问题。 “Cocoa 应用程序”是一个 Mac 应用程序,与 rails 应用程序在同一系统上运行。 iOS 应用和 Cocoa 应用在这个问题中是两个独立的实体。 iOS 应用程序本身并没有过多地考虑问题,除了需要知道它在那里并且是系统的一部分。我已经编辑了我的问题以更好地澄清这一点。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多