Простой заголовок в наборе настроек ios - программирование
Подтвердить что ты не робот

Простой заголовок в наборе настроек ios

Я просто хочу вывести номер версии моего приложения ios в файле настроек.

Я понимаю, что мне нужно добавить файл настроек в папку приложения.

Когда я создаю и запускаю, я вижу 4 настройки, которые поставляются со стандартным набором настроек.

Чтобы получить простую строку только для чтения, я изменяю второе значение на следующее

enter image description here

В коде (didFinishLaunchingWithOptions:) Я вызываю следующее:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setValue:version forKey:@"version_number"];
[[NSUserDefaults standardUserDefaults] synchronize];

К моему удивлению, ничего не происходит. Я просто вижу элемент Group, а также переключатель google и слайдер, но не строку заголовка. Кто-нибудь знает, что мне не хватает?

Большое спасибо!

4b9b3361

Ответ 1

Хорошо, у меня тоже была эта проблема. Решение (вроде) должно было предоставить поле значения по умолчанию и дать это значение. Это явно указано в документации. Значение по умолчанию - обязательное поле для свойства Title, поэтому, если вы не укажете его, заголовок не будет отображаться в панели настроек. К сожалению, я не могу, по-видимому, изменить значение после его установки, возможно, также как и было разработано - в документации также указано, что это свойство только для чтения. Решение, которое я собираюсь попробовать, - это просто указать номер версии в моем файле Root.plist каждый раз, когда я создаю новую сборку. SUPER не идеален, но будет работать, я думаю.

РЕДАКТИРОВАТЬ: этот пост об обновлении номера версии в комплекте настроек

EDIT: Хорошо, я получил эту работу (спасибо этому сообщению выше и немного взломал скрипты bash, с которыми у меня было очень мало опыта). Здесь script (который я только что написал inline в фазе построения "Run Script" ):

#!/bin/bash

builtInfoPlistPath=${TARGET_BUILD_DIR}/${INFOPLIST_PATH}

#increment the build number
buildNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$builtInfoPlistPath")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$builtInfoPlistPath"

#compose the version number string
versionString=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$builtInfoPlistPath")
versionString+=" ("
versionString+=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$builtInfoPlistPath")
versionString+=")"

#write the version number string to the settings bundle
#IMPORTANT: this assumes the version number is the first property in the settings bundle!
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue $versionString" "Settings.bundle/Root.plist"

... и это! Работает как шарм! Надеюсь, что это поможет с вашей проблемой, потому что она решила мою проблему. Только проблема теперь - небольшое несоответствие с номером сборки...

EDIT:... который я исправил с помощью второго комментария к этому сообщению, который вместо этого устанавливает путь к info.plist к тому, который уже обработан (перед фазой Run script!)

EDIT: здесь моя более современная версия, находящаяся во внешнем файле, и проверяет, что некоторые исходные файлы были изменены, прежде чем увеличивать номер сборки:

 #!/bin/bash

 #note: for simplicity, it assumed that there already a bundle version (which is an integer) and a version string. set them in the Summary pane!

 #get path to the BUILT .plist, NOT the packaged one! this fixes the off-by-one bug
 builtInfoPlistPath=${TARGET_BUILD_DIR}/${INFOPLIST_PATH}
 echo "using plist at $builtInfoPlistPath"

 modifiedFilesExist=false
 #this is the modification date to compare to -- there a possible bug here, if you edit the built plist directly, for some reason. probably you shouldn't do that anyways.
 compModDate=$(stat -f "%m" "$builtInfoPlistPath")

 for filename in *
 do
     modDate=$(stat -f "%m" "$filename")
     if [ "$modDate" -gt "$compModDate" ]
     then
         modifiedFilesExist=true;
         echo "found newly modified file: $filename"
         break
     fi
 done

 if $modifiedFilesExist
 then
     echo "A file is new, bumping version"

     #increment the build number
     buildNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$builtInfoPlistPath")
     echo "retrieved current build number: $buildNumber"
     buildNumber=$(($buildNumber + 1))
     /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$builtInfoPlistPath"
     /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

     #compose the version number string
     versionString=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$builtInfoPlistPath")
     versionString+=" ("
     versionString+=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$builtInfoPlistPath")
     versionString+=")"

     #write the version number string to the settings bundle
     #IMPORTANT: this assumes the version number is the second property in the settings bundle!
     /usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:1:DefaultValue $versionString" "Settings.bundle/Root.plist"
 else
     echo "Version not incremented -- no newly modified files"
 fi 

Ответ 2

У меня была такая же проблема. Чтобы отобразить свойство Title в Settings.bundle, вам также нужно добавить "Значение по умолчанию" (оно может быть пустым).

1) Щелкните правой кнопкой мыши объект Title (в моем случае это Item 0) и выберите Add Row.

