ios swift2 watch-os watch-os-2

Detectando API disponible iOS vs. watchOS en Swift



swift2 watch-os (3)

Con la versión GM de Xcode7, creo que solucionaron ese problema. Para mi :

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

funciona bien en la versión GM.

#available no parece funcionar al diferenciar entre watchOS e iOS.

Aquí hay un ejemplo de código compartido entre iOS y 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 }

Parece que el valor predeterminado es WatchOS y el #available no es considerado por el compilador.

¿Estoy haciendo un uso indebido de esta API o hay alguna otra forma de diferenciar el código entre iOS y WatchOS?

Actualización: Parece que estaba haciendo un uso indebido de la API como lo menciona BPCorp

Usando la solución de Tali para el código anterior funciona:

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

Lamentablemente no hay #if os(watchOS) .. a partir de Xcode 7 GM

Editar: No estoy seguro de cuándo se agregó, pero ahora puede hacer #if os(watchOS) en Xcode 7.2


En la guía de desarrollo de Apple , se dice que la estrella, * (que se requiere) significa que ejecutará el cuerpo if para sistemas operativos no especificados, pero que figuran en el destino de despliegue mínimo especificado por su objetivo.

Por lo tanto, si su destino especifica iOS y watchOS, su estado de cuenta if #available(iOS 9.0, *) significa que el cuerpo if está disponible para iOS 9 y posterior y cualquier versión de watchOS.

Además, tenga cuidado si desea usar lo que se describe en el capítulo "Configuraciones de compilación" en esta guía de Apple . Se utiliza para compilar condicionalmente su código en función del sistema operativo. Esto no es dinámico en tiempo de ejecución.


Si desea ejecutar ese código solo en iOS, utilice #if os(iOS) lugar de if #available(iOS ...) .

De esta forma, no está utilizando una verificación dinámica para la versión de su sistema operativo, pero está compilando un código diferente para un sistema operativo u otro.