tafuji's blog

C#, Xamarin, Azure DevOps を中心に書いています。

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 から ApplicationInfoPackageManager を取得して、それぞれのメソッド、プロパティを利用して、アプリの情報を取得していることが分かります。以下は、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 定数(AndroidACTION_APPLICATION_DETAILS_SETTINGSに相当)を設定、データとしてアプリのパッケージ名を設定して、ContextStartActivity が利用されています。

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 を利用している
    • アプリ情報の取得(ビルド、名前、パッケージ名、バージョン文字列)
      • iOS : NSBundle.MainBundle.ObjectForInfoDictionary を利用して情報を取得している
      • Android : Context から取得した ApplicationInfoPackageManager を使って、各種情報を取得している
      • UWP : Windows.ApplicationModel.Package クラスのプロパティを利用している
    • 設定画面を開く
      • iOS : Xamarin.Essentials の Launcher を利用している設定画面を開いている
      • Android : Intent を作成して、ContextStartActivity を利用して設定画面を開いている
      • UWP : Windows.System.Launcher.LaunchUriAsyncms-settings:appsfeatures-app を渡して設定画面を開いている

参考