组件化整体设计
关键词
- 依赖注入 DI
- IoC 控制反转 Java
- 通信: 中间者(target-action), url, 面向接口
- pod 管理组件
- 组件, 下沉基础组件, 公共组件, 业务组件, Foundation - UI
- 模块, 业务模块
- 其他
组件化通信方式
组件化的资源加载方式
- 给 Pod 添加资源文件
- 关于 Pod 库的资源引用 resource_bundles or resources
- 在Pod库中使用xcasset的拷贝陷阱
- iOS知识小集-170515
- Bundle中添加配置文件
静态库
问题
微信分享功能打包 pod 时,依赖 WechatOpenSDK
, 主项目使用 use_frameworks
, 导致, 无法编译通过
- 初步解决
Podspec
配置
s.dependency 'WechatOpenSDK', '~> 1.8.2'
s.pod_target_xcconfig = {
'FRAMEWORK_SEARCH_PATHS' => '$(inherited) $(PODS_ROOT)/WechatOpenSDK',
'OTHER_LDFLAGS' => '$(inherited) -undefined dynamic_lookup'
}
而主项目和各上层项目的 Podfile
中配置如下
#静态库.a 在最后面添加如下内容:
pre_install do |installer|
# workaround for https://github.com/CocoaPods/CocoaPods/issues/3289
Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
end
发现 Debug
环境下, 没有问题, 但是 Release
环境 启动就崩溃
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x000000012000d088
Triggered by Thread: 0
Filtered syslog:
None found
Dyld Error Message:
Dyld Message: Symbol not found: _OBJC_CLASS_$_SendAuthReq
Referenced from: /private/var/mobile/Containers/Bundle/Application/A73C1507-D652-4A28-8658-AAB219F36379/iLawSchool.app/Frameworks/iLSWechatService.framework/iLSWechatService
Expected in: flat namespace
in /private/var/mobile/Containers/Bundle/Application/A73C1507-D652-4A28-8658-AAB219F36379/iLawSchool.app/Frameworks/iLSWechatService.framework/iLSWechatService
Dyld Version: 370.1
Binary Images:
应该是动态库查微信SDK
时,没有找到的原因.
目前的解决方案还是,全部把 pod
做成 s.static_framework = true
Unable to run command 'StripNIB .nib' - this target might include its own product.
资源文件加载问题
方式1. 是将资源 打包到 bundle
中, 因此不需要担心重名的问题
podspec
配置如下
s.resource_bundles = {
'ModuleA' => ['ModuleA/Resources/*.xcassets','ModuleA/Classes/**/**/*.xib']
}
方式2. 是资源将打包到主bundle
中, 所以不能有重名的出现
podspec
配置如下
s.resources = ['ModuleA/Classes/**/**/*.xib']
如果修改后仍然报同样的错误, 可能是因为 Xcode
升级后的编译器问题, 可以将 Build System
切换为 New Build System
. ps
: 它会导致一些 pod
的头文件智能推荐失败的小 bug
.
如果切换后发现报错,变为了
error: invalid task ('StripNIB.nib') with mutable output but no other virtual output node (in target '')
那么原因是因为在 podspec
文件中设置 source_files
和 resources
同时包含了 xib
等资源文件
只需要修改如下
s.source_files = 'ModuleA/Classes/**/*.{h,m}'
s.resources = ['ModuleA/Classes/**/**/*.xib'] 或者 s.resource_bundles = {
'ModuleA' => ['ModuleA/Resources/*.xcassets','ModuleA/Classes/**/**/*.xib']
} 二选一 设置 xib 等资源
加载方式 见 custom pod loadBundleImage
操作时 注意清除缓存 以及
pod install