能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

Appleマルチプラットフォーム(Multiplatform) 対応は複数のinfo.plist への対応でもある話 - iOS, iPadOS, macOS

iOSアプリ開発者が知るinfo.plist ファイルがマルチプラットフォームでは複数用意されるという話。

Xcode12 からマルチプラットフォーム 向けのアプリが作成可能になっている。UIフレームワークであるSwiftUI を記法に沿って宣言すればiOS,iPadOS,macOS アプリ起動、画面起動についてまとめて記述できる。SwifUI以前のアプリのライフサイクルイベントの受け口としての役割は別定義として整理された。

SwiftUIで記述すれば良いことづくめに見えるが、取り残された箇所がむしろ目立っている印象がある。本内容ではXcodeのテンプレート作成時に遭遇することになるinfo.plistについて記述する。エディター多くして実装進まずといった話。

1) 昔話 - OSⅩのサブシステムとしてのiPhoneOS

2000年代後半iPhoneOS は、OSⅩのサブシステムとして登場し機能拡張が加えられOSⅩとはしばらく 別の道を歩んでいた。2010年代早々にiPhoneOSはiOSと名前を変え、その後OSⅩはmacOSの名乗りとなり、iOSは、iPhone向け、iPad向けにiOS、iPadOSに整理された。AppleTV向けにtvOS、AppleWatch用にwatchOSが用意された。

2)開発環境の整備

iOSアプリの開発者の方が、macOSの開発者よりも多くなった中でAppleはSDKのアップデートを進めていた。アップデート対象は2020年の開発者から見るとmacOS,iOS間の共通API整理とマルチプラットフォーム化を目指していたことがわかる。(ビルド環境とか言語周りもあるが本内容では省略する)。

  1. 共通API整理: iOS9ごろから通知、バックグラウンド処理をiOS, macOSで共通に使えるものに整理
  2. マルチプラットフォーム: SpriteKit、SceneKit、AVFoundation などマルチプラットフォームで使える機能強化 Apple 内では分断ひさしいmacOSとiOS開発の垣根を取り払う動きをゆっくり進めていた。WWDC2020でSwiftUIによるiOSアプリ開発者がmacOSアプリも開発できる環境をお披露目するに至っている。

3)macOS開発での要点

マルチプラットフォーム向けといってもmacOSは他プラットフォームと違い、パーソナルコンピューターの故地ドキュメント生成機能に重点が置かれている(ゲームも健在だがmacOSは他に比べると魅力的ではない)。

AppleSiliconが初めて動作するmacOS11(Big Sur)を準備が進む中AppleではiOSアプリ開発者をDocumentAppに興味を向けさせるべく動いていたのだろう、UI開発向けのフレームワークであるSwiftUI 発表当初からドキュメントアプリ向けのサポートが実施されていた。

ドキュメントアプリへのサポートはSwiftUI 2nd major release でも継続されMultiplatform向けアプリのテンプレートが追加されている。

4)アプリの概要はOSごと必要

OSないし申請ポータルでアプリの概要(とっかかりの情報)を読み取りが必要なのはmacOS11が登場しても変わらない。アプリの概要はOSごとに必要だったがこちらも手を加えられていないので、マルチプラットフォーム開発者はmacOS、iOSごとのアプリの概要を扱う必要があり、iOSアプリ開発者がマルチプラットフォームを目指そうとするとmacOSのアプリの概要に向き合う必要がある。

Xcode上で見るとターゲットごとにアプリの概要が記述されているinfo.plistファイルを確認することができる。 Xcode12のマルチプラットフォームテンプレートの場合は以下のファイルが確認できる。

  • [プロジェクトフォルダ]/iOS/info.plist
  • [プロジェクトフォルダ]/macOS/info.plist

ターゲットはOSごとに限らずwatchOSをターゲットにした場合にも増えていく。

infoplist distribution

SwiftUI でOS周りを一括定義可能となった分、ターゲットを増やす分info.plistが増えていくのが気になるもしくは、info.plistがOS箇所を押し込めていると捉えるかでマルチプラットフォームへ取り組むとなったとき心にかかるブレーキ加減は異なると思われる。

