我有一个Objective-C框架(框架A),它公开了一些公共和一些私有头文件.公共标题也在框架的标题中声明.我有第二个与Objective-C框架链接的Swift框架(框架B).
现在,如果我想在BI中导入A的公共头文件,只需要做一个import A.
但是,如何导入私有标头?
我知道桥接头不是一个选项,因为框架不支持.我是否需要以某种方式为私有标头创建单独的伞形头?
我发现了另一个问题,它带来了有关问题和可能解决方案的更多细节.似乎有一个已知的bug是未来改进的主题.
基于iOS Swift的动态框架中的Objective C类
我正在Swift中开发一个框架,我在框架中使用了一些Objective-C代码.到目前为止,我的模块映射如下所示:
framework module MyModule {
umbrella header "MyModule-umbrella.h"
export *
explicit module Private {
header "MyTools.h"
}
}
Run Code Online (Sandbox Code Playgroud)
我担心的是所有的API MyTools.h都是从框架外部看到的:例如,如果你使用Cocoapods安装框架,那么你import MyModule进入你的应用程序(而不是MyModule.Private),你就能够访问MyTools.h哪些不可取和多余.有没有办法让MyTools从框架外部看不见?
PS.我使用Cocoapods来分发框架,这是我的podspec(最重要的部分):
s.module_map = 'Pod/MyModule.modulemap'
s.frameworks = 'CoreData', 'CoreTelephony', 'SystemConfiguration'
s.resources = 'Pod/Classes/MessageStorage/*.xcdatamodeld'
s.public_header_files = 'Pod/Classes/**/*.h'
s.private_header_files = 'Pod/Classes/MyTools/**/*.h'
s.source_files = 'Pod/Classes/**/*.{h,m,swift}'
Run Code Online (Sandbox Code Playgroud)
PSS.我的伞形标题不会导入MyTools.h
PSSS.只是试图从主模块中排除标题:
framework module MyModule {
umbrella header "MyModule-umbrella.h"
export *
exclude header "MyTools.h"
explicit module Private {
header "MyTools.h"
}
}
Run Code Online (Sandbox Code Playgroud)
没运气.
我CoreNFC sample在Xcode 9.0 beta 2中运行代码时遇到此错误并且应用程序崩溃
dyld: Library not loaded: @rpath/CoreNFC.framework/CoreNFC
Referenced from: /var/containers/Bundle/Application/2837709C-C852-4811-B696-38F2725554D4/iOS-11-by-Examples.app/iOS-11-by-Examples
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?
问题在标题中简单说明。这是我的设置:
构建一个动态框架,可选择链接(弱链接)到 GoogleInteractiveMediaAds.framework。对于使用我的框架的应用程序,GoogleInteractiveMediaAds 是一个可选的依赖项,如果没有它,框架也能正常工作。这是目前工作。
然而,当尝试从位码重建时会出现问题,这通常发生在选择“从位码重建”导出 Ad Hoc 构建时。位码编译过程失败:
ipatool failed with an exception: #<CmdSpec::NonZeroExitException: $/Applications/Xcode.app/Contents/Developer/usr/bin/bitcode-build-tool ...
Run Code Online (Sandbox Code Playgroud)
并深入查看日志文件,我找到了错误描述:
Failed to resolve linkage dependency MyFramework arm64 -> @rpath/GoogleInteractiveMediaAds.framework/GoogleInteractiveMediaAds: Could not resolve @rpath in @rpath/GoogleInteractiveMediaAds.framework/GoogleInteractiveMediaAds from MyFramework
error: GoogleInteractiveMediaAds not found in dylib search path
Run Code Online (Sandbox Code Playgroud)
注意:GoogleInteractiveMediaAds.framework 确实包含位码。
显然,这个错误是通过不选择“从位码重建”来避免的。如果我要回答我自己的问题,我会说,不,看起来从 bitcode 编译时,您不能使用弱链接框架。仅仅是因为 bitcode 编译步骤试图链接到未包含在应用程序目标中的框架。但是,我无法找到任何关于使用位码弱链接的官方文档,或者任何相关的 StackOverflow 答案,所以我不确定我是否遗漏了什么,或者是否有一些相关的编译器/链接器设置我很想让它发挥作用。
swift ×3
frameworks ×2
ios ×2
bitcode ×1
clang ×1
cocoapods ×1
core-nfc ×1
ios11 ×1
iphone ×1
llvm ×1
module ×1
objective-c ×1
weak-linking ×1
xcode9-beta ×1