从应用程序扩展链接到嵌入式框架

Jan*_*Jan 9 xcode ios ios-frameworks ios-app-extension xcode8

我有一个项目

  • 一个应用目标: MyApp
  • 一个嵌入式框架目标: MyKit.framework
  • 一个应用扩展目标: MyExtension

这是一个示例项目.

我想使用的共享代码MyKitMyExtension,但是当我联系了,我得到的警告

ld: warning: linking against a dylib which is not safe for use in application extensions: /Users/me/Library/Developer/Xcode/DerivedData/MyApp-dnztzmxjghjlsteetlokzhjtjqkm/Build/Products/Debug-iphonesimulator/MyKit.framework/MyKit
Run Code Online (Sandbox Code Playgroud)

Apple的文档说

要配置应用程序扩展目标以使用嵌入式框架,请将目标的"仅限应用程序扩展安全API"构建设置设置为"是".如果不这样做,Xcode会提醒您这样做,方法是显示警告"链接到dylib并不安全,无法在应用程序扩展中使用".

默认情况下正确设置.我可以通过将"仅限App-Extension-Safe API"设置为NO来消除警告,但这可能会导致某些应用程序被拒绝.

该框架不使用应用程序扩展中不允许的任何API.实际上,在示例项目中,您将看到MyKit.framework仅将消息记录到控制台.

从应用程序扩展链接到嵌入式框架的正确方法是什么,以避免这种错误?

sha*_*ght 14

如果您的目标是在App和Extension之间共享代码,则无需创建Framework.您可以将源文件添加到不同的目标:

要使用框架,请YES在框架目标构建设置中设置"仅需要App-Extension-Safe API" .执行此操作后,示例项目中没有警告.


基于意见的补充:由于您不希望在项目之间共享代码,因此使用框架对我来说没有意义.如果你想在项目之间共享代码并因此决定使用框架,我建议在自己的版本控制下使它成为一个独立的Xcode项目.

  • 啊,我必须在框架*中设置"仅需要App-Extension-Safe API"*,而不是在扩展名中!顺便说一下,我必须使用实际在其他应用程序之间共享的框架.我上面的场景只是为了简化问题 (4认同)
  • 是.该错误告诉您,您正在使用可能使用不受支持的API调用的框架.使用"只需要App-Extension-Safe API"= YES`,如果您尝试在框架中使用不受支持的API(例如`UIApplication`),编译器将给您一个错误,从而保证客户端保存到在扩展中使用框架. (2认同)