Xamarin.Forms uygulamasından .NET MAUI uygulamasına sürüm izleme verilerini geçirme
Xamarin.Essentials ve .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI), uygulamanın sürümünü ve derleme numaralarını denetlemenize olanak tanıyan bir VersionTracking
sınıfa ve uygulamanın ilk kez başlatılmış olması gibi ek bilgilere sahiptir. Bununla birlikte, Xamarin.Essentials'ta sürüm izleme verileri adlı {your-app-package-id}.xamarinessentials.versiontracking
platforma özgü tercihler kapsayıcısında depolanırken.NET MAUI'de sürüm izleme verileri adlı {your-app-package-id}.microsoft.maui.essentials.versiontracking
platforma özgü tercihler kapsayıcısında depolanır.
sınıfını VersionTracking
kullanan bir Xamarin.Forms uygulamasını .NET MAUI'ye geçirirken, kullanıcılara sorunsuz bir yükseltme deneyimi sağlamak için bu tercihler kapsayıcı adlandırma farkıyla ilgilenmeniz gerekir. Bu makalede, tercihler kapsayıcısıyla LegacyVersionTracking
başa çıkmak için sınıf ve yardımcı sınıflarını nasıl kullanabileceğiniz açıklanmaktadır. sınıfı, LegacyVersionTracking
Android, iOS ve Windows üzerinde .NET MAUI uygulamanızın uygulamanızın önceki bir Xamarin.Forms sürümüyle oluşturulan sürüm izleme verilerini okumasını sağlar.
Önemli
Sınıfın LegacyVersionTracking
düzgün çalışması için .NET MAUI uygulamanızın, Xamarin.Forms uygulamanızın sürüm numarasından daha yüksek bir sürüm numarasına sahip olması gerekir. Sürüm numarası, .NET MAUI uygulamanızın proje dosyasında ve $(ApplicationDisplayVersion)
derleme özellikleriyle $(ApplicationVersion)
ayarlanabilir.
Xamarin.Essentials'taki sınıf hakkında VersionTracking
daha fazla bilgi için bkz . Xamarin.Essentials: Sürüm izleme. .NET MAUI sınıfı hakkında VersionTracking daha fazla bilgi için bkz . Sürüm izleme.
Eski sürüm izleme verilerine erişme
Aşağıdaki kod, Xamarin.Forms uygulamanız tarafından oluşturulan sürüm izleme verilerine erişim sağlayan sınıfını gösterir LegacyVersionTracking
:
Not
Bu kodu kullanmak için .NET MAUI uygulama projenizde adlı LegacyVersionTracking
bir sınıfa ekleyin.
namespace MigrationHelpers;
public static class LegacyVersionTracking
{
const string versionsKey = "VersionTracking.Versions";
const string buildsKey = "VersionTracking.Builds";
static readonly string sharedName = LegacyPreferences.GetPrivatePreferencesSharedName("versiontracking");
static Dictionary<string, List<string>> versionTrail;
static string LastInstalledVersion => versionTrail[versionsKey].LastOrDefault();
static string LastInstalledBuild => versionTrail[buildsKey].LastOrDefault();
public static string VersionsKey => versionsKey;
public static string BuildsKey => buildsKey;
public static string SharedName => sharedName;
public static bool IsFirstLaunchEver { get; private set; }
public static bool IsFirstLaunchForCurrentVersion { get; private set; }
public static bool IsFirstLaunchForCurrentBuild { get; private set; }
public static string CurrentVersion => AppInfo.VersionString;
public static string CurrentBuild => AppInfo.BuildString;
public static string PreviousVersion => GetPrevious(versionsKey);
public static string PreviousBuild => GetPrevious(buildsKey);
public static string FirstInstalledVersion => versionTrail[versionsKey].FirstOrDefault();
public static string FirstInstalledBuild => versionTrail[buildsKey].FirstOrDefault();
public static IEnumerable<string> VersionHistory => versionTrail[versionsKey].ToArray();
public static IEnumerable<string> BuildHistory => versionTrail[buildsKey].ToArray();
public static bool IsFirstLaunchForVersion(string version) => CurrentVersion == version && IsFirstLaunchForCurrentVersion;
public static bool IsFirstLaunchForBuild(string build) => CurrentBuild == build && IsFirstLaunchForCurrentBuild;
static LegacyVersionTracking()
{
InitVersionTracking();
}
internal static void InitVersionTracking()
{
IsFirstLaunchEver = !LegacyPreferences.ContainsKey(versionsKey, sharedName) || !LegacyPreferences.ContainsKey(buildsKey, sharedName);
if (IsFirstLaunchEver)
{
versionTrail = new Dictionary<string, List<string>>
{
{ versionsKey, new List<string>() },
{ buildsKey, new List<string>() }
};
}
else
{
versionTrail = new Dictionary<string, List<string>>
{
{ versionsKey, ReadHistory(versionsKey).ToList() },
{ buildsKey, ReadHistory(buildsKey).ToList() }
};
}
IsFirstLaunchForCurrentVersion = !versionTrail[versionsKey].Contains(CurrentVersion) || CurrentVersion != LastInstalledVersion;
if (IsFirstLaunchForCurrentVersion)
{
// Avoid duplicates and move current version to end of list if already present
versionTrail[versionsKey].RemoveAll(v => v == CurrentVersion);
versionTrail[versionsKey].Add(CurrentVersion);
}
IsFirstLaunchForCurrentBuild = !versionTrail[buildsKey].Contains(CurrentBuild) || CurrentBuild != LastInstalledBuild;
if (IsFirstLaunchForCurrentBuild)
{
// Avoid duplicates and move current build to end of list if already present
versionTrail[buildsKey].RemoveAll(b => b == CurrentBuild);
versionTrail[buildsKey].Add(CurrentBuild);
}
}
static string GetPrevious(string key)
{
var trail = versionTrail[key];
return (trail.Count >= 2) ? trail[trail.Count - 2] : null;
}
static string[] ReadHistory(string key) => LegacyPreferences.Get(key, null, sharedName)?.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries) ?? new string[0];
}
LegacyVersionTracking
sınıfı, Xamarin.Forms uygulamanızdan Xamarin.Essentials Preferences
sınıfı tarafından depolanan sürüm izleme verilerine erişim sağlayan sınıfını kullanırLegacyPreferences
:
Not
Bu kodu kullanmak için .NET MAUI uygulama projenizde adlı LegacyPreferences
bir sınıfa ekleyin.
#if ANDROID || IOS || WINDOWS
namespace MigrationHelpers;
public static partial class LegacyPreferences
{
internal static string GetPrivatePreferencesSharedName(string feature) => $"{AppInfo.PackageName}.xamarinessentials.{feature}";
public static bool ContainsKey(string key, string sharedName) => PlatformContainsKey(key, sharedName);
public static void Remove(string key, string sharedName) => PlatformRemove(key, sharedName);
public static string Get(string key, string defaultValue, string sharedName) => PlatformGet<string>(key, defaultValue, sharedName);
}
#endif
sınıfı LegacyPreferences
, kalan uygulaması platforma özgü olan bir partial
sınıftır.
Android
Android'de LegacyPreferences
sınıfı, paylaşılan tercihlerden veri alan tercihler kapsayıcısı uygulamasını sağlar. Aşağıdaki kod sınıfını LegacyPreferences
gösterir:
Not
Bu kodu kullanmak için.NET MAUI uygulama projenizin Platforms\Android klasöründe adlı LegacyPreferences
bir sınıfa ekleyin.
using System.Globalization;
using Android.Content;
using Android.Preferences;
using Application = Android.App.Application;
namespace MigrationHelpers;
public static partial class LegacyPreferences
{
static readonly object locker = new object();
static bool PlatformContainsKey(string key, string sharedName)
{
lock (locker)
{
using (var sharedPreferences = GetSharedPreferences(sharedName))
{
return sharedPreferences.Contains(key);
}
}
}
static void PlatformRemove(string key, string sharedName)
{
lock (locker)
{
using (var sharedPreferences = GetSharedPreferences(sharedName))
using (var editor = sharedPreferences.Edit())
{
editor.Remove(key).Apply();
}
}
}
static T PlatformGet<T>(string key, T defaultValue, string sharedName)
{
lock (locker)
{
object value = null;
using (var sharedPreferences = GetSharedPreferences(sharedName))
{
if (defaultValue == null)
{
value = sharedPreferences.GetString(key, null);
}
else
{
switch (defaultValue)
{
case int i:
value = sharedPreferences.GetInt(key, i);
break;
case bool b:
value = sharedPreferences.GetBoolean(key, b);
break;
case long l:
value = sharedPreferences.GetLong(key, l);
break;
case double d:
var savedDouble = sharedPreferences.GetString(key, null);
if (string.IsNullOrWhiteSpace(savedDouble))
{
value = defaultValue;
}
else
{
if (!double.TryParse(savedDouble, NumberStyles.Number | NumberStyles.AllowExponent, CultureInfo.InvariantCulture, out var outDouble))
{
var maxString = Convert.ToString(double.MaxValue, CultureInfo.InvariantCulture);
outDouble = savedDouble.Equals(maxString) ? double.MaxValue : double.MinValue;
}
value = outDouble;
}
break;
case float f:
value = sharedPreferences.GetFloat(key, f);
break;
case string s:
// the case when the string is not null
value = sharedPreferences.GetString(key, s);
break;
}
}
}
return (T)value;
}
}
static ISharedPreferences GetSharedPreferences(string sharedName)
{
var context = Application.Context;
return string.IsNullOrWhiteSpace(sharedName) ?
#pragma warning disable CS0618 // Type or member is obsolete
PreferenceManager.GetDefaultSharedPreferences(context) :
#pragma warning restore CS0618 // Type or member is obsolete
context.GetSharedPreferences(sharedName, FileCreationMode.Private);
}
}
iOS
iOS'ta LegacyPreferences
sınıfı, öğesinden NSUserDefaults
veri alan tercihler kapsayıcısı uygulamasını sağlar. Aşağıdaki kod sınıfını LegacyPreferences
gösterir:
Not
Bu kodu kullanmak için,.NET MAUI uygulama projenizin Platforms\iOS klasöründe adlı LegacyPreferences
bir sınıfa ekleyin.
using Foundation;
using System.Globalization;
namespace MigrationHelpers;
public static partial class LegacyPreferences
{
static readonly object locker = new object();
static bool PlatformContainsKey(string key, string sharedName)
{
lock (locker)
{
return GetUserDefaults(sharedName)[key] != null;
}
}
static void PlatformRemove(string key, string sharedName)
{
lock (locker)
{
using (var userDefaults = GetUserDefaults(sharedName))
{
if (userDefaults[key] != null)
userDefaults.RemoveObject(key);
}
}
}
static T PlatformGet<T>(string key, T defaultValue, string sharedName)
{
object value = null;
lock (locker)
{
using (var userDefaults = GetUserDefaults(sharedName))
{
if (userDefaults[key] == null)
return defaultValue;
switch (defaultValue)
{
case int i:
value = (int)(nint)userDefaults.IntForKey(key);
break;
case bool b:
value = userDefaults.BoolForKey(key);
break;
case long l:
var savedLong = userDefaults.StringForKey(key);
value = Convert.ToInt64(savedLong, CultureInfo.InvariantCulture);
break;
case double d:
value = userDefaults.DoubleForKey(key);
break;
case float f:
value = userDefaults.FloatForKey(key);
break;
case string s:
// the case when the string is not null
value = userDefaults.StringForKey(key);
break;
default:
// the case when the string is null
if (typeof(T) == typeof(string))
value = userDefaults.StringForKey(key);
break;
}
}
}
return (T)value;
}
static NSUserDefaults GetUserDefaults(string sharedName)
{
if (!string.IsNullOrWhiteSpace(sharedName))
return new NSUserDefaults(sharedName, NSUserDefaultsType.SuiteName);
else
return NSUserDefaults.StandardUserDefaults;
}
}
Windows
Windows'da sınıfı, LegacyVersionTracking
öğesinden ApplicationDataContainerveri alan tercihler kapsayıcısı uygulamasını sağlar. Aşağıdaki kod sınıfını LegacyPreferences
gösterir:
Not
Bu kodu kullanmak için,.NET MAUI uygulama projenizin Platforms\Windows klasöründe adlı LegacyPreferences
bir sınıfa ekleyin.
using Windows.Storage;
namespace MigrationHelpers;
public static partial class LegacyPreferences
{
static readonly object locker = new object();
static bool PlatformContainsKey(string key, string sharedName)
{
lock (locker)
{
var appDataContainer = GetApplicationDataContainer(sharedName);
return appDataContainer.Values.ContainsKey(key);
}
}
static void PlatformRemove(string key, string sharedName)
{
lock (locker)
{
var appDataContainer = GetApplicationDataContainer(sharedName);
if (appDataContainer.Values.ContainsKey(key))
appDataContainer.Values.Remove(key);
}
}
static T PlatformGet<T>(string key, T defaultValue, string sharedName)
{
lock (locker)
{
var appDataContainer = GetApplicationDataContainer(sharedName);
if (appDataContainer.Values.ContainsKey(key))
{
var tempValue = appDataContainer.Values[key];
if (tempValue != null)
return (T)tempValue;
}
}
return defaultValue;
}
static ApplicationDataContainer GetApplicationDataContainer(string sharedName)
{
var localSettings = ApplicationData.Current.LocalSettings;
if (string.IsNullOrWhiteSpace(sharedName))
return localSettings;
if (!localSettings.Containers.ContainsKey(sharedName))
localSettings.CreateContainer(sharedName, ApplicationDataCreateDisposition.Always);
return localSettings.Containers[sharedName];
}
}
Eski sürüm izleme verilerini kullanma
sınıfı, uygulamanızın LegacyVersionTracking
önceki bir Xamarin.Forms sürümüyle oluşturulan Android, iOS ve Windows'ta sürüm izleme verilerini almak için kullanılabilir:
#if ANDROID || IOS || WINDOWS
using MigrationHelpers;
...
string isFirstLaunchEver = LegacyVersionTracking.IsFirstLaunchEver.ToString();
string currentVersionIsFirst = LegacyVersionTracking.IsFirstLaunchForCurrentVersion.ToString();
string currentBuildIsFirst = LegacyVersionTracking.IsFirstLaunchForCurrentBuild.ToString();
string currentVersion = LegacyVersionTracking.CurrentVersion.ToString();
string currentBuild = LegacyVersionTracking.CurrentBuild.ToString();
string firstInstalledVer = LegacyVersionTracking.FirstInstalledVersion.ToString();
string firstInstalledBuild = LegacyVersionTracking.FirstInstalledBuild.ToString();
string versionHistory = String.Join(',', LegacyVersionTracking.VersionHistory);
string buildHistory = String.Join(',', LegacyVersionTracking.BuildHistory);
string previousVersion = LegacyVersionTracking.PreviousVersion?.ToString() ?? "none";
string previousBuild = LegacyVersionTracking.PreviousBuild?.ToString() ?? "none";
#endif
Bu örnekte, eski sürüm izleme verilerini okumak için sınıfın LegacyVersionTracking
kullanılması gösterilmektedir. Ancak özellikleri ayarlanamadığından bu veriler .NET MAUI VersionTracking sınıfına atanamaz. Bunun yerine, veriler şu yöntemle WriteHistory
.NET MAUI tercihlerine yazılabilir:
void WriteHistory(string key, IEnumerable<string> history)
{
Preferences.Default.Set(key, string.Join("|", history), $"{AppInfo.Current.PackageName}.microsoft.maui.essentials.versiontracking");
}
#if ANDROID || IOS || WINDOWS
WriteHistory(LegacyVersionTracking.VersionsKey, LegacyVersionTracking.VersionHistory);
WriteHistory(LegacyVersionTracking.BuildsKey, LegacyVersionTracking.BuildHistory);
#endif
Eski sürüm izleme verileri .NET MAUI tercihlerine yazıldıktan sonra .NET MAUI VersionTracking sınıfı tarafından kullanılabilir:
var mauiVersionHistory = VersionTracking.Default.VersionHistory;
var mauiBuildHistory = VersionTracking.Default.BuildHistory;
Daha sonra eski sürüm izleme verileri cihazdan kaldırılabilir:
#if ANDROID || IOS || WINDOWS
LegacyPreferences.Remove(LegacyVersionTracking.VersionsKey, LegacyVersionTracking.SharedName);
LegacyPreferences.Remove(LegacyVersionTracking.BuildsKey, LegacyVersionTracking.SharedName);
#endif