Простой заголовок в наборе настроек 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 и слайдер, но не строку заголовка. Кто-нибудь знает, что мне не хватает?
Большое спасибо!
Ответы
Ответ 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?