【Swift5】MacOS Appleシリコンでアプリを動かしているか検知する【Xcode12】
表題の意味について説明しておきます。
かんたんに説明するとiPhone/iPadアプリをMacOS(M1)でも動作するようにするよ。ということです。
もちろんエラー挙動やPCから操作されることを嫌うアプリであれば、AppConnectのマイAppから配信を停止することもできます。
ジャンプ+アプリとかそうですね。その他ソシャゲもおそらくそうではないでしょうか。
なぜこのよう対応をする必要があったのか
MacOSでストア公開されている自作アプリを動かしていた時、クラッシュしたんですよね。調べているとAdMobの広告を配信するリクエストをMacOSで呼び出すと確実にクラッシュしました。
原因は分かりませんが、AdMob × Appleシリコンの話題なんてニッチすぎて一生トピックにあがりませんし、MacOSで操作するのは開発者自身である自分ぐらいだと思うので、MacOSで動作している場合は広告表示をやめることにしました。
対応で難しかったこと
MacOS上でiPadに偽装して(designed a iPad)動作しているので、UIDeviceクラスでデバイス情報を取得しても残念ながらMacOSとは表示されずにiPadと取れてしまうんですよね。
そこで以下のコードで対応しました。
これでAppleシリコンのMacOSで動作していることがわかりました。
func validationiOSDevice() -> Bool {
// Macbook Appleシリコンでアプリを動作させるとUIDeviceではiPad扱いになる
if UIDevice.current.userInterfaceIdiom == .pad {
// 本当にiPadなら名称にiPadを含むので端末名にiPadが入っていなければMacbookである。
// Macbookのユーザー名にiPadを含むユーザーが居る場合のみが例外的に下記を偽装して通ってしまう(これ以上条件を絞れないので諦める)
if (!UIDevice.current.name.contains("iPad")) {
return false
}
}
return true
}
iPadでありながら、名称がiPadではないもの=Appleシリコンという条件です。
コメントにもありますが、ユーザー名にiPadと入っていた場合はiPad端末と同じと認識してクラッシュします。
MacにiPadと名付ける人も少ないと思いますし、そもそもMacOSで動作させている人の何%が「MacにiPadと名付けている」のだろうって疑問もあるので、超低確率でクラッシュするという仕様に黙認したいと思います