Синхронизирайте версията на приложението и номера на компилация в настройките на приложението

Добавих 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? Защото не искам да актуализирам номера на компилация info.plist всеки път, когато създавам нов ipa.


person Moamen Naanou    schedule 06.02.2018    source източник


Отговори (2)


Мисля, че грешите. Можем просто да осъществим достъп до стойността от Settings.bundle, но не можем да я променим по време на изпълнение, тъй като пакетът с настройки се намира в пакета на вашето приложение.

Както казахте, вече знаете, че NSUserDefaults и Settings.bundle винаги са в синхрон. Можете да получите стойността от NSUserDefaults през същия Key. Но това, което трябва да забележите, е, че NSUserDefaults ще получи стойността, след като променим ръчно стойността на Настройки.

Това означава, че ще получите null при първото стартиране. Ето защо вашият урок извиква setVersionAndBuildNumber(), за да зададе стойността на NSUserDefaults от пакета. След това, когато Настройките се променят, NSUserDefaults също се променя.

Във вашия случай сте задали тип PSTitleValueSpecifier, така че тази стойност не може да бъде променена в Настройки. Също така не можем и не трябва да го променяме динамично по време на изпълнение. Ето пример за това как да използвате Пакет настройки на Xamarin, можете да го разгледате за повече подробности: https://github.com/xamarin/ios-samples/tree/master/AppPrefs

Как да внедрим номера на компилация с автоматично нарастване в приложението Xamarin.iOS?

Както казахме по-горе, файлът, вграден в нашия проект, не може да се променя динамично по време на изпълнение. Трябва да го актуализирате ръчно всеки път, когато искате да архивирате нов ipa.

person Anonymous    schedule 07.02.2018
comment
Благодаря за отговора ви, но всъщност вярвам, че е възможно да промените номера на компилация в настройките на приложението от код (не чрез ръчно актуализиране на plist файла). Моля, проверете това stackoverflow.com/a/1144754/5746504 и stackoverflow.com/a/1061864/5746504 Но имам нужда от начин да внедря същото в Xamarin - person Moamen Naanou; 07.02.2018
comment
@MoamenNaanou Както каза Куин, PlistBuddy е инструмент за команден ред. може да модифицира plist файл на mac точно както можем да правим с Xcode. Също така тази операция може да попита как да промените Settings.Bundle по време на изграждане, а не по време на изпълнение. - person Anonymous; 07.02.2018

Приложих изискваното, като следвах този отговор, така че все още използвам същия 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)

person Moamen Naanou    schedule 08.02.2018