Cocoapods生成静态库(完整)

1、Cocoapods环境安装

cocoapods-packager打包工具安装
sudo gem install cocoapods-packager

2、终端cd 到目录创建SDK

pod lib create iComeSKD

并根据提示完成创建demo工程

3、工程中完善iComeSKD.podspec文件

#
# Be sure to run `pod lib lint iComeSDK.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 http://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
s.name             = 'iComeSDK'
s.version          = '0.1.3'
s.summary          = 'A short description of iComeSDK.'

# 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      = "智慧平台为iCome项目提供的IM专用SDK文件"

s.homepage         = 'https://github.com/zhangrongwu/iComeSDK'
# s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license          = 'MIT'
s.author           = { 'zhangrongwu' => 'zhangrongwuios@sina.com'}
#s.source           = { :git => '/Users/zhangrongwu/iComeProj/iComeSDK', :tag => s.version.to_s }
s.source           = { :git => 'https://source.enncloud.cn/zhangrongwu/iComeSDK', :tag => s.version.to_s }

# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

s.ios.deployment_target = '8.0'

#相对路径很重要,不正确无法引入SDK
s.source_files  = 'iComeSDK/*.{h,m}'
s.source_files  = 'iComeSDK'
s.source_files  = 'iComeSDK/**/*.{h,m}'

s.public_header_files = 'iComeSDK/Header/*.h'

s.resources  = 'iComeSDK/*.{bundle,png,plist}'
#s.resources = 'iComeSDK/**/*.png'

#s.resource_bundles = {
#'iComeSDK' => ['iComeSDK/*.{bundle,png,plist}']
#}

s.frameworks = 'UIKit'
s.dependency 'AFNetworking', '~> 3.1.0'
s.dependency 'FMDB', '~> 2.6.2'
s.dependency 'MBProgressHUD',    '~> 1.0.0'
s.dependency 'SDWebImage',   '~> 3.7.6'
s.dependency 'CocoaAsyncSocket', '~> 7.4.3'
s.dependency 'SAMKeychain',   '~> 1.5.3'
s.dependency 'MJExtension',  '~> 3.0.10'
s.dependency 'MLLabel',  '~> 1.9.1'
s.dependency 'Masonry',  '~> 1.1.0'
s.dependency 'YYKit',  '~> 1.0.9'
s.dependency 'MJRefresh',    '~> 3.1.14.1'
s.dependency 'TZImagePickerController',  '1.7.9'
s.dependency 'FDFullscreenPopGesture',   '~>1.1'
end

4、使用自己的文件替换Pods下ReplaceMe.m文件并完善

完成后在cd 到 Example 执行

pod install 

在demo工程中完善你的sdk使用方法

5、打包具体步骤,顺序很重要

5.1、开发完成静态类库之后,需要运行pod lib lint验证一下类库是否符合pod的要求(cd到podspec文件所在目录下)

pod lib lint iComeSDK.podspec  --no-clean --verbose --allow-warnings 

5.2、更新pod(cd到Podfile文件所在目录下)

pod update --verbose --no-repo-update 或者pod install

5.3、提交,更新版本号(cd到podspec文件所在目录下)

git add .
git commit -a -m'v你新的版本号'
git tag -a 你新的版本号 -m'v你新的版本号'
git push origin 版本号
git push -u origin master 

5.4、打包(cd到podspec所在文件目录下) 打包前修改iComeSDK.podspec中的版本号,修改为5.3时你提交的版本号

pod package iComeSDK.podspec --library --force     打包成.a文件。--force是指强制覆盖

pod package iComeSDK.podspec --force               打包成.framework文件

添加为私有库方式

pod repo push iComeSpecs iComeSDK.podspec

其中iComeSpecs为你存放私有.podspec文件的目录 生成方法:在你的git上创建一个仓库 pod repo add iComeSpecs http://git.oschina.net/xxx/iComeSpecs.git 完成后在.cocopods/repos/目录下可找到iComeSpecs目录 找到后就可以执行上面的命令了。

坑(路径很重要)

1、pod下文件路径问题

s.source_files和s.public_header_files关系,s.source_files中必须包含s.public_header_files文件,不然pod install后会少一些文件

2、s.resources文件问题,加载的bundle方式

