初めに
まず最初に Xcode の Playground とは違います のでmm
今回は Swift Playgrounds でアプリを開発する場合のお話です。
Swift Playgrounds とは
2016年に登場した iPad 上で Swift を学習できるアプリです。
当初はテンプレートの教材を Swift で学習するだけでした。
現在はバージョンが4.1
までリリースされており、iPad のみならず Mac 上でも動作し、実際にリリースできるアプリが作成できるまでになりました。
どんなことができるの?
iOSDC Japan 2022 で LT をしました!
資料をあげたので、見ていただけると少しは理解が深まるかと思いますmm
plist ファイルによる機能の拡張
0. 前提
Swift Playgrounds のアプリでは info.plist
は存在しません。
Package.swift
で多くのことが管理されます。
通常、機能の追加をする場合は GUI 上から行います。
機能を追加すると Package.swift
に追加されます。
1. 問題
GUI で追加できる機能は以下になります。
(内部コードより。 v4.0なので少しだけ古いです。)
public enum Capability : Swift.Equatable, Swift.Encodable {
case appTransportSecurity(configuration: PackageDescription.ProductSetting.IOSAppInfo.AppTransportSecurityConfiguration, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case bluetoothAlways(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case calendars(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case camera(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case contacts(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case faceID(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case localNetwork(purposeString: Swift.String, bonjourServiceTypes: [Swift.String]? = nil, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case locationAlwaysAndWhenInUse(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case locationWhenInUse(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case mediaLibrary(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case microphone(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case motion(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case nearbyInteractionAllowOnce(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case photoLibrary(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case photoLibraryAdd(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case reminders(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case speechRecognition(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
case userTracking(purposeString: Swift.String, _: PackageDescription.ProductSetting.IOSAppInfo.DeviceFamilyCondition? = nil)
public static func == (a: PackageDescription.ProductSetting.IOSAppInfo.Capability, b: PackageDescription.ProductSetting.IOSAppInfo.Capability) -> Swift.Bool
}
名前からなんとなく予想できるかと思います。
問題としてここにないものは追加しようがありません。実際、追加できない機能がいくつか存在します。また、それ以外にも今までの Xcode プロジェクトにあった info.plist
の設定などは追加のしようがありません。
2. 独自 plist の追加
そこで便利なのが、additionalInfoPlistContentFilePath
の引数を使うことです。
詳しく見たい方は以下のパスから
/Applications/Xcode.app/Contents/PlugIns/IDESwiftPackageCore.framework/Versions/A/Frameworks/SwiftPM.framework/
自信で追加したい機能や設定を、独自の plist
として作成し、それを読み込ませます。
こうすることで、最終的な成果物は、Package.swift
と plist
が合成されたものになります。
(同じ設定を追加した場合はどちらが優先されるかはわかりません。どなたかテストした人がいれば情報お願いしますmm)
例外
iCloud
の機能のみ、現状追加しようがないようです。
(他の機能もあれば情報お願いしますmm)
おそらく、Swift Playgrounds が iCloud
で管理することを想定しているツールのため、問題が起きないように、自信からはアクセスできないようになっているのだと思います。
終わりに
時間が経てば、GUI に機能が増えてくると思うので、いったん足りない機能は拡張して補っていくと言う形になると思います。
なんだかんだで代わりの手段を用意してくれている Apple さん、ありがたや🙏
リポジトリ
以下に導入したアプリがあるので、参考程度に見ていただけますと🙏
その他
関連記事はこちら
参考文献