组件化开发 ——— 私有库上传更新遇到的问题及对图片资源的引用

组件化开发 ——— 私有库上传更新遇到的问题及对图片资源的引用

上篇文章说了制作私有库的流程,这里接着说私有库上传更新遇到的问题,及对图片资源的引用。

私有库上传更新遇到的问题

1.组件里按功能“分组”显示

比如我们项目里的WMBaseComponent,就是个功能组合件,像自定义刷新加载,网络,图片选择器等… , 在组件里面按功能分组显示比较直观,也比较符合目前项目阶段的要求。

设置分组的话,需要在放文件的Classes里面 分组对应相应的功能文件,然后在podSpec里这样设置:


    #s.source_files = 'WMBaseComponent/Classes/**/*'

    #子文件夹在此设置
    s.subspec 'PopupUtil' do |ss|
    ss.source_files = 'WMBaseComponent/Classes/PopupUtil/**/*'
    ss.public_header_files = 'WMBaseComponent/Classes/PopupUtil/**/*.{h}'
    end
复制代码

2.组件里引用第三方库,及组件之间引用

当某个组件或小的功能组件里需要引用第三方库时,

比如WMBaseComponent 这个大功能组件库,引用基础库时:

s.dependency 'AFNetWorking'     //引用第三方库
s.dependency 'WMCategoryKit', '~> 0.4' //引用私有组件库
复制代码

当组件里的功能文件引用时:

 s.subspec 'WMImagePickerHandle' do |ss|
    ss.source_files = 'WMBaseComponent/Classes/WMImagePickerHandle/**/*'
    ss.public_header_files = 'WMBaseComponent/Classes/WMImagePickerHandle/**/*.{h}'
    ss.dependency 'TZImagePickerController', '~> 2.2.3' //引用第三方库
    ss.dependency 'WMBaseComponent/PopupUtil' //引用私有组件库
    end
复制代码

3.在pod spec lint 验证时 出现Error提示:

ERROR | [iOS] file patterns: The 'source_files' pattern did not match any file
复制代码

此错误的原因是没有找到匹配的文件。

这个是在指定共享的类库时, 文件路径不对, 也就是设置s.source_files 字段时, 发生了错误。

注意是否有多级文件夹,ss.source_files 对应的路径是否正确。

查看后要是对应的是正确的,但运行还是出现这个错误的话,解决方案:

手动创建文件,具体操作方法如下

open /Users/climbwang/Library/Caches/CocoaPods/Pods/External/<组件名>
复制代码

open后,查看组件里面是否对应,若没有,在里面添加功能组件文件。

4.在组件引用基础组件时,pod spec lint 出现Error提示:

Encountered an unknown error 是因为校验podspec文件时默认只会到官方specs库(github.com/CocoaPods/S…)去校验,如果引用了其他组件,就需要同时指定自己创建的远程索引库地址库校验。

解决方案:

需要执行如下

pod spec lint WMBaseComponent.podspec --sources='git@192.168.1.209:WMComponent/WMSpecs.git,https://github.com/CocoaPods/Specs.git' --verbose --allow-warnings
复制代码

5.当example项目运行正常,但验证时提示:

- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code
复制代码

这是组件里有的可能用到framework,而lint在执行的时候因为静态库无法通过验证。

解决方案 在命令后面追加:

--use-libraries
复制代码

6.验证成功后,pod repo push 后面也加上上述所说

pod repo push WMSpecs WMBaseComponent.podspec --sources='git@192.168.1.209:WMComponent/WMSpecs.git,https://github.com/CocoaPods/Specs.git' --verbose --allow-warnings --use-libraries
复制代码

说到这里,基本上上传 更新时遇到的问题都能解决了。

再添一个,删除tag的代码:

 git tag   //查看已有tag
 git tag -d 0.1    //删除本地tag
 git push origin :0.1 //删除远程tag
复制代码

图片资源的引用

在WMBaseComponetn功能组件库里,我添加了WMRefresh自定义刷新加载图片,而这个组件里面 刷新加载是有图片显示的,为了脱离壳工程耦合,我就把图片相应组件需要的图片资源都放在相应的组件里,成为真正意义的独立。

组件里和Classes平级的是Assets,这个就是存放资源文件的位置。

把图片资源拖入Assets文件夹,需要修改.podspec文件,添加资源的加载路径:

s.resource_bundles = {
     'WMBaseComponent' => ['WMBaseComponent/Assets/*.png']
   }
复制代码

然后执行pod install。然后会发现多了一个Resource的资源文件夹,你所放进Assets里的图片资源都会在这里能看到。

运行Example 却发现图片任然未显示,这是因为项目中是通过[UIImage imageNamed:@“图片名"]方式加载本地图片,而这种方式默认是从mainBundle中去加载图片,这样会找不到图片。

而组件都会有个自己的bundle,比如WMBaseComponent就是WMBaseComponent.bundle, 而添加的图片资源都在这里面能看到,但引用的却是壳工程的mainBundle,所以引用不到。

**所以:**必须指明图片的全名和图片所在bundle的包名.

还有,因为涉及到@2x,@3x图片这里不能写成固定的,应该按照scale来设置,所以组件里设置图片的代码是:

// scale判断是几倍图
NSInteger scale = [[UIScreen mainScreen] scale];
// 指明图片所在bundle的包名
NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
// 获取图片的全名
NSString *imageName = [NSString stringWithFormat:@"refresh_%ld@%zdx.png",(unsigned long)i,scale];
// 获取图片 
NSString *path = [currentBundle pathForResource:imageName ofType:nil inDirectory:@"WMBaseComponent.bundle"];
UIImage *image = [UIImage imageWithContentsOfFile:path];
复制代码

再运行,发现图片可以正常显示了,有没有很激动~~~

到这里,上传时遇到的问题,加载图片资源也差不多完成了,WMBaseComponent也在持续更新中,项目里组件化使用也会越来越完善,下一篇会说——Mediator:组件之间跳转

To Be Continue ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值