Xcode 6和Embedded Frameworks仅在iOS8中受支持

lor*_*isi 68 objective-c dylib dynamic-library ios8

在Xcode 6.0.1中使用嵌入式框架(dyld)时,部署目标小于iOS 8,我得到:

  • 构建成功
  • 运行时库加载错误

错误:

dyld: Library not loaded: @rpath/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2        
Referenced from: /private/var/mobile/Containers/Bundle/Application/DC65ACA9-98E5-46CD-95F8-829D3416F6C0/musiXmatch.app/musiXmatch
Reason: image not found
(lldb) 
Run Code Online (Sandbox Code Playgroud)

Mac*_*nik 39

有一段时间我认为这也是我的问题,但对于普通的应用程序(非iOS-8扩展),你只需要在你的休闲Xcode 6 iOS Universal Framework目标中更改一个构建设置(设置Mach-O类型)到静态库):

将其设置为静态库

之后应该没有iTunes Connect和iOS 7的问题:)

  • 它在验证时说"发现了一个意想不到的Mach-O Header代码:someNumbers ..". (5认同)
  • 我没有去app评论,但这对我一直提交二进制到iTunes连接. (2认同)

lor*_*isi 30

因此,在挖掘之后,我找到了解决方案

假设有你的MyEmbeddedFramework.framework添加到应用程序,执行此操作

  1. 删除常规>嵌入式二进制文件选项卡中的MyEmbeddedFramework.framework
  2. 如果您有MyEmbeddedFramework.framework,请删除Build Phases> Copy Phase"Frameworks".
  3. 清理构建文件夹
  4. 在void Embedded Frameworks部分中移动MyEmbeddedFramework.framework.
  5. 您现在将看到XCode6创建了一个新的构建阶段>嵌入式框架(不是您,它是自动完成的)
  6. 现在,如果你有5,它应该运行没有错误.

所以回顾一下,为了使它工作,你应该看到MyEmbeddedFramework.framework

A)通用>嵌入式二进制文件 一般>嵌入式二进制文件

B)构建阶段>嵌入式框架 构建阶段>嵌入式框架

它在iPhone5/iOS8上运行良好,不是在iPhone4S/iOS7上我得到:

dyld:未加载库:@ rpath/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2引自:/var/mobile/Applications/739D9C44-3B91-4D4F-805B-83BE66C9CBCA/musiXmatch.app/musiXmatch原因:找不到合适的图像.找到:/private/var/mobile/Applications/739D9C44-3B91-4D4F-805B-83BE66C9CBCA/musiXmatch.app/Frameworks/ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2:不兼容的cpu-subtype:0x0000000B in/private/var/mobile/Applications/739D9C44-3B91-4D4F-805B-83BE66C9CBCA/musiXmatch.app /框架/ ObjectiveLyricsTouch2.framework/ObjectiveLyricsTouch2

问题出在EmbeddedFramework中.我不得不

1)将架构设置为默认值2)将有效架构设置为:armv7,armv7s和armv64(因为Apple建议使用armv64来使嵌入式框架工作).

然后我就可以使用嵌入式框架运行应用程序了

  • iPhone5S/iPhone5C iOS8
  • iPhone5S/iPhone5C iOS7
  • iPod 5th gen/iOS7
  • iPhone4S/iOS7
  • iPhone4/iOS7

无论如何,当提交到iTunesConnect时,我得到了最低要求版本的一些错误:

  • 框架"..."的MinimumOSVersion无效.最小值是iOS 8.0;
  • 无效架构:包含应用程序扩展和框架的应用程序必须支持arm64;

嵌入式框架问题

  • 只是说:"它不起作用"这个非常复杂的答案 (14认同)
  • 我是清楚的,你说你的结果表明,即使动态框架可以在iOS 7上运行,App Store Submission Validator也会拒绝尝试在iOS 7上使用动态框架的应用程序? (12认同)
  • 是的,这正是我在这里添加了arm64支持后所要求的,当你拥有一个现代iOS8应用程序,这意味着至少有一个包含app/widget plu嵌入式框架(就像苹果文档一样).然后iTunes Connect会以这种方式回复. (3认同)
  • 我们认为Apple没有太多希望它们能够在iOS7上运行,动态框架上的代码签名问题. (2认同)
  • 对iOS7上的动态框架有何希望? (2认同)

Big*_*esy 12

截至目前,没有办法使用嵌入式框架在应用程序和小部件之间共享代码,并使其在iOS 8以及iOS 7及之前版本上运行.

这是http://atomicbird.com/blog/ios-app-extension-tips上的更多内容

框架与iOS 7

如果您在应用程序和扩展程序之间共享代码,一个很好的方法是创建自己的嵌入式框架来保存代码.在iOS 8上,它将动态加载两种情况,因此您已设置好.

如果你仍然支持iOS 7(或更早版本),那就不那么明确了.嵌入式框架在那里不起作用.App扩展编程指南轻松地指出,您可以使用dlopen来处理这个问题.使用这种方法,您可以编写代码以在运行时动态加载框架,而不是依赖于iOS为您加载框架,如果您已经验证代码是在支持这样做的iOS版本上运行的话.

但是你如何在iOS 7上使用该代码呢?你没有.如果您的共享代码位于嵌入式框架中,则无法在iOS 7上执行它.它只是不可用.

如果你只需要iOS 8上的共享代码,那么dlopen方法可能会很方便.如果你需要在iOS 7上使用它,你需要将它包含在app目标中.一旦你这样做,你就不需要框架了.您仍然可以使用应用程序扩展的框架,但这样做实际上并没有用.你正在做创建框架的工作,但没有从中获得任何好处.只需在两个目标中包含共享代码即可.

从Apple的扩展指南https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf

如果从包含的应用程序链接到嵌入式框架,您仍然可以将其部署到8.0之前的iOS版本,即使这些版本中没有嵌入式框架.