我只想在设置文件中输出我的ios应用程序的版本号。
据我所知,我必须将设置文件添加到应用程序文件夹中。
当我构建并运行时,我可以看到标准设置包附带的4个设置。
为了获得一个简单的只读字符串,我将第二个值更改为以下
在代码中(didFinishLaunchingWithOptions :)我调用以下内容:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setValue:version forKey:@"version_number"];
[[NSUserDefaults standardUserDefaults] synchronize];
令我惊讶的是没有任何事情发生。我只看到Group元素和toogle开关和滑块但没有标题行。谁知道我错过了什么?
非常感谢!
答案 0 :(得分:26)
我有同样的问题。要在Settings.bundle
中显示标题属性,您还需要添加"默认值" (它可能是空的)。
1)右键单击Title对象(在我的例子中是Item 0)并选择Add Row。
2)在创建的行的下拉列表中选择"默认值"
3)在您要显示的didFinishLaunchingWithOptions
设置值NSUserDefaults
中,例如:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:@"0.0.1" forKey:@"appVersion"];
[defaults synchronize];
结果:
答案 1 :(得分:24)
好的,我也有这个问题。解决方案(类型)是提供默认值字段并给出一个值。这实际上在文档中明确说明 - 默认值是Title属性的必填字段,因此如果您不指定它,标题将不会显示在设置窗格中。不幸的是,我似乎无法在设置后更改值,也可能是设计的 - 文档还声明它是一个只读属性。我要尝试的解决方案是每次进行新构建时,只是将版本号明确地放在我的Root.plist文件中。超级不理想,但我认为会有效。
编辑:查看this post on updating version number in settings bundle
编辑:好的,我得到了这个工作(感谢上面的帖子,以及对bash脚本的一点点攻击,我很少有经验。)这是脚本(我刚刚在'Run中内联编写)脚本'构建阶段):
#!/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"
......就是这样!奇迹般有效!希望有助于解决你的问题,因为它解决了我的问题。现在唯一的问题是与内部版本号略有差异......
编辑:...我用vakio's second comment on this post修复了,它将info.plist的路径设置为已处理的路径(在运行脚本阶段之前!)
编辑:这是我的更新版本,它位于外部文件中,并在增加内部版本号之前验证某些源文件是否已更改:
#!/bin/bash
#note: for simplicity, it's assumed that there's 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's 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 :(得分:3)
您可以将“设置”捆绑包同步到NSUserDefaults
,但奇怪的是它一开始并没有。您必须先将“设置”中的值检索到NSUserDefaults
,然后在NSUserDefaults
中对这些值进行的修改会自动应用于“设置”分发包。
我引用了这个nice article。
修改强>
对于您的情况只是为了保存您的版本,这样的事情会起作用。 (这个示例代码在某种程度上是过度的,但应该更容易理解流程)
//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];
答案 3 :(得分:3)
这对我有用:
将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"];
第一次启动应用后,它会正常工作。
答案 4 :(得分:0)
另一个没有编写快速代码的解决方案是:
1 /创建设置包
这会在您设备的设置中为您的应用创建一个新部分
2 /修改Root.plist
这将设置您要在应用设置中显示的内容 - 在新的设置包中,右键单击 Root.plist - &gt;打开为 - &gt;源代码
复制粘贴以下代码:
<?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 /创建运行脚本
这将始终从Info.plist获取您的应用版本,并将其显示在您的应用设置
中在“最新运行脚本”部分中,复制/粘贴以下内容:
#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
只需用您的应用名称
答案 5 :(得分:-1)
NSUserDefaults不会将任何值写入设置文件。它只会在您应用的用户默认值plist中保存数据。
要将内容保存在另一个文件中,您必须自己编写。 也许这会有所帮助: