通过Ruby访问mac应用程序

时间:2016-01-03 09:09:59

标签: ruby-on-rails ruby macos

我想从Ruby访问适用于Rails应用程序的Mac应用程序数据(通讯簿,邮件)。

this answer上的所有内容似乎已经死亡。我尝试安装RubyOSA,我认为因为错误的Ruby版本而失败了(我从Python过来而且我的知识很简陋)。不再支持appscript。同样RubyCocoa。无论如何,我不想创建可可应用程序(RubyMotion)。

任何人都可以建议我如何启动,例如Ruby中的mac地址簿客户端,可以读写它吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

正如你所说,许多选项已经过时,不再适用。但是,我认为用纯Ruby做这件事很难。我建议你让你的ruby代码能够执行你可以添加到项目中的一些AppleScripts。比如第一个AppleScript代码示例,我已经添加了下面的内容。该脚本将地址簿数据转储到文件中。 vCard格式(https://en.wikipedia.org/wiki/VCard)。

然后查看这个gem,然后再次可以在ruby代码中读取AppleScript创建的文件。 https://github.com/sam-github/vpim

让ruby执行AppleScript文件,再次从临时文件转储数据或从中读取数据不是最佳解决方案,但它应该完成工作。其他选择将更具技术性,最有可能包括ruby扩展写作或更糟糕。

如果您需要编辑地址簿中的数据,我建议您查看下面的第二个AppleScript代码示例。解决此问题的最佳方法可能是制作编辑脚本的模板,并使ruby更改其中的所需值,然后执行脚本。您还可以在此处查看更多高级示例:http://www.macosxtips.co.uk/index_files/bulk-edit-address-book-contacts.php

要执行脚本,请使用" osacript"命令。使用文件作为参数,例如" osacript example.scpt"。或者你可以内联:

osascript -e 'tell application "Contacts" to quit'

从地址簿转储数据:

set myBackupName to "AddressBook.vcf"

-- Add timestamp and Documents path
set myTimeStamp to (year of (current date)) & (month of (current date) as number) & (day of (current date))
set myBackupPath to the (path to the documents folder as string) & myTimeStamp & "-" & myBackupName as string

-- Remove any existing back up file created today
tell application "Finder"
    if exists (file myBackupPath) then
        delete file myBackupPath -- move to trash
    end if
end tell

-- To work on Mac OS X 10.4 - 10.7, change "Contacts" to "Address Book".
tell application "Contacts"

    -- Create an empty file
    set myBackupFile to (open for access file myBackupPath with write permission)

    repeat with per in people
        write (vcard of per as text) to myBackupFile
    end repeat

    -- Close the file
    close access myBackupFile

end tell

更改地址簿中的数据:

tell application "Address Book"
    repeat with i from 1 to (count every person)
        set phoneProperties to properties of phones of person i
        repeat with j from 1 to (count of phoneProperties)
            if value of item j of phoneProperties contains "020 6704 3205" then
                set value of item j of phones of person i to "020 1523 6843"
            end if
        end repeat
    end repeat
    save
end tell