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

Cez*_*zar 33 ios watchos swift2 watchos-2

#available 在区分watchOS和iOS时似乎不起作用.

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

lazy var session: WCSession = {
    let session = WCSession.defaultSession()
    session.delegate = self
    return session
}()
Run Code Online (Sandbox Code Playgroud)

...

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 }
Run Code Online (Sandbox Code Playgroud)

似乎它只是默认为WatchOS,并且#available编译器不会考虑它.

我是否滥用此API或是否有其他方法可以区分iOS和WatchOS之间的代码?

更新:似乎我误用了BPCorp提到的API

使用Tali的上述代码解决方案:

    #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 } 
Run Code Online (Sandbox Code Playgroud)

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

编辑:不确定何时添加,但您现在可以#if os(watchOS)在Xcode 7.2上执行

Tal*_*ali 25

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

这样,您不会对操作系统的版本使用动态检查,而是为一个操作系统或另一个操作系统编译不同的代码.


BPC*_*orp 5

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

因此,如果您的目标指定iOS watchOS,则您的语句if #available(iOS 9.0, *)意味着该if主体可用于iOS 9及更高版本以及任何watchOS版本.

另外,如果您想使用本Apple指南中 "构建配置"一章中描述的内容,请务必小心.它用于根据操作系统有条件地编译代码.这在运行时不是动态的.