はじめに
以前、Vaporサーバアプリケーションを経由して、iOSアプリケーションでMongoDBのドキュメントを取得してみました。iOS向けがあるならMacOS向けもあってもいいじゃないですか。
というわけで、Mac向けアプリケーションを作ってみます。そして、Vaporサーバアプリケーションを経由してMongoDBのドキュメントを取得してみます。
ですが、イチから作るのは大変なので、iOS向けのソースをそのまま流用できないか試してみたいと思います。基本的に右から左へペタペタとコピペしていきます。これでどこまでやれるかですね。
ViewはiOS向けのソースが流用できます
MacOS向けにもSwiftUIを使ってViewを組んでいきます。使えるViewがiOS向けとMacOS向けで少し違いがありますが、SwiftUIを使うことでiOS向けViewのソースコードが流用できます。
StoryBoardやxibをいじっていた時は、iOS向けとMacOS向けで作り方が違って苦労した覚えがあります。特にプレフィックスがUIかNSかで混乱しました。まぁ今回試したアプリでは複雑なViewを組んでいな買ったので、あっさりと流用できただけのかもしれませんが。
SwiftUIはStoryBoardやxibと違ってSwiftでプログラム的に書くことができます。なので、仮に複雑になっても、ある程度ならばコーディングで差異を吸収できると思います。
ちなみにボタンの形状など、当然見た目は変わるので、その辺りの調整は必要です。
Sandboxでハマった
ネットワークへ接続できない!
iOS向けのアプリを作っていた時は何もせずともネットワークに繋ぐことができました。ここで言うネットワークへの接続とは、httpでの接続の許可ではなく、ネットワークそのものへの接続を指します。
ところが、MacOS向けのアプリへ流用したソースを動かすとネットワークに繋がりません。何ということでしょう。
dnssd_clientstub ConnectToServer: connect() failed path:/var/run/mDNSResponder Socket:13 Err:-1 Errno:1 Operation not permitted
許可が必要です
この原因はアプリがSandbox内で動いており、そのSandbox内でネットワークへの接続を許可していないからです。許可をしてやることで接続することができるようになります。
プロジェクト内に[プロジェクト名].entitlements
というファイルがあると思います。これに許可を追記します。
Sandboxで動くアプリに対して許可を出せる項目はたくさんあります。
今回はこの中からcom.apple.security.network.client
について許可を出します。上記ページの説明にもある通り、他のマシン(サーバ)へ接続するためのものです。
これで一旦プロジェクトのクリーンClean Bulid Folder
を行った後ビルドすると無事に接続できるようになります。
Sandboxに関して許可が必要なものはたくさんある
com.apple.security.network.client
以外にも、カメラに関するものやBluetoothに関するものなど、様々な許可項目があります。Operation not permitted
がコンソールに表示されたらこの許可項目を見てみると良いと思います。
ここで必要なものに絞って許可を出すことはセキュリティ上でも、他のシステムへ迷惑をかけないという点でも有用なので、ぜひ気をつけて設定してみてください。
なお、AppStoreに申請するためにはSandbox化は必須のようです。申請の際には最新の情報をご確認くださいね。
SceneDelegate.swiftが見当たらない
iOS向けのアプリでマルチウィンドウをサポートするために使っていたSceneDelegate.swift
が見当たりません。AppDelegate.swift
だけです。これはあくまでも推測で、確証はないですが、MacOSではiOSのマルチウィンドウのような仕組みを持つ必要が無いからだと思われます。
そもそもSceneDelegate.swift
はiOS13からマルチウィンドウのサポートをするために必要なものでしたよね。そのようなサポートをする必要がなければ不要ということですかね?
まとめ
プレフィックスがNSのコントロールの扱いで辟易し、食わず嫌い気味で敬遠していたMacOS向けのアプリ開発ですが、SwiftUIのおかげで少しハードルが下がったように見えます。iOS向けでコーディングしたものとの違いを押さえておくとスムーズにプログラミングできそうです。
iOS向けのアプリがそのままMacOS上で動くようになるそうですし、これからはiOSやAndroidなどマルチプラットフォームを考える時にMacOSで使うことも考慮しておく必要がありそうです。