5)info.plist - アプリの概要情報

アプリ開発者からみるとアプリの概要はinfo.plistという構造化されたドキュメントファイルである(plist形式というXMLをベースとしたApple独自定義)。構造化されたドキュメント内では、Appleが定義するキー値に対応する値が格納される。値は文字列や数値などリテラルの場合もある、詳細が必要な定義はArrayやDictionaryの形を取る。

キー値はApple Developer Centerでドキュメント化されている。

About Info.plist Keys and Values

ファイルは存在するが編集するとなるとXcode内でエディター/Viewを使うことになる。

  1. プロジェクトごとのターゲットをタップしてInfo,General を開く
  2. Xcode上でinfo.plist をタップして開く
  3. Xcode上でinfo.plist をタップして開く(Raw value)

気を付ける点は、3以外はXcodeのメジャーアップデート毎に更新されるためWeb検索で情報がひっかからないということがままある。

5-1) プロジェクトごとのターゲットをタップしてInfo,General タブを開く

OSごとの相違が多い箇所も存在し、Appleが注力しているドキュメントアプリでのinfo.plistの該当箇所項目、Document typesおよびExported(Imported) Type UTIs ではOSごとに可視化されている項目に相違がある。

共通項目があるが相違も多い。例をあげると、

  • 1-1) ドキュメントアイコンの定義方法が異なる
  • 1-2) macOSではドキュメントに対するアプリの特性が必要

などで相違が出てくる。

Xcode12 beta4上でマルチプラットフォーム開発した際に気づいたのはInfoタブをタップすると表示がCustom iOS(macOS Application) Target PropertiesにリセットされてしまうことでiOS, macOSごとに切り替えて相違を確認するといったことが煩雑になり、結果スクリーンショット撮ってiOS, macOS間の相違を確認するといった解決方法を取らざるをえなかった。

5-2) Xcode上でinfo.plist をタップして開く

Xcode上でinfo.plist を開くとplist専用のエディターが表示される。注意すべきはキーがユーザーフレンドリーな名称に置き換わっている。 ふーざーフレンドリーな名称に置き換わるだけであれば問題ないが、名称そのものはXcodeのバージョンに依存しているためユーザーフレンドリーな名称がXcodeのバージョンごと変わる、サポートしていないキー値は元のキー値が表示されるなど、Xcodeの対応次第なところがある。

Xcode12 betaの状況でも、Xcode11 だとExported(Imported) Type UTIs 定義が、Exported(Imported) Type Identifiersに変わっているなど異なるバージョンのXcodeを切り替えて使っていると混乱することがある。

1のプロジェクトのターゲットと異なるのは汎用的なエディターなのでコピー&ペーストに対応し、info.plist間での情報のやり取りしやすい点、BuildSettingで定義したユーザ定義(User-Defined)を値を$指定で記述できるなどリテラルで記述することで起きるトラブルを避けつることができる。

5-3) Xcode上でinfo.plist をタップして開く(Raw value)

2と同様、Xcode上でinfo.plist を開いたのちキー値上でコンテキストメニューを開きRaw Key & Valuesをタップすると切り替え可能となる。フレンドリーな表示ではないがXcodeのメジャーアップデートに左右されないのでキー値をWeb検索する際は確実なソースを見つけやすい利点はある。

6)まとめ(Conclusion)

マルチプラットフォーム化にともなってUI周りの劇的は変化とは打って変わってinfo.plist は従来通りの仕様で変化がなかった。

従来通りのinfo.plist ではあるがUI周りが激変した結果として依存情報が集中している。しかもOSごと、Extensionごとに用意する必要がある。

開発環境上でinfo.plist を開発者フレンドリーにするため各種内蔵エディター提供しているがマルチプラットフォーム化する状況下では混乱しがちにみえる。

マルチプラットフォーム化が進む前からExtensionターゲット追加による管理するinfo.plist が増える傾向はあった。マルチプラットフォーム化のタイミングでinfo.plistを理由としてマルチプラットフォームへ取り組まないという強い理由にはならないはず。

参考