iOS - 制作CocoaPods依赖未发布framework库

CocoaPods.jpg

背景

公司准备对项目进行模块化, 要使用pod形式. 咱们做过.framework.a形式的sdk. 这pod只是应用.制作还真不了解, 咱也不敢说,咱也不敢问. 没办法, 找资料呗. 度娘的强大实在让人头大. 千篇一律的复制. demo的需求可以满足.但开发中碰到的有太多太多情况了. 自己做的pod工程是私有的. 整理了一些自己遇到的问题. 希望能给其他朋友一些帮助.

正文

  1. 打开终端, cd <文件目录地址> (任意文件夹地址), 本人习惯Desktop位置
cd Desktop
  1. 开始创建pod工程
pod lib create Demo_podProject
  1. 紧接着会有一下信息
What platform do you want to use?? [ iOS / macOS ]
// 这里输入你使用的平台
 > iOS

What language do you want to use?? [ Swift / ObjC ]
//这里输入你使用的语言
 > ObjC

Would you like to include a demo application with your library? [ Yes / No ]
//这里输入你是否需要生成一个 demo 应用
//这里最好 Yes 这样你可以查看你创建的库是否可以使用
 > YES

Which testing frameworks will you use? [ Specta / Kiwi / None ]
// 这里输入你需要用到的测试框架,随意选
 > None

Would you like to do view based testing? [ Yes / No ]
//是否做基于视图的测试 Yes/No 都可以
 > No

What is your class prefix?
//输入前缀
 > JR

回车后, demo会自动打开. 下面是我生成的项目结构

结构.png
  1. podspec文件, 工程的配置信息文件, 非常重要
    下面图片为demo初始样子
podspec.png
  • s.name = 'Demo_podProject' # 工程的名字
  • s.version = '0.1.0' # 版本号
  • s.summary = 'A short description of Demo_podProject. #对你写的库进行简要的概述一下
  • s.description = <<-DESC
    TODO: Add long description of the pod here.
    DESC # 对写的库进行具体的使用方法说明及其他描述 (没觉得太多意义)
  • s.homepage = 'https://github.com/eternal.glory91@gmail.com/Demo_podProject #git库的地址首页,可以在开源中国创建你的库,不需要使用什么初始化方法,不要勾选 readme
  • s.screenshots = 'www.example.com/screenshots_1 # 屏幕快照的地址,例如演示的 gif 文件 (一样觉得没有太多意义)
  • s.license = { :type => 'MIT', :file => 'LICENSE' } #许可证,type-类型file-文件,这里不需要改变,使用默认,文件指向的文件名与工程中文件名要一致。
  • s.author = { 'xxx' => 'xxxx@xx.com' } # 作者信息: 账户名账户邮箱地址
    s.source = { :git => 'https://github.com/eternal.glory91@gmail.com/Demo_podProject.git', :tag => s.version.to_s } # 输入邮箱如果你在开源中国申请的 git 账号,那么把你在开源中国创建的项目的 https 网址输入到这里,
  • s.ios.deployment_target = '8.0' #iOS 支持的最低级别,这里最低8.0
  • s.source_files = 'Demo_podProject/Classes/**/*' #你库文件存放的目录位置,这里通过文件 项目名.xcodeworkspace 打开 xcode,如今打了 pods -> Development Pods -> 工程名 -> 工程名 -> Classes 在 Classes 这个文件夹下我们存放我们创建的类文件(.h,.m文件)
  • s.dependency 'AFNetworking', '~> 2.3' # 如果你的公共库需要依赖其他库,那么打开这里的注释,例如AFNetworking,如果有多个,则依次往后排

重点

当我们使用到自己写的静态库bundle资源文件时如何解决呢

framework

  • 在工程目录结构中创建framework文件夹;路径结构 Desktop->Demo_podProject->Demo_podProject->Framework
  • 将自定义framework放入该文件夹下
  • podspec文件中配置信息, 如下:
  • s.vendored_frameworks = 'xxxxx/Framework/*.framework' #vendored_frameworks是所依赖自定义库, Demo_podProject/Framework查找的路径

Xcode12版本以上编译的framework需要注意

podspec文件中需添加

  • s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
  • s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
    两句话

如果没有上述配置pod repo push会报错

ld: building for iOS Simulator, but linking in dylib built for iOS, file ' XXX ' for architecture arm64
clang: error: linker command failed with exit code 1

bundle

  • 在工程目录结构中创建resource文件夹;路径结构 Desktop->Demo_podProject->Demo_podProject->resource
  • 将bundle文件放入该文件夹下
  • podspec文件中配置信息
  • s.resources = 'xxxxx/resource/*.bundle'

然后执行pod install, 会发工程中创建FrameworksResources两个虚拟文件夹,并且库和资源文件包在各自文件下.

案例.png

路径描述中的 * & ** 说明

  • *匹配所有文件
  • v*匹配所有 以v开头的文件
  • *.framework匹配所有后缀为framework文件 可以任意修改.看所需要后缀的文件
  • **递归匹配所有子文件夹

CocoaPods中bundle文件使用

正常工程中使用bundle文件使用方式,[[[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"name" ofType:@"bundle"]] resourcePath] stringByAppendingPathComponent:@"filename"];但在pod中使用样方式返回的是nil.虽说都是用的bundleWithPath.然而之前的是mainBundle.指的是工程路径下的.CocoaPods路径不算.
解决方案

/**
 获取文件所在name,默认情况下podName和bundlename相同,传一个即可
 
 @param bundleName bundle名字,就是在resource_bundles里面的名字
 @param podName pod的名字
 @return bundle
 */
+ (NSBundle *)bundleWithBundleName:(NSString *)bundleName podName:(NSString *)podName {
    if (bundleName == nil && podName == nil) {
        @throw @"bundleName和podName不能同时为空";
    } else if (bundleName == nil ) {
        bundleName = podName;
    } else if (podName == nil) {
        podName = bundleName;
    }
    
    if ([bundleName containsString:@".bundle"]) {
        bundleName = [bundleName componentsSeparatedByString:@".bundle"].firstObject;
    }
    //没使用framwork的情况下
    NSURL *associateBundleURL = [[NSBundle mainBundle] URLForResource:bundleName withExtension:@"bundle"];
    //使用framework形式
    if (!associateBundleURL) {
        associateBundleURL = [[NSBundle mainBundle] URLForResource:@"Frameworks" withExtension:nil];
        associateBundleURL = [associateBundleURL URLByAppendingPathComponent:podName];
        associateBundleURL = [associateBundleURL URLByAppendingPathExtension:@"framework"];
        NSBundle *associateBunle = [NSBundle bundleWithURL:associateBundleURL];
        associateBundleURL = [associateBunle URLForResource:bundleName withExtension:@"bundle"];
    }
    
    NSAssert(associateBundleURL, @"取不到关联bundle");
    //生产环境直接返回空
    return associateBundleURL?[NSBundle bundleWithURL:associateBundleURL]:nil;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容