如何检测iOS应用程序是否在M1mac上运行?
我在 App Store 上提供了一个 iOS 应用程序。随着 Apple 的 M1 Mac 的推出,可以在 macOS 上运行 iOS 应用程序。我想防止我的应用程序在 macOS 上使用,例如在启动后抛出异常或exit(0)稍后调用。
如何检测应用程序是否在 M1 Mac 上运行?
在某种程度上,在 Mac 上运行的 iOS 应用程序似乎将自己报告为 iPad,因此这排除了一些识别设备的常用方法。
提供上下文的一些细节:
-
我已经从 App Store Connect 上的 Mac App Store 中删除了该应用程序。
-
该应用程序专为触摸屏而设计和优化。当前版本在 macOS 上运行时会提供非常糟糕的用户体验。要使其成为一款出色的 Mac 应用程序,需要进行许多更改并付出大量努力。我没有任何计划,更不用说这样做的资源了。
-
从表面上看,这可能类似于“如何检测我的应用程序是否在越狱设备上运行?”的问题。从技术上讲,这可能是正确的,我知道通常不建议实施越狱检测以防止 IAP 黑客等。一个重要的区别是 Apple 正在积极尝试防止越狱,并强烈劝阻用户这样做,这似乎保持了越狱社区相当小且非主流,但另一方面,Apple 显然希望在 Mac 上提供尽可能多的 iOS 应用程序。目前在 Mac 上运行 iOS 应用程序非常容易,即使它们不在 Mac App Store 中提供。MacRumors和9to5mac等流行技术博客上有说明. 我想确保至少防止这种在 mac 上运行应用程序的简单方法。
-
此应用程序中的许多实现细节都是在假设该应用程序将只在用户无法轻松访问的 iOS 沙箱中运行的假设下开发的。现在,用户使用修改后的资源、用户默认值或目录内容(
Application Support包括我认为始终不可变的文件)运行应用程序可能要容易得多。如果用户找到一种方法来访问应用程序中通常需要应用程序内购买或订阅的内容,例如通过.plist以意想不到的方式伪造s 或重命名资源文件,这是一个真正的商业风险。
回答
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:在 macOS 上运行您的 iOS 应用程序
- Oh, nice. A straightforward, native API. I have no idea why I didn't find that when I googled for a solution.