2) В раскрывающемся списке созданной строки выберите "Значение по умолчанию"

enter image description here

3) В didFinishLaunchingWithOptions установите значение NSUserDefaults, которое вы хотите отобразить, например:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:@"0.0.1" forKey:@"appVersion"];
[defaults synchronize];

Результат:

enter image description here

Ответ 3

Вы можете синхронизировать набор настроек с параметром NSUserDefaults, но, как это ни странно, он не работает вначале. Вы должны сначала получить значения из настроек до NSUserDefaults, а затем после этого отредактировать, что вы делаете эти значения в NSUserDefaults, автоматически применяются к набору параметров.

Я ссылался на эту хорошую статью.

EDIT:

Для вашего случая просто сохранить вашу версию, что-то вроде этого будет работать. (Этот пример кода слишком переполнен, но должен быть проще понять поток)

//Get the bundle file
NSString *bPath = [[NSBundle mainBundle] bundlePath];
NSString *settingsPath = [bPath stringByAppendingPathComponent:@"Settings.bundle"];
NSString *plistFile = [settingsPath stringByAppendingPathComponent:@"Root.plist"];

//Get the Preferences Array from the dictionary
NSDictionary *settingsDictionary = [NSDictionary dictionaryWithContentsOfFile:plistFile];
NSArray *preferencesArray = [settingsDictionary objectForKey:@"PreferenceSpecifiers"];

//Save default value of "version_number" in preference to NSUserDefaults 
for(NSDictionary * item in preferencesArray) {
    if([[item objectForKey:@"key"] isEqualToString:@"version_number"]) {
        NSString * defaultValue = [item objectForKey:@"DefaultValue"];
        [[NSUserDefaults standardUserDefaults] setObject:defaultValue forKey:@"version_number"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
}

//Save your real version number to NSUserDefaults
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setValue:version forKey:@"version_number"];
[[NSUserDefaults standardUserDefaults] synchronize];    

Ответ 4

Это сработало для меня:

Измените Root.plist как источник: Щелкните правой кнопкой мыши файл и выберите Open As- > Source Code

Добавьте часть названия:

   <key>PreferenceSpecifiers</key>
        <array>
            <dict>
                <key>DefaultValue</key>
                <string>NoVersion</string>
                <key>Key</key>
                <string>Version</string>
                <key>Title</key>
                <string>Version</string>
                <key>Type</key>
                <string>PSTitleValueSpecifier</string>
            </dict>

И в - (BOOL) приложение: (UIApplication *) приложение didFinishLaunchingWithOptions: (NSDictionary *) launchOptions

Добавьте это:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    [[NSUserDefaults standardUserDefaults] setObject:version forKey:@"Version"];

Он будет работать после того, как приложение будет запущено в первый раз.

Ответ 5

Другое решение, без написания быстрого кода:

1/Создать набор настроек

Это создаст новый раздел для вашего приложения в настройках вашего устройства.

  • Щелкните правой кнопкой мыши название вашего проекта → Новый файл → Пакет настроек

введите описание изображения здесь

2/Измените Root.plist

Это позволит настроить то, что вы хотите отображать в настройках вашего приложения - Внутри вашего нового набора настроек щелкните правой кнопкой мыши Root.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>PreferenceSpecifiers</key>
         <array>
            <dict>
                <key>Title</key>
                <string>About</string>
                <key>Type</key>
                <string>PSGroupSpecifier</string>
            </dict>
            <dict>
                <key>DefaultValue</key>
                <string></string>
                <key>Key</key>
                <string>version_preference</string>
                <key>Title</key>
                <string>Version</string>
                <key>Type</key>
                <string>PSTitleValueSpecifier</string>
            </dict>
        </array>
        <key>StringsTable</key>
        <string>Root</string>
    </dict>
    </plist>
    

3/Создать прогон Script

Это всегда будет выводить версию вашего приложения из Info.plist и отображать его в приложении Настройки

  • Перейдите в свою целевую группу проекта на левой панели и нажмите "Построить фазы"
  • Нажмите кнопку "+" и нажмите "New Run Script Phase"
  • В разделе Newest Run Script скопируйте/вставьте следующее:

    #Getting Current Version
    VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString"   "${PROJECT_DIR}/${INFOPLIST_FILE}")
    
    #Setting the version number in settings
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $VERSIONNUM" <YOUR-APP-NAME>/Settings.bundle/Root.plist
    
  • Просто замените YOUR-APP-NAME своим именем приложения

Ответ 6

NSUserDefaults не записывают никаких значений в файл настроек. Он сохранит данные только в plist пользователя по умолчанию в вашем приложении.

Чтобы сохранить что-то в другом файле, вам придется написать это самостоятельно. Возможно, это поможет:

iOS - Как записать данные в plist?