+ (UIImage *)imageNamedFromiComeSDKBundle:(NSString *)name {
    
    NSBundle *imageBundle = [self ic_imagePickerBundle];
    name = [name stringByAppendingString:@"@2x"];
    NSString *imagePath = [imageBundle pathForResource:name ofType:@"png"];
    UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
    if (!image) {
        // 兼容业务方自己设置图片的方式
        name = [name stringByReplacingOccurrencesOfString:@"@2x" withString:@"@3x"];
        NSString *imagePath = [imageBundle pathForResource:name ofType:@"png"];
        image = [UIImage imageWithContentsOfFile:imagePath];
    }
    return image;
}

+ (NSBundle *)ic_imagePickerBundle {
    NSBundle *bundle = [NSBundle bundleForClass:[iComeApiManager class]];
    NSURL *url = [bundle URLForResource:@"iComeBundle" withExtension:@"bundle"];
    bundle = [NSBundle bundleWithURL:url];
    return bundle;
}

3、加载Bundle时可能会碰到not yet loaded,不知道为啥,我这直接忽略了,然后图片正常加载

    NSBundle *imageBundle = [self ic_imagePickerBundle];

4、Mac的存储空间重要,额,自己的时256的存储,导致打包失败。清理回收站后成功 5、5.3和5.4认真读,打包前修改*.podspec文件,不是把修改后的 iComeSDK.podspec提交上去。 6、关于资源bundle文件在静态库中存在,然后使用静态库时未能找到问题,处理方案:把bundle资源文件放到静态库同层级目录即可

83B9C0DD-AD5B-443A-A026-5F4D491BF27E.png

上方两个为资源文件。不明白为啥不能直接放到.framework中。 知道的告诉我

target has transitive dependencies that include static binaries: (/Users/zhangrongwu/iComeProj/EmailSDK/Example/Pods/mailcore2-ios/lib/libMailCore-ios.a)

target has transitive dependencies that include static binaries:

处理方案: 1、删除 use_frameworks! 2、pod install

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

并发编程~先导篇上

并发 :一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

1848
来自专栏游戏杂谈

centos/linux 安装node.js

wget  http://www.python.org/ftp/python/2.7/Python-2.7.tar.bz2 tar jfvx Python-2...

802
来自专栏NetCore

Identity Service - 解析微软微服务架构eShopOnContainers(二)

接上一篇,众所周知一个网站的用户登录是非常重要,一站式的登录(SSO)也成了大家讨论的热点。微软在这个Demo中,把登录单独拉了出来,形成了一个Service,...

2505
来自专栏草根专栏

使用Identity Server 4建立Authorization Server (1)

本文内容基本完全来自于Identity Server 4官方文档: https://identityserver4.readthedocs.io/ 官方文档很详...

46810
来自专栏LinXunFeng的专栏

iOS - FTPManager的简单使用及常见问题

1494
来自专栏安恒网络空间安全讲武堂

打个3dsctf,电脑机都开不了?

3DSCTF Malware 3道题 writeup tags: - Reverse - malware ---- 这个ctf有个Malware的题型,...

2459
来自专栏程序员的SOD蜜

使用“消息服务框架”(MSF)实现分布式事务的三阶段提交协议(电商创建订单的示例)

1,示例解决方案介绍 在上一篇 《消息服务框架(MSF)应用实例之分布式事务三阶段提交协议的实现》中,我们分析了分布式事务的三阶段提交协议的原理,现在我们来看看...

3159
来自专栏网络

代理工具shadowProxy之神出鬼没的切换IP地址

前言 在渗透测试过程中,往往会遇到特别“小气”的目标,稍微碰一下就封IP。这种情况下,我们很自然的想到通过网上大量的免费代理进行IP隐匿。 那么问题来了,难道拿...

2858
来自专栏Seebug漏洞平台

使用 XML 内部实体绕过 Chrome 和 IE 的 XSS 过滤器

来源:BypassingXSSFiltersusingXMLInternalEntities 原作者:DavidLitchfield (david@davidl...

38210
来自专栏深度学习计算机视觉

java socket连接之socket半关闭

当我们向服务器传输数据,并不知道传输多少数据时,我们如果当传输数据全部完成后,理科关闭套接字,那么也就立刻与服务器断开了,这个时候就无法获取服务器的响应了 解决...

2797

扫码关注云+社区