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

of1yzvn4  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(218)

#available在区分watchOS和iOS时似乎不起作用。
以下是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的解决方案是可行的:


# 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 }

遗憾的是,Xcode 7 GM没有#if os(watchOS) ..

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

liwlm1x9

liwlm1x91#

如果您只想在iOS上执行该代码,请使用#if os(iOS)而不是if #available(iOS ...)
这样,您就不会对操作系统的版本进行动态检查,而是为一个操作系统或另一个操作系统编译不同的代码。

ivqmmu1c

ivqmmu1c2#

在Apple开发指南中,星星*(必需)表示它将为未指定但在您的目标指定的最小部署目标中列出的操作系统执行if主体。
因此,如果您的目标客户指定iOSwatchOS,您的声明if #available(iOS 9.0, *)意味着if主体适用于iOS 9及更高版本任何watchOS版本。
此外,如果您要使用本Apple指南中“构建配置”一章中所述的内容,请务必小心。它用于根据操作系统有条件地编译代码。这在运行时不是动态的。

tjvv9vkg

tjvv9vkg3#

在通用版本的Xcode7中,我认为他们解决了这个问题。对我来说:

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

在GM版本中工作正常。

相关问题