Xamarin.Essentials 入門 - #7 アプリ情報
はじめに
Xamarin.Essentials のアプリ情報について記載します。この API を利用することで、アプリケーション名やバージョン情報を取得することができます。
使ってみよう
使い方
Xamarin.Essentials のアプリ情報の機能は、AppInfo
クラスで提供されており、以下のことができます。
- ビルド
- 名前
- パッケージ名
- バージョン文字列
- アプリケーションの設定の表示
// アプリ名 var appName = AppInfo.Name; // パッケージ名(Android)、Bundle Identifier (iOS) var packageName = AppInfo.PackageName; // アプリのバージョン文字列 (1.0.0) var version = AppInfo.VersionString; // アプリのビルド番号 var build = AppInfo.BuildString; // アプリの設定画面を開く AppInfo.ShowSettingsUI();
読んでみよう
AppInfo のコードを読んで、プラットフォーム固有の処理を見ていきます。
iOS
アプリ情報の取得には、NSBundle.MainBundle.ObjectForInfoDictionary
を利用して、アプリの情報を取得していることが分かります。以下は、iOS プラットフォームのコードの抜粋です。
static string PlatformGetPackageName() => GetBundleValue("CFBundleIdentifier"); static string PlatformGetName() => GetBundleValue("CFBundleDisplayName") ?? GetBundleValue("CFBundleName"); static string PlatformGetVersionString() => GetBundleValue("CFBundleShortVersionString"); static string PlatformGetBuild() => GetBundleValue("CFBundleVersion"); static string GetBundleValue(string key) => NSBundle.MainBundle.ObjectForInfoDictionary(key)?.ToString();
設定画面の表示は、Xamarin.Essentials の Launcher
を利用しています。
static async void PlatformShowSettingsUI() => await Launcher.OpenAsync(UIApplication.OpenSettingsUrlString);
Android
アプリ情報の取得には、Context
から ApplicationInfo
や PackageManager
を取得して、それぞれのメソッド、プロパティを利用して、アプリの情報を取得していることが分かります。以下は、Android プラットフォームのコードの抜粋です。
static string PlatformGetPackageName() => Platform.AppContext.PackageName; static string PlatformGetName() { var applicationInfo = Platform.AppContext.ApplicationInfo; var packageManager = Platform.AppContext.PackageManager; return applicationInfo.LoadLabel(packageManager); } static string PlatformGetVersionString() { var pm = Platform.AppContext.PackageManager; var packageName = Platform.AppContext.PackageName; using (var info = pm.GetPackageInfo(packageName, PackageInfoFlags.MetaData)) { return info.VersionName; } } static string PlatformGetBuild() { var pm = Platform.AppContext.PackageManager; var packageName = Platform.AppContext.PackageName; using (var info = pm.GetPackageInfo(packageName, PackageInfoFlags.MetaData)) { #if __ANDROID_28__ return PackageInfoCompat.GetLongVersionCode(info).ToString(CultureInfo.InvariantCulture); #else #pragma warning disable CS0618 // Type or member is obsolete return info.VersionCode.ToString(CultureInfo.InvariantCulture); #pragma warning restore CS0618 // Type or member is obsolete #endif } }
なお、__ANDROID_28__
が指定されている部分は、API 28 以降の場合に実行されるコードです。API レベル 28 移行では、PackageInfo.versionCode
が非推奨になったため、このようなコードが書かれています。
設定画面を開く機能では、Intent
のアクションに Settings
クラスの ActionApplicationDetailsSettings
定数(Android のACTION_APPLICATION_DETAILS_SETTINGSに相当)を設定、データとしてアプリのパッケージ名を設定して、Context
の StartActivity
が利用されています。
static void PlatformShowSettingsUI() { var context = Platform.GetCurrentActivity(false) ?? Platform.AppContext; var settingsIntent = new Intent(); settingsIntent.SetAction(global::Android.Provider.Settings.ActionApplicationDetailsSettings); settingsIntent.AddCategory(Intent.CategoryDefault); settingsIntent.SetData(global::Android.Net.Uri.Parse("package:" + PlatformGetPackageName())); var flags = ActivityFlags.NewTask | ActivityFlags.NoHistory | ActivityFlags.ExcludeFromRecents; #if __ANDROID_24__ if (Platform.HasApiLevelN) flags |= ActivityFlags.LaunchAdjacent; #endif settingsIntent.SetFlags(flags); context.StartActivity(settingsIntent); }
UWP
アプリ情報の取得には、Windows.ApplicationModel.Package
クラスを利用して、アプリの情報を取得していることが分かります。以下は、UWP プラットフォームのコードの抜粋です。
static string PlatformGetPackageName() => Package.Current.Id.Name; static string PlatformGetName() => Package.Current.DisplayName; static string PlatformGetVersionString() { var version = Package.Current.Id.Version; return $"{version.Major}.{version.Minor}.{version.Build}.{version.Revision}"; } static string PlatformGetBuild() => Package.Current.Id.Version.Build.ToString(CultureInfo.InvariantCulture);
設定画面を開く機能では、Windows.System.Launcher.LaunchUriAsync
を利用しています。引数に ms-settings:appsfeatures-app
を渡して設定画面を開いています。
static void PlatformShowSettingsUI() => Windows.System.Launcher.LaunchUriAsync(new System.Uri("ms-settings:appsfeatures-app")).WatchForError();
まとめ
- Xamarin.Essentials のアプリ情報では、以下の機能が提供される
- アプリケーションに関する情報(ビルド、名前、パッケージ名、バージョン文字列)を取得することができる
- アプリケーションの設定画面を開くことができる
- 内部では、以下のネイティブ固有のAPI を利用している
- アプリ情報の取得(ビルド、名前、パッケージ名、バージョン文字列)
- 設定画面を開く