ios组件化遇到的问题

很全的podspec字段含义:https://www.jianshu.com/p/1692701d30ae

一、集成第三方库时候对第三方库组件依赖极光SDK,单独将极光sdk拉倒第三方库的话需要设置依赖一堆苹果系统的api,比较麻烦,所以尝试在.podspec文件里面设置组件依赖即可,但是pod install时候却报target has transitive dependencies that include static binaries这个错,网上查下只要把podfile里面最上面的use_frameworks!注释掉即可

原因如下:
对于是否使用Framework,CocoaPods 通过use_frameworks来控制

不使用use_frameworks! -> static libraries 方式 -> 生成.a文件
在Podfile中如不加use_frameworks!,cocoapods会生成相应的 .a文件(静态链接库),
Link Binary With Libraries: libPods-**.a 包含了其他用pod导入有第三库的.a文件
2.use_frameworks! -> dynamic frameworks 方式 -> 生成.framework文件

使用了use_frameworks!,cocoapods会生成对应的frameworks文件(包含了头文件,二进制文件,资源文件等等)

Link Binary With Libraries:Pods_xxx.framework包含了其它用pod导入的第三方框架的.framework文件
1.纯oc项目中 通过pod导入纯oc项目, 一般都不使用frameworks

2.swift 项目中通过pod导入swift项目,必须要使用use_frameworks!,在需要使用的到地方 import AFNetworking

3.swift 项目中通过pod导入OC项目

 1) 使用use_frameworks,在桥接文件里加上#import "AFNetworking/AFNetworking.h"
 2)不使用frameworks,桥接文件加上 #import "AFNetworking.h"

其中当组件不能添加use_frameworks的话,那依赖该组件的工程也不能拥有use_frameworks

二、将第三方库提取成组件时候,有的第三方库有.a静态库文件,导致集成后一旦使用设计到的.a库的类就一直报

clang: error: linker command failed with exit code 1 (use -v to see invocation)

  "_OBJC_CLASS_$_FMDeviceManager", referenced from:

错误。错误是因为连接不到静态库的问题
解决办法就是在.podspec文件里面添加

s.vendored_libraries  = 'BMCThirdModule/Classes/Third/BQSDeviceManager/*.{a}'

意思就是连接组件内静态库,要把相对路径拼接上,
假如有多个bundle的话,写多行即可

对于podspec文件里面的代码描述参考:http://guides.cocoapods.org/syntax/podspec.html#platform

三、在做第三库组件时候由于依赖多个第三方库,并且每个第三方库都有自己的.h和.m以及.a文件,当正常导入时候,coocapods会把这些文件一下子全拉倒夜歌文件夹里面,导致比较乱,所以需要在podspec文件里面构建subspec
格式:

