有没有办法让Swift代码检测它是否在操场上运行?

时间:2015-10-26 21:03:28

标签: swift xcode7

为了能够测试GameKit功能,我希望能够检测代码是否在Playground中运行,以便它可以跳过网络调用。有没有办法做到这一点?

修改

忘记GameKit - 这只会让问题变得混乱。有许多不同的场景,这将是有用的。关于特定函数调用是否存在,这只是一个简单的问题:如果代码在Playground中运行,是否有一个返回true的方法?

1 个答案:

答案 0 :(得分:4)

我不知道有记录的方法,但你可以做一些无证件的事情。

这是一种在Mac OS和iOS游戏机中同时适用于Swift 2.2的Xcode 7和Swift 3.0的Xcode 8的技术:检查标识符以"com.apple.dt"开头的包。

// Swift 2.2

if NSBundle.allBundles().contains({ ($0.bundleIdentifier ?? "").hasPrefix("com.apple.dt.") }) {
    print("in playground")
} else {
    print("not in playground")
}


// Swift 3.0

if Bundle.allBundles.contains(where: { ($0.bundleIdentifier ?? "").hasPrefix("com.apple.dt.") }) {
    print("in playground")
} else {
    print("not in playground")
}

请注意,com.apple.dt.不是专门为与游乐场相关的捆绑保留的前缀;像“开发人员工具”这样的dt部分标准。因此,在某些情况下,您可能会出现误报:有一个匹配的捆绑但您不在操场上。我不知道任何这种情况,但可能有一些。我在Xcode 7下测试了macOS xib中的IBDesignable视图,并且没有加载任何com.apple.dt.个包。