iOSアプリのソースをMacOSアプリへ流用してみよう

Swift
iOSアプリのソースをMacOSアプリへ流用してみよう

はじめに

以前、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で動くアプリに対して許可を出せる項目はたくさんあります。

Enabling App Sandbox
Describes the entitlement keys for App Sandbox, iCloud, Push Notifications, and shared app containers.

今回はこの中からcom.apple.security.network.clientについて許可を出します。上記ページの説明にもある通り、他のマシン(サーバ)へ接続するためのものです。

許可を追加します(Entitlements Fileの1番目の項目)

これで一旦プロジェクトのクリーン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で使うことも考慮しておく必要がありそうです。