在Swift中检测可用的API iOS与watchOS

区分watchOS和iOS时, #available似乎不起作用。

以下是iOS和watchOS共享的代码示例:

 lazy var session: WCSession = { let session = WCSession.defaultSession() session.delegate = self return session }() 

 if #available(iOS 9.0, *) { guard session.paired else { throw WatchBridgeError.NotPaired } // paired is not available guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp } // watchAppInstalled is not available } guard session.reachable else { throw WatchBridgeError.NoConnection } 

似乎它只是默认使用WatchOS,编译器不考虑#available

我滥用这个API还是有任何其他的方式来区分iOS和WatchOS之间的代码?

更新:似乎我正在滥用BPCorp提到的API

上面的代码工作使用Tali的解决scheme:

  #if os(iOS) guard session.paired else { throw WatchBridgeError.NotPaired } guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp } #endif guard session.reachable else { throw WatchBridgeError.NoConnection } 

不幸的是,没有#if os(watchOS) ..从Xcode 7 GM开始

编辑:不知道什么时候它被添加,但你现在可以在Xcode 7.2上执行#if os(watchOS)

如果只想在iOS上执行该代码,请使用#if os(iOS)而不要使用#if os(iOS) if #available(iOS ...)

这样,您就不会使用dynamic检查操作系统的版本,而是针对一个操作系统或其他操作系统编译不同的代码。

在Apple开发指南中 ,据说明星* (这是必需的)意味着它将为未指定的操作系统执行if主体,但列在目标指定的最小部署目标中。

因此,如果您的目标指定了iOS watchOS,那么您的语句if #available(iOS 9.0, *)意味着if body可用于iOS 9及更高版本以及任何watchOS版本。

另外,如果您想使用本Apple指南中的“构buildconfiguration”一章中所述的内容,请小心。 它被用来根据操作系统有条件地编译你的代码。 这在运行时不是dynamic的。

有了Xcode7的GM版本,我认为他们解决了这个问题。 为了我 :

 if #available(watchOS 2,*) { // Only if using WatchOS 2 or higher } 

在通用版本中工作正常。