iOS 组件化开发小结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sunzhenglin2016/article/details/87988304

安装cocoapods
卸载cocoapods

1.先去git上创建一个仓库XXXkit,用sourceTree clone到本地。

2.在刚刚clone下的工程文件夹中,用CD命令打开之后,用cocoapods创建XXXkit库

pod lib create XXXkit 

如图
例如
创建完毕会自动打开工程。

3.cd 到Example文件下 执行

pod install

打开Example工程
在这里插入图片描述
如下图所示,classes文件夹下的东西就是你库要放的位置,将你要打包的文件包括资源文件,xib,png全部copy此处。
在这里插入图片描述
在pods中找到 xxxKit.podspec文件修改

在这里插入图片描述

一共6处要修改的:

1 模块名。
2 版本号 请与上传git的版本号一致。
3 主页 /git地址 填写你刚刚创建的真实地址。
4 源文件/资源文件 如图所示
5 依赖的第三方库
6 class文件夹下 新建prefix.h 做出头文件 注:新建文件都要在class文件夹下新建,之后使用 pod install命令去更新。

pod install
如果有图片和xib 工程内会生成一个Rerouces文件夹

cmd+b 编译 解决error

若需要分模块 请参考如下代码 不需请略过

 s.subspec 'CoreBundle' do |ss|
   #'CoreBundle'
   ss.public_header_files = 'CoreSupportLib/Classes/CoreBundle/**/*.h'
   ss.source_files = 'CoreSupportLib/Classes/CoreBundle/**/*.{h,m}'
   
 end
 s.subspec 'CoreCategory' do |ss|
   #'CoreCategory'
   ss.public_header_files = 'CoreSupportLib/Classes/CoreCategory/**/*.h'
   ss.source_files = 'CoreSupportLib/Classes/CoreCategory/**/*.{h,m}'
   
 end
 s.subspec 'CoreMacros' do |ss|
   #'CoreMacros'
   ss.public_header_files = 'CoreSupportLib/Classes/CoreMacros/**/*.h'
   ss.source_files = 'CoreSupportLib/Classes/CoreMacros/**/*.{h,m}'
   
 end
 s.subspec 'CoreRouter' do |ss|
   #'CoreRouter'
   ss.public_header_files = 'CoreSupportLib/Classes/CoreRouter/**/*.h'
   ss.source_files = 'CoreSupportLib/Classes/CoreRouter/**/*.{h,m}'

图片和xib的使用请用,不然图片不能正常显示。

pod 'CoreSupportLib/CoreBundle'

NSBundle+txSubBundle
UIImage+txSubBundle

具体代码如下

  [UIImage tx_imgWithName:@"login_back" bundle:TXPublicLoginKit targetClass:self.class]

然后

6.确保工程不报错误

可以在主工程Example for XXXKit里测试代码工程
注:当断点无效时请清除工程。product ->clean Build Folder

6.1 一些问题

ld: library not found for xxxx

解决:在Edit Scheme中,找到Build项,点击+号,找到Pods静态库,点击Add。再尝试编译,编译通过。

Invalid bitcode signature

解决:1、build Settings里搜索把bitcode设置为NO试一试。
解决:2、targets -> build settings -> architectures -> build active architecture only -> debug 改成YES

使用Pods中使用Swift和Objective-C混编-编译不通过的原因-ld: symbol(s) not found for architecture arm64

解决:如果没有Swift文件时请创建一个,空文件就行

Undefined symbols for architecture arm64:

  "_OBJC_IVAR_$_XXXXX", referenced from:
      -[xxxxx xxxx] in xxxxxxxx.o
 ...     
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

.m文件没有导入
在Build Phases里的Compile Sources 中添加报错的文件

7.将本地代码推送到远程仓库

利用sourceTree

commit 
添加标签 即 版本号
push

8.在spec所在文件夹下校验 spec(一定记得先要传版本,pod spec lint 只会验证远程仓库的最新版本)

