36

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

残念ながら#if os(watchOS)、Xcode 7 GM の時点ではありません。

編集:いつ追加されたのかわかりませんが#if os(watchOS)、Xcode 7.2で実行できるようになりました

4

3 に答える 3

27

そのコードを iOS でのみ実行する場合は、#if os(iOS)代わりにif #available(iOS ...).

この方法では、オペレーティング システムのバージョンを動的にチェックするのではなく、OS ごとに異なるコードをコンパイルします。

于 2015-09-08T11:56:20.650 に答える
5

Apple dev guideでは、スター*(必須) は、if指定されていないが、ターゲットによって指定された最小展開ターゲットにリストされている OS の本体を実行することを意味すると言われています。

したがって、ターゲットが iOSwatchOS を指定している場合、ステートメントif #available(iOS 9.0, *)は、if本体が iOS 9 以降およびすべての watchOS バージョンで使用可能であることを意味します。

また、このApple ガイドの「ビルド構成」の章で説明されている内容を使用する場合は注意してください。これは、オペレーティング システムに基づいてコードを条件付きでコンパイルするために使用されます。これは実行時に動的ではありません。

于 2015-09-08T10:15:20.420 に答える
4

Xcode7 の GM バージョンでは、その問題は修正されたと思います。私のため :

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

GM版では正常に動作しています。

于 2015-09-10T14:48:03.010 に答える