iOS アプリが M1 Mac で実行されているかどうかを検出するにはどうすればよいでしょうか? 質問する

iOS アプリが M1 Mac で実行されているかどうかを検出するにはどうすればよいでしょうか? 質問する

私は App Store で iOS アプリを提供しています。Apple の M1 Mac の発売により、iOS アプリを macOS で実行できるようになりました。起動後に例外をスローしたり、exit(0)後で呼び出したりするなどして、アプリが macOS で使用されるのを防ぎたいと考えています。

アプリが M1 Mac 上で実行されていることをどのように検出できますか?

ある程度、Mac 上で実行されている iOS アプリは、自身を iPad 1として報告しているように見えるため、デバイスを識別する一般的な方法のいくつかは除外されます。

背景を説明する詳細:

  1. App Store Connect で Mac App Store からアプリをすでに削除しました。

  2. このアプリはタッチスクリーン用に作成され、最適化されています。現在のバージョンでは、macOS で実行するとユーザー エクスペリエンスが非常に悪くなります。優れた Mac アプリにするには、多くの変更と多大な労力が必要になります。そのためのリソースはもちろん、計画もありません。

  3. 表面的には、これは「自分のアプリが脱獄したデバイスで動作しているかどうかを検出するにはどうしたらいいですか?」という質問に似ているように思えるかもしれません。技術的には、これは正しいかもしれませんし、IAP ハッキングなどを防ぐために脱獄検出を実装することは一般的には推奨されないことは理解しています。重要な違いは、Apple は積極的に脱獄を防止しようとしており、ユーザーに脱獄を強く勧めていないことです。そのため、脱獄コミュニティはむしろ小さく、主流から外れているようですが、一方で、Apple は明らかにできるだけ多くの iOS アプリを Mac で利用できるようにしたいと考えています。現在、Mac App Store で提供されていない場合でも、Mac で iOS アプリを実行するのは非常に簡単です。次のような人気の技術ブログに手順が記載されています。マックルーマーズそして9to5mac少なくとも、Mac でアプリを実行するこの簡単な方法が阻止されるようにしたいのです。

  4. このアプリの実装の詳細の多くは、ユーザーが簡単にアクセスできない iOS サンドボックスでのみアプリが実行されるという想定で開発されています。現在では、変更されたリソース、ユーザーのデフォルト、または などのディレクトリの内容 (Application Support常に不変であると想定していたファイルを含む) を使用してアプリを実行する方が、ユーザーにとってははるかに簡単になっている可能性があります。 を偽装したり、リソース ファイルを予期しない方法で名前変更したりするなど、通常はアプリ内購入やサブスクリプションが必要なアプリ内のコンテンツにアクセスする方法をユーザーが見つけた場合.plist、それは実際のビジネス リスクとなります。


1元の投稿時点では、M1 Mac はhw.machineモデル識別子 を介して自分自身を報告しているようでしたiPad8,6。さらにいくつかの詳細を提供したツイートはその後削除されました。

ベストアンサー1

Apple のフレームワークでは、プロセス情報フラグを使用して、アプリが Mac 上で iOS アプリとして実行されているかどうかを検出できますisiOSAppOnMac

このフラグはiOS 14.0から利用可能であるため、これらのバージョンでのみ動作するようにカプセル化する必要があります。バージョン14.0は初めMac 上の iOS のバージョンが 14.0 より前であれば、Mac では使用できないと想定しても問題ありません。

// Swift
var isiOSAppOnMac = false
if #available(iOS 14.0, *) {
    isiOSAppOnMac = ProcessInfo.processInfo.isiOSAppOnMac
}
print("\(isiOSAppOnMac ? "iOS app on Mac" : "not iOS on Mac")!")

または、Objective-C を好む場合:

// Objective-C
BOOL isiOSAppOnMac = false;
if (@available(iOS 14.0, *)) {
    isiOSAppOnMac = [NSProcessInfo processInfo].isiOSAppOnMac;
}
NSLog(@"%@", isiOSAppOnMac ? @"iOS app on Mac" : @"not iOS app on Mac");

参照:Apple: iOS アプリを macOS で実行する

おすすめ記事