【问题标题】:Synchronize app version & build number in app settings在应用设置中同步应用版本和内部版本号
【发布时间】:2018-02-06 06:50:02
【问题描述】:

我已将Settings.bundle 添加到我的应用程序中以在应用程序设置中添加版本号和内部版本号,并且已正确添加。我遇到的问题是,它总是只获取默认值,之后它不会根据实际应用程序版本和内部版本号的值更新它(即使在运行应用程序之后)。

根.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();
}

我跟随this tutorial实现了这个功能。

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

另一个问题:

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

【问题讨论】:

    标签: c# swift shell xamarin xamarin.ios


    【解决方案1】:

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

    正如您所说,您已经知道NSUserDefaultsSettings.bundle 始终保持同步。您可以通过相同的KeyNSUserDefaults 获取值。但需要注意的是NSUserDefaults会在我们手动修改Settings的值后得到值。

    这意味着您将在第一次启动时获得null。这就是为什么您的教程调用 setVersionAndBuildNumber() 来设置捆绑包中的 NSUserDefaults 值的原因。那么当Settings改变时NSUserDefaults也会改变。

    在你的例子中,你设置了一个类型PSTitleValueSpecifier,所以这个值不能在设置中改变。此外,我们不能也不应该在运行时动态修改它。这是一个关于如何在 Xamarin 上使用 Settings Bundle 的示例,您可以参考它以获取更多详细信息:https://github.com/xamarin/ios-samples/tree/master/AppPrefs

    如何在 Xamarin.iOS 应用中实现自动递增内部版本号?

    正如我们上面所说,嵌入在我们项目中的文件不能在运行时动态修改。每次要归档新的 ipa 时,都应该手动更新它。

    【讨论】:

    • 感谢您的回复,但实际上我相信可以通过代码更改应用程序设置中的内部版本号(而不是通过手动更新 plist 文件)。请检查此 *.com/a/1144754/5746504*.com/a/1061864/5746504 但我需要一种在 Xamarin 中实现相同的方法
    • @MoamenNaanou 正如 Quinn 所说,PlistBuddy 是一个命令行工具。它可以像我们使用 Xcode 一样修改 mac 上的 plist 文件。此外,该操作可能会询问如何在构建时而不是运行时修改 Settings.Bundle。
    【解决方案2】:

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

    1. 在项目目录BuildNumberIncremental.sh新建文件
    2. 从 Visual Studio -> 右键单击​​ Xamarin.iOS 项目 -> 选择选项 -> 在构建节点下选择自定义命令 -> 添加新命令为 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. ${ProjectDir} 替换为您的 Xamarin.iOS 目录。

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

    【讨论】:

      最近更新 更多