同步应用版本和在应用设置中构建号码

时间:2018-02-06 06:50:03

标签: c# swift shell xamarin xamarin.ios

我已将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();
    }
}

App Delegate:

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

我按照this tutorial来实现此功能。

此后,应用设置中的版本号始终为1.0

另一个问题:

如何在Xamarin.iOS app中实现自动增量内部版本号?因为每次创建新info.plist时我都不想更新ipa版本号。

2 个答案:

答案 0 :(得分:0)

我认为你走错了路。我们只能访问Settings.bundle中的值,但我们无法在运行时更改它,因为设置包位于应用包的内部。

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

这意味着您将在首次启动时获得null。这就是您的教程调用setVersionAndBuildNumber()来设置来自bundle的NSUserDefaults值的原因。然后当设置更改NSUserDefaults时也会发生变化。

在您的情况下,您设置了类型PSTitleValueSpecifier,因此无法在设置中更改此值。此外,我们不能也不应该在运行时动态修改它。以下是有关如何在Xamarin上使用设置包的示例,您可以参阅它以获取更多详细信息:https://github.com/xamarin/ios-samples/tree/master/AppPrefs

  

如何在Xamarin.iOS app中实现自动增量内部版本号?

如上所述,我们项目中嵌入的文件无法在运行时动态修改。每次要存档新的ipa时,都应手动更新它。

答案 1 :(得分:0)

我已按照this answer实施了所需的内容,因此我仍在使用我的问题中提到的相同Root.plist文件,然后实施以下内容:

  1. 在项目目录BuildNumberIncremental.sh
  2. 中创建新文件
  3. 来自Visual Studio - &gt;右键单击Xamarin.iOS项目 - &gt;选择选项 - &gt;在构建节点下选择自定义命令 - &gt;添加新命令Before Build - &gt;在命令字段中添加sh BuildNumberIncremental.sh
  4. 添加以下脚本:
  5. 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. ${ProjectDir}替换为您的Xamarin.iOS目录。
    2. 现在每次构建应用程序时,它都会在Root.plist中保存新值,即1.5(b6)