web-dev-qa-db-ja.com

Swift)で利用可能なAPIiOSとwatchOSを検出する

_#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 7GMの時点では#if os(watchOS) ..

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

36
Cezar

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

このように、オペレーティングシステムのバージョンの動的チェックを使用していませんが、OSごとに異なるコードをコンパイルしています。

26
Tali

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

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

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

5
BPCorp

GMバージョンのXcode7で、彼らはその問題を修正したと思います。私にとって:

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

GMバージョンで正常に動作しています。

4
Sabrican Ozan