web-dev-qa-db-fra.com

Comment supprimer «avertissement: la liaison avec dylib n'est pas sûre pour une utilisation dans les extensions d'application»?

J'ai un cadre dynamique qui est partagé entre une application iOS et une extension. Il y a du code dans ce framework qui fait référence à UIApplication, c'est-à-dire, bien sûr, non utilisable dans une extension. Ces appels sont complètement isolés et je ne m'inquiète donc pas qu'ils causent des problèmes avec mon poste.

Puisqu'il n'y a pas d'indicateur spécifié dans le message d'avertissement, il n'y a peut-être pas moyen de le faire, mais comment puis-je supprimerwarning: linking against dylib not safe for use in application extensions lors de la construction de mon projet?

38
Wayne Hartman

Pour votre cible d'extension watch/today-widget (donc pas votre cible d'application ou de libray), accédez aux paramètres du projet et modifiez le paramètre de génération "APPLICATION_EXTENSION_API_ONLY"/"Require Only App-Extension-Safe API" sur NO.

29
Oliver Pearmain

Je pense que vous pouvez utiliser un framework intégré pour partager du code entre votre extension d'application et son application contenante. Mais vous devez faire attention à ce que votre framework ne contienne pas d'API qui ne soient pas disponibles pour les extensions. Voir Certaines API ne sont pas disponibles pour les extensions d'application et tilisation d'un cadre intégré pour partager le code .

Si votre framework ne contient pas de tels API, n'oubliez pas de définir Require Only App-Extension-Safe API à [~ # ~] oui [~ # ~] dans le Build Settings.

enter image description here

Comme deuxième moyen de partager des fichiers source entre l'application et l'extension, vous n'avez pas besoin de créer une cible de framework distincte. Vous pouvez simplement partager des fichiers source en ciblant les deux projets.

enter image description here

9
abdullahselek

Réponse courte: il n'y a pas vraiment de moyen de le faire.

J'ai fini par refactoriser mon code pour extraire les éléments communs à mon extension et mon cadre dynamique afin que mon extension puisse référencer en toute sécurité ces éléments indépendamment du code spécifique au téléphone.

J'ai fini par le faire parce que dans le futur, je devrai le soumettre à l'App Store et les directives d'Apple semblent assez claires que référencer UIApplication est un très gros no-no.

7
Wayne Hartman

Parfois, "Nanny" ne sait pas mieux.

Vous pouvez éviter de créer un lien vers UIApplication.shared et appelez simplement les méthodes dynamiquement dans votre framework.

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

Cela vous permet d'appeler efficacement UIApplication.shared (il suffit d'appeler Application.Shared) sans faire paniquer l'éditeur de liens.

Vous aurez obtenez un plantage si vous essayez d'appeler cela à partir d'une extension.

1
Confused Vorlon

Veuillez NE PAS définir cela dans les paramètres de votre projet car Quick (et Nimble) a résolu ce problème avec leurs mises à jour: https://github.com/Quick/Quick/releases/tag/v1.3.1 (et https://github.com/Quick/Nimble/releases/tag/v7.1. )!

Mettez simplement à jour les deux dépendances vers la dernière version et l'avertissement devrait disparaître.

0
blackjacx