2015-09-01 9 views
27

#available non sembra funzionare quando si distingue tra watchOS e iOS.Rilevamento dell'API disponibile iOS rispetto a watchOS in Swift

Ecco un esempio di codice condiviso tra 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 } 

sembra che solo default watchos e il #available non è considerato dal compilatore.

Sto utilizzando male questa API o esiste un altro modo per differenziare il codice tra iOS e WatchOS?

Aggiornamento: Sembra che stavo abusando l'API come detto da BPCorp

Utilizzando la soluzione di Tali in codice precedente funziona:

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

purtroppo non c'è #if os(watchOS) .. come di Xcode 7 GM

Modifica: non è sicuro quando è stato aggiunto ma ora è possibile effettuare #if os(watchOS) su Xcode 7.2

+1

se è un bug puoi aspettare 'stable xcode 7', comunque non sarai in grado di caricare app su App Store da beta xcode. – Aks

+0

@Aks, stavo abusando dell'API non è un bug. Guarda la risposta di BPCorp – Cezar

risposta

17

Se si desidera eseguire tale codice solo su iOS, utilizzare #if os(iOS) anziché if #available(iOS ...).

In questo modo, non si sta utilizzando un controllo dinamico per la versione del sistema operativo, ma si sta compilando un codice diverso per un sistema operativo o l'altro.

+0

La tua soluzione ha funzionato per me, grazie! – Cezar

4

Nel Apple dev guide, si dice che la stella, * (che è richiesta) significa che eseguirà il corpo if per i sistemi operativi non specificati ma elencati nella destinazione minima di implementazione specificata dalla destinazione.

Quindi, se il vostro target specifica iOS e watchos, la sua dichiarazione if #available(iOS 9.0, *) significa che il corpo if è disponibile per iOS 9 e versioni successive e qualsiasi versione watchos.

Inoltre, fare attenzione se si desidera utilizzare quanto descritto nel capitolo "Configurazioni di configurazione" in questo Apple guide. Viene utilizzato per compilare in modo condizionale il codice in base al sistema operativo. Questo non è dinamico in fase di runtime.

4

Con la versione GM di Xcode7 penso che abbiano risolto il problema. Per me:

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

sta lavorando bene in versione GM.

+0

Hai provato questo nella versione GM @Cezar? –

+0

Non funziona per codice cross-compilato per me. Invece #if os (iOS) funziona. – Cezar