MacRuby: Как создать приложение, которое можно настроить снаружи? - PullRequest
0 голосов
/ 05 января 2012

У меня есть приложение MacRuby, которое предназначено для настройки и распространения другими людьми.В приложении действительно есть только несколько вещей, которые можно настроить, но я хотел бы найти способ упаковать приложение, чтобы человек мог запустить скрипт, указать несколько параметров конфигурации и настроить его так, чтобычто он готов передать другим.

Например, у меня есть строка, которая указывает на URL.Я хочу, чтобы кто-то мог изменить этот URL-адрес без необходимости открывать проект в XCode и без необходимости перестраивать (или перекомпилировать), чтобы кто-то в Windows или Linux мог внести это изменение.

Это возможно?Я новичок в MacRuby и Objective-C, поэтому может быть очевидное решение, о котором я не знаю.

Мое решение:

Я использовал файл plist с именемAppConfig.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>

И мой делегат приложения мог получить к нему доступ так:

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 ]

1 голос
/ 11 марта 2012

Самый простой способ, как сказал jkh, это использовать plist. Например, вы можете сохранить необходимые настройки в Stuff.plist в корне вашего проекта и получить к нему доступ с помощью следующего:

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

или, если, например, Stuff.plist находится в папке «Ресурсы» (где это, вероятно, должно быть)

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. Чтобы поиграть с ним самостоятельно, вы можете загрузить plist-файл из macirb, используя следующую команду:

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

MacRuby реализует load_plist в ядре, но не write_plist или что-то в этом роде, однако MacRuby реализует to_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 * с.

1 голос
/ 06 января 2012

Да, используйте CFPreferences, как и любое другое приложение.Затем ваши пользователи могут использовать команду «defaults write» (с аргументами, подходящими для вашего приложения), чтобы настроить его поведение без необходимости изменять само приложение.

...