pod spec lint   --use-libraries --allow-warnings --verbose 

带私有库的校验方式:

pod spec lint TXPublicHomeworkKit.podspec  --use-libraries --allow-warnings --verbose --sources='https://sunzhenglin:----@gitee.com/sunzhenglin/txRepos,https://github.com/CocoaPods/Specs'

当出现如下字样代表校验通过。
在这里插入图片描述
–verbose 打印日志
–allow-warnings 允许warn
–use-libraries 依赖库(s.dependency)包含了.a静态库 是验证是无法通过的。可以通过 --use-libraries 来让验证通过。

9.我们现在可以选择推到公共的索引库和私有的索引库

9.1推到公共的索引库

pod trunk register xxx@126.com 'xx' --description='xx' --verbose

打开验证邮箱收到邮件中链接 确保在spec所在文件夹下

   pod trunk push xx.podspec --use-libraries --allow-warnings --verbose

如果搜不到,不是没传成功,是我们的本地搜索库没更新 。
终端执行

rm ~/Library/Caches/CocoaPods/search_index.json

再执行

pod search xxx

9.2推到私有的索引库

1、私有库/公有库:指的是我们真正放置组件代码的地方。
2、索引库:存放spec文件的地方,用于索引到代码的位置。
打个比方,索引库就好比指针,私有库就好比对象,指针中存放了对象的地址,通过地址可以找到对象!
公共的索引库是指https://github.com/CocoaPods/Specs.git
私有的索引库需要我们自己建
去gitee/github建一个私有库即可
例如https://gitee.com/XXX/txRepos.git
然后

$ pod repo add txRepos https://gitee.com/XXX/txRepos.git

注 删除命令如下加错了可以删除

pod repo remove txRepos

在spec所在文件夹下

pod repo push txRepos xx.podspec --use-libraries --allow-warnings --verbose 

带私有库的验证和推的方法 例如下

pod repo push gitee-txrepos TXPublicLoginKit.podspec --use-libraries --allow-warnings --verbose --sources='https://sunzhenglin:sunlin009@gitee.com/sunzhenglin/txRepos,https://github.com/CocoaPods/Specs'

10,使用

在使用的工程里Podfile要加入如下代码才能 pod install 注意要加,公有库和私有库一个都不能少。

source 'https://github.com/CocoaPods/Specs.git'

source ‘https://gitee.com/XXX/txRepos.git'

其他注意事项

  • 如果组件中含有静态库.a 则需要添加下面代码:
    s.vendored_libraries = ‘xxKit/Classes/**/*.a’
  • 组件化之后,在主工程调试组件中的代码发现,断点显示变量全是nil
    解决:
    打开Xcode 的Build Setting 搜索 optimization
    修改Debug的对应选项 None[-O0]
  • 若是注册邮箱时没反应 说明网络和电脑不行 后面的push基本也不行
  • 创建的私有库代码不走 断点不走
    In Xcode, go to File->Project/Workspace settings.

Change the build system to Legacy Build system.

  • swift 版本报错 bitcode 激活报错
    post_install do |installer|
    installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
    config.build_settings[‘SWIFT_VERSION’] = ‘4.0’
    config.build_settings[‘ENABLE_BITCODE’] = ‘NO’
    end
    end
    end

  • 把库里的东西更新到最新

    pod update --verbose --no-repo-update

  • Undefined symbols for architecture arm64:
    OBJC_CLASS$_MyUICreate”, referenced from:
    objc-class-ref in SZLWorkAttendanceViewController.o
    objc-class-ref in TYDutyCalendarViewController.o
    objc-class-ref in TYReportRecor1HeadView.o
    objc-class-ref in TYReportRecordViewController.o
    ld: symbol(s) not found for architecture arm64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

创建的第三方库,模块中的文件没有暴露,虽然能使用,但是编译找不到。

展开阅读全文

没有更多推荐了,返回首页