How to suppress `warning: linking against dylib not safe for use in application extensions`?

雨燕双飞 提交于 2019-11-30 07:50:46

For your watch/today-widget extension target (so not your app or libray target), go into the project settings and change the build setting "APPLICATION_EXTENSION_API_ONLY" / "Require Only App-Extension-Safe API" to NO.

I think you can use embedded framework to share code between your app extension and its containing app. But you have to be careful that your framework doesn't contain apis which are unavailable to extensions. See Some APIs Are Unavailable to App Extensions and Using an Embedded Framework to Share Code.

If your framework doesn't contain such apis don't forget to set Require Only App-Extension-Safe API to YES in your framework target's Build Settings.

As a second way to share source files between application and extension, you don't have to create a separate framework target. You can just share source files by targeting both two projects.

Short answer: there isn't really a way to do.

What I ended up doing was refactoring my code to pull out the pieces that were common to my extension on and my dynamic frame so that my extension could safely reference those pieces independent of the phone-specific code.

I ended up doing this because sometime in the future I will need to submit this to the App Store and Apple's guidelines seem pretty clear that referencing UIApplication is a pretty big no-no.

Sometimes 'Nanny' doesn't know best.

You can avoid linking to UIApplication.shared and just call the methods dynamically in your 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
    }
}

This allows you to effectively call UIApplication.shared (just call Application.Shared ) without making the linker freak out.

You will get a crash if you try to call this from an extension.

Please do NOT set this in your project settings since Quick (and Nimble) fixed this issue with their updates: https://github.com/Quick/Quick/releases/tag/v1.3.1 (and https://github.com/Quick/Nimble/releases/tag/v7.1.3)!

Just update both dependencies to the newest version and the warning should disappear.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!