#
# Be sure to run `pod lib lint BMCThirdModule.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'BMCThirdModule'
  s.version          = '0.1.0'
  s.summary          = '集成了极光、猛犸、白骑士、同盾、talkingData、友盟分享'

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'http://172.16.1.161/zhaojingjing/BMCThirdModule'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'zj504225418' => '504225418@qq.com' }
  s.source           = { :git => 'http://172.16.1.161/zhaojingjing/BMCThirdModule.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'


  
  # s.resource_bundles = {
  #   'BMCThirdModule' => ['BMCThirdModule/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
s.dependency 'BMCModule'
s.dependency 'JPush'
s.dependency 'UMCCommon'
s.dependency 'UMCSecurityPlugins'
# U-Share SDK UI模块(分享面板,建议添加)
s.dependency 'UMCShare/UI'
# 集成微信(精简版0.2M)
#s.dependency 'UMCShare/Social/ReducedWeChat'
# 集成微信(完整版14.4M)
s.dependency 'UMCShare/Social/WeChat'
# 集成QQ/QZone/TIM(精简版0.5M)
#s.dependency 'UMCShare/Social/ReducedQQ'
# 集成QQ/QZone/TIM(完整版7.6M)
s.dependency 'UMCShare/Social/QQ'

#s.source_files = 'BMCThirdModule/Classes/**/*'
s.source_files = 'BMCThirdModule/Classes/*.{h,m}'

s.subspec 'bqs' do |bqs|
    bqs.source_files = 'BMCThirdModule/Classes/Third/BQSDeviceManager/**/*'
    bqs.vendored_libraries  = 'BMCThirdModule/Classes/Third/BQSDeviceManager/*.{a}'
end

s.subspec 'maxent' do |maxent|
    maxent.source_files = 'BMCThirdModule/Classes/Third/maxent/2.6.2/**/*'
    maxent.vendored_libraries  = 'BMCThirdModule/Classes/Third/maxent/2.6.2/*.{a}'
end

s.subspec 'TongDun' do |td|
    td.source_files = 'BMCThirdModule/Classes/Third/TongDun/**/*'
    td.vendored_libraries  = 'BMCThirdModule/Classes/Third/TongDun/*.{a}'
end

s.subspec 'TalkingData' do |tk|
    tk.source_files = 'BMCThirdModule/Classes/Third/TalkingData/**/*'
    tk.vendored_libraries  = 'BMCThirdModule/Classes/Third/TalkingData/*.{a}'
end


#s.vendored_libraries  = 'BMCThirdModule/Classes/Third/maxent/2.6.2/*.{a}','BMCThirdModule/Classes/Third/TongDun/*.{a}','BMCThirdModule/Classes/Third/BQSDeviceManager/*.{a}','BMCThirdModule/Classes/Third/TalkingData/*.{a}'

end

end

开始看教程s.source_files应该写成public_header_files ,但是测试一直无效,改成source_files就好了

假如在子文件夹里面依然要细分的话,那么可以在s.subspec里面再加一个s.subspec,例如:

s.source_files = 'BMCThirdModule/Classes/*.{h,m}'

    s.subspec 'AFNetworking' do |afn|

        afn.subspec 'AFNetworking' do |net|

        net.source_files = 'BMCHttpClient/Classes/AFNetworking/AFNetworking/**/*'
        end

        afn.subspec 'UIKit+AFNetworking' do |kit|

        kit.source_files = 'BMCHttpClient/Classes/AFNetworking/UIKit+AFNetworking/**/*'
        end
    end
end

这样一层一层的套即可

四、有时候组件传到git以后,然后在项目中git可能会导致pod不下来,解决方法就是在~/.cocoapods/repos/目录里面找到对了私有库源,把库源删除,然后再次pod install即可。

五、上传podspec文件时候要确保文件里的内容已修改,特别是summary和homepage以及source,假如不修改会导致上传不成功问题

六、有时候私有库内容改了,但是版本号没改,然后pod下来的依然是老的库,原因是pod其实是上次pod下来的缓存,解决办法是:
第一步、进入到~/Library/Caches/CocoaPods/目录下找到对应的库,把对应的库删除掉,
第二步、pod cache clean 你的库名字
第三步、删除Pods/你的库名字,删除Podfile.lock
第四步、pod update --verbose
就可以了

七、集成第三库组件时候由于有个第三方SDK用到了C++,所以该组件对外接口类有一个是.mm文件,但是项目中也有.mm,然后将该组件集成到项目中就报'@import' when C++ modules are disabled, consider using -fmodules and -fcxx-modules,解决办法是将项目中所有的.mm文件全部改成.m即可!

八、组件中如果依赖苹果系统的动态库的话,早podspec文件中加上下面内容,也就是将系统动态库的名字前面的lib和后面的后缀去掉即可

 s.libraries = 'c++'

九、做组件时候,想封装第三方库,但是第三方库不支持模拟器,导致cocoapods一直校验不过,解决方法就是
https://www.jianshu.com/p/88180b4d2ab7

十,假如framework中用到了c++,那么只要引入了这个framework的类后面都要改成.mm

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,937评论 3 118
  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 20,553评论 0 39
  • 即使窗外天气并不冷,可还是喜欢裹着厚厚的大衣把自己整个身躯包起来,因为那样我觉得自己很暖很暖,我喜欢很暖很暖的感...
    依然期待的鱼阅读 199评论 0 0
  • 从山城大叻一路盘山向下,沿海边向南大约不到200公里,就到了美奈。美奈属于潘切市的一个小渔村,以制作鱼露出名,至今...
    呆呆代代阅读 388评论 0 0
  • 听风喃喃,走得仓仓 秋水凉凉,过得晃晃 你把头仰 没有蔚蓝远方 木落香残素霜 银子满地蝶舞忙 你把心敞 犹如春日明...
    冥王星的秋天阅读 492评论 7 6