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

Я добавил 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