ttlog

日々の開発で得た知見の技術メモ。モバイルアプリネタが多いです。

設定アプリ(Settings Bundle)にUUIDを表示する方法

たまにですが、設定アプリに「ユーザーID」といった項目名でUUIDを表示しているアプリを見かけます。 開発中のアプリでも端末識別用のUUIDを設定アプリに表示する必要があったため方法を調べてみたのですが、 予め決まっている固定値を表示する方法がほとんどで、アプリ側で生成したUUIDを表示させるといった情報が意外と見つからなかったため、自分が試して実現した方法を書き記しておこうと思います。

結論

Settings Bundleの値はUserDefaultsで取得出来る、ということはアプリ側から書き込みすれば設定アプリに表示出来るのではと考え、予め設定項目だけ作成しておき、アプリ起動時にUserDefaultsに書き込むことで表示することが出来ました。

※ただ、当然ながらアプリインストール直後で起動していない時点では書き込みが出来ておらずデフォルト値が表示されます。この辺りの解決方法は見つかっていません。

実装手順

Settings.bundle を作成

通常通り、ターゲットのルートディレクトリにSettings.bundleを作成します。

公式の情報はこの辺りでしょうか。 → Implementing an iOS Settings Bundle

設定値の作成

以下のように設定値をRoot.plistに作成します。

  • Item 0: Group
    • Title: "UUID"
  • Item 1: Title
    • Default Value: "xxx"
    • Identifier: "uuid"

f:id:tommy10344:20200717000525p:plain

  • UUIDは長い文字列のため、項目名は専用のGroup(Item 0)のTitleに表示するようにし、Item 1にTitleを表示させずに横幅を伸ばすようにしています。
  • Default Valueは何かしら記載しておかないと項目自体が設定アプリに表示されないようです。(半角スペース(" ")でも項目の表示はされましたが、これ良いのかな...)
  • Item 1のIdentifierの値は後ほどUserDefaultsに書き込む際に使用します。

UserDefaultsに書き込み

今回はUUIDとして UIDevice.current.identifierForVendor を使用しています。

identifierForVendor

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    ...
    
    // UUID取得
    let uuid = UIDevice.current.identifierForVendor!
    // UserDefaultsに書き込み。
    // Settings.bundleの"Identifier"で指定した値をKeyにして書き込む。
    UserDefaults.standard.set(uuid.uuidString, forKey: "uuid")
    
    ...
}

このようにしてアプリを起動後、設定アプリを確認するとUUIDが表示されているかと思います。

f:id:tommy10344:20200717002203p:plain

まとめ

所々微妙な部分があるのですが、この方法でとりあえずは実現出来ました。

またここまでの内容を簡単なサンプルコードとしてGitHubにアップしています。

GitHub - tommy10344/SettingsBundleUUID