MacRuby:如何创建可以从外部配置的应用程序?

时间:2012-01-05 06:16:38

标签: objective-c macruby

我有一个MacRuby应用程序,旨在由其他人定制和分发。该应用程序实际上只有一些可以自定义的东西,但我想找到一种方法来打包应用程序,以便一个人可以运行脚本,指定一些配置选项,并让它设置应用程序配置,以便它已准备好分发给其他人。

例如,我有一个指向URL的字符串。我希望有人能够更改此URL,而无需在XCode中打开项目,也无需重新构建(或重新编译),以便Windows或Linux上的某个人可以进行此更改。

这种事情有可能吗?我是MacRuby和Objective-C的新手,因此可能有一个明显的解决方案,我不知道。

我的解决方案:

我使用名为AppConfig.plist的plist文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>homepage</key>
    <string>http://google.com</string>
</dict>
</plist>

我的App Delegate可以像这样访问它:

config_path = NSBundle.mainBundle.pathForResource('AppConfig', ofType: 'plist')
@config = load_plist File.read(config_path)
# then access the homepage key like this: @config['homepage']

2 个答案:

答案 0 :(得分:1)

是的,像其他应用一样使用CFP参考。然后,您的用户可以使用“defaults write”命令(带有适合您应用的参数)来自定义其行为,而无需修改应用程序本身。

答案 1 :(得分:1)

正如jkh所说,最简单的方法是使用plist。例如,您可以将所需的自定义项存储在项目根目录中的Stuff.plist中,并使用以下命令访问它:

stuff = load_plist File.read(NSBundle.mainBundle.pathForResource('Stuff', ofType: 'plist'))

或者,例如,如果Stuff.plist在您的Resources文件夹中(可能应该在哪里)

stuff = load_plist File.read(NSBundle.mainBundle.pathForResource('Stuff', ofType:'plist', inDirectory:'Resources'))

stuff现在是你的东西的哈希(或NSMutableDictionary)。例如,如果Stuff.plist看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>my_stuff</key>
  <dict>
    <key>favorite_color</key>
    <string>green</string>
    <key>first_car</key>
    <string>Reliant K</string>
        </dict>
        <key>his_stuff</key>
        <dict>
    <key>favorite_color</key>
    <string>blue</string>
    <key>first_car</key>
    <string>240D</string>
        </dict>
  </dict>
  </plist>

您应该能够通过以下方式访问这些值:

    my_favorite_color = stuff[:my_stuff][:favorite_color]

我实际上没有在应用程序包中测试它,但我确实使用macirb测试它。要自己使用它,可以使用以下命令从macirb加载plist文件:

stuff = load_plist File.read('/path/to/Stuff.plist')

MacRuby在内核上实现了load_plist,但没有write_plist或类似的东西,但MacRuby确实在Object上实现了to_plist,所以任何东西都可以作为plist写入磁盘!

File.open('/path/to/new_plist.plist','w'){|f| f.write(['a','b','c'].to_plist)}

给你:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>a</string>
    <string>b</string>
    <string>c</string>
</array>
</plist>

现在,用户可以直接通过plist定义自定义项,已构建的应用程序将在运行时读取值。请注意这一点,因为您不小心eval任何rm *