ios ios-frameworks linker-warning ios-extensions

ios - ¿Cómo suprimir `advertencia: vincular contra dylib no es seguro para su uso en extensiones de aplicación`?



ios-frameworks linker-warning (5)

A veces ''Nanny'' no sabe mejor.

Puede evitar los enlaces a UIApplication.shared y simplemente llamar a los métodos dinámicamente en su marco.

class Application { static var shared: UIApplication { let sharedSelector = NSSelectorFromString("sharedApplication") guard UIApplication.responds(to: sharedSelector) else { fatalError("[Extensions cannot access Application]") } let shared = UIApplication.perform(sharedSelector) return shared?.takeUnretainedValue() as! UIApplication } }

Esto le permite llamar efectivamente a UIApplication.shared (solo llame a Application.Shared ) sin que el enlazador se UIApplication.shared loco.

Obtendrá un bloqueo si intenta llamar a esto desde una extensión.

Tengo un marco dinámico que se comparte entre una aplicación de iOS y una extensión. Hay algún código en ese marco que hace referencia a UIApplication , que por supuesto no se puede usar en una extensión. Esas llamadas están completamente aisladas y, por lo tanto, no me preocupa que causen problemas con mi extensión.

Dado que no hay una bandera especificada en el mensaje de advertencia, tal vez no haya manera de hacerlo, pero ¿cómo puedo suprimir la warning: linking against dylib not safe for use in application extensions cuando construyo mi proyecto?


Creo que puedes usar un marco incrustado para compartir código entre la extensión de tu aplicación y su aplicación contenedora. Pero debes tener cuidado de que tu marco no contenga apis que no estén disponibles para las extensiones. Vea que algunas API no están disponibles para las extensiones de aplicación y que usan un marco integrado para compartir código .

Si su marco no contiene tales apis, no se olvide de establecer Require Only App-Extension-Safe API en YES en la Build Settings su objetivo de framework.

Como segunda forma de compartir archivos de origen entre la aplicación y la extensión, no tiene que crear un destino de marco separado. Solo puede compartir archivos de origen dirigiéndose a los dos proyectos.



Para su objetivo de extensión watch / today-widget (así que no es su destino de aplicación o biblioteca), acceda a la configuración del proyecto y cambie la configuración de compilación "APPLICATION_EXTENSION_API_ONLY" / "Require Only App-Extension-Safe API" a NO.


Respuesta corta: no hay realmente una manera de hacerlo.

Lo que terminé haciendo fue refactorizar mi código para extraer las piezas que eran comunes a mi extensión y mi marco dinámico para que mi extensión pudiera hacer referencia de forma segura a esas piezas independientemente del código específico del teléfono.

Terminé haciendo esto porque en algún momento en el futuro tendré que enviarlo a la App Store y las pautas de Apple parecen bastante claras de que hacer referencia a UIApplication es un gran no-no.