在应用设置中同步应用版本和内部版本号



我已将 Settings.bundle添加到我的应用中,以在应用程序设置中添加版本和构建数字,并且可以正确添加。我遇到的问题是,它始终仅获得默认值,之后它没有根据实际的应用程序版本和构建数字进行更新(即使在运行应用程序之后(。

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>StringsTable</key>
    <string>Root</string>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>DefaultValue</key>
            <string>1.0</string>
            <key>Key</key>
            <string>current_version_number</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
</dict>
</plist>

我创建了此自定义类以更新版本并构建编号:

public static class SettingsBundleHelper
{
    static string AppVersionKey = "current_version_number";
    public static void SetVersionAndBuildNumber()
    {
        string version = NSBundle.MainBundle.ObjectForInfoDictionary("CFBundleShortVersionString").ToString();
        string build = NSBundle.MainBundle.ObjectForInfoDictionary("CFBundleVersion").ToString();
        NSUserDefaults.StandardUserDefaults.SetString(AppVersionKey, $"{version}({build})");
        NSUserDefaults.StandardUserDefaults.Synchronize();
    }
}

应用程序委托:

public override void OnActivated(UIApplication application)
{
    SettingsBundleHelper.SetVersionAndBuildNumber();
}

我遵循本教程实现此功能。

之后,应用程序设置中的版本号始终为 1.0

另一个问题:

如何在Xamarin.iOS应用中实现自动增量构建号?因为我不想每次创建新的ipa时都更新info.plist构建编号。

我认为您的方式是错误的。我们只能从Settings.bundle访问该值,但是我们不能在运行时更改它,因为设置捆绑包位于您的应用程序捆绑包中。

正如您所说,您已经知道NSUserDefaultsSettings.bundle始终保持同步。您可以通过相同的KeyNSUserDefaults获取值。但是您应该注意的是,在我们更改 settings 手动的值之后,NSUserDefaults将获得值。

这意味着您将在第一个启动时间获得null。这就是为什么您的教程调用setVersionAndBuildNumber()从捆绑包设置NSUserDefaults的值的原因。然后,当设置更改NSUserDefaults也会更改。

在您的情况下,您设置了类型的PSTitleValueSpecifier,因此无法在 settings 中更改此值。同样,我们不能也不应该在运行时动态修改它。这是有关如何在Xamarin上使用设置捆绑的示例P>

如何在xamarin.ios应用程序中实现自动增量构建号?

正如我们上面所说,嵌入项目中的文件无法在运行时动态修改。您应该每次要存档新IPA时手动更新它。

我已经通过以下答案实现了所需的要求,因此我仍在使用相同的 Root.plist文件,然后在我的问题中提到,然后实现以下内容:

  1. 在项目目录中创建新文件BuildNumberIncremental.sh
  2. 在Visual Studio->右键单击Xamarin.ios Project->选择"选项" ->在构建节点下选择自定义命令 ->添加新命令为Before Build->在命令字段中添加sh BuildNumberIncremental.sh
  3. 添加以下脚本:

buildnumberincremental.sh

Version_Number=$(/usr/libexec/PlistBuddy ${ProjectDir}/info.plist -c "print :CFBundleShortVersionString")
Build_Number=$(($(/usr/libexec/PlistBuddy ${ProjectDir}/info.plist -c "print :CFBundleVersion") + 1))
Full_Version="$Version_Number(b$((Build_Number + 1)))"
/usr/libexec/PlistBuddy ${ProjectDir}/info.plist -c "set :CFBundleVersion $Build_Number"
/usr/libexec/PlistBuddy ${ProjectDir}/Settings.bundle/Root.plist -c "set PreferenceSpecifiers:0:DefaultValue $Full_Version"
  1. 用您的Xamarin.ios Directory替换${ProjectDir}

现在,每次我构建应用程序时,都会在root.plist中保存新值。1.5(b6)

最新更新