LoginSignup
4
2

More than 1 year has passed since last update.

Swift Playgrounds のアプリに plist ファイルを適応して機能を追加する

Last updated at Posted at 2022-09-08

初めに

まず最初に 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なので少しだけ古いです。)

.swift
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 の引数を使うことです。
Screen Shot 2022-09-08 at 4.46.28.png

詳しく見たい方は以下のパスから

/Applications/Xcode.app/Contents/PlugIns/IDESwiftPackageCore.framework/Versions/A/Frameworks/SwiftPM.framework/

自信で追加したい機能や設定を、独自の plist として作成し、それを読み込ませます。
Screen Shot 2022-09-08 at 4.46.31.png

こうすることで、最終的な成果物は、Package.swiftplist合成されたものになります。

(同じ設定を追加した場合はどちらが優先されるかはわかりません。どなたかテストした人がいれば情報お願いしますmm)

例外

iCloud の機能のみ、現状追加しようがないようです。
(他の機能もあれば情報お願いしますmm)

おそらく、Swift Playgrounds が iCloud で管理することを想定しているツールのため、問題が起きないように、自信からはアクセスできないようになっているのだと思います。

終わりに

時間が経てば、GUI に機能が増えてくると思うので、いったん足りない機能は拡張して補っていくと言う形になると思います。

なんだかんだで代わりの手段を用意してくれている Apple さん、ありがたや🙏

リポジトリ

以下に導入したアプリがあるので、参考程度に見ていただけますと🙏

その他

関連記事はこちら

参考文献

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2