iOS Xcode Framework 私有pod

环境:
Mac OS 10.13.3
Xcode 9.2

公司需要部门与部门之间的合作,需要部门提供一个SDK(.framework, .a都可以).

创建RX-iOS github

1.png

记得选择 .gitignore 和 license
创建成功后:https://github.com/xzjxylophone/RX-iOS
在.gitignore 中添加

Podfile.lock
Pods
.DS_Store

Xcode framework创建

2.png

创建成功后显示如下:


3.png

给这个SDK添加一个pod:

platform :ios, '8.0'
target 'RXSDK'
    pod 'RXCategory'
inhibit_all_warnings!

现在要添加资源文件和相关的类
首先添加2个文件夹


4.png

在res添加bundle文件


5.png

添加完成后,显示如下.
6.png

删除RXSDK.bundle下所有的文件,并添加一个图片文件
7.png

在src添加相关的类


8.png

其中比较重要的文件内容:
读取framework中bundle资源文件demo,具体是在UIImage+RXSDK.m 中:
+ (UIImage *)rxsdk_imageInBundle:(NSString *)imageName
{
    NSString *name = [@"Frameworks/RXSDK.framework/RXSDK.bundle" stringByAppendingPathComponent:imageName];
    UIImage *image = [UIImage imageNamed:name];
    return image;
}

RXSDK.h文件和RXSDKHeader.h文件之间的关系
在RXSDK.h添加:

#import "RXSDKHeader.h"

在 RXSDKHeader.h中文件如下:

#import <UIKit/UIKit.h>
@interface RXSDK : NSObject
+ (UIView *)rxsdkView;
@end

注意上面的OC类名与文件名的关系.
这样别人调用的时候就可以:

UIView *view = [RXSDK rxsdkView];

修改相关的配置项目

修改Mach-O Type


9.png

修改Build Phases中配置


10.png

把第二个红色框中的RXSDKHeader.h拖动到第一个红色框(也就是说你需要把所有需要开发中的.h文件拖到Public中去)

生成framework文件

选择任意一个模拟器运行一次(command+B)(动作A)
选择Generic iOS Device运行一次(command+B)(动作B)


11.png

在Products下的RXSDK.framework右击后点击Show in Finder后打开如下的文件夹:


12.png
选择任意一个模拟器会生成-iphonesimulator下的sdk文件
选择Generic iOS Device会生成-iphoneos下的sdk文件

此时显示的都是Debug模式下的sdk文件.
实际上我们是需要release模式的,因此我们可以通过如下的方式来修改
选择Edit Scheme(点击选取Device旁边的那个会弹出一个下拉框后选择Edit Scheme)


13.png

把红色框中的Debug改成Release后,点击 Close
重新执行动作A和动作B
这个时候再Show in Finder得到的文件如下:


14.png

以Release开头的文件夹下的2个内容就是我们所需要的

生成framework

需要合并这两个文件,合并的命令和方式网上也有,此篇文章是使用脚本的方式完成合并.
插入一个知识点介绍:


image.png

需要合并的是第二个红色框中的文件.把两个目录下的RXSDK文件合并成一个后,替换掉其中任何一个后,就是我们最终需要的framework
首先我们在


15.png

新建一个文件夹 BuildScript
在BuildScript添加一个sdkAggregate.sh文件
文件内容如下:
#!/bin/bash
# = 前后不能有空格要不然会出错
echo "run sdkAggregate script begin"
script_dir=${SRCROOT%/*}
target_name=${TARGET_NAME}
# framework的名称
target_name=RXSDK
# framework的扩展名
framework_ext=.framework
framework_file_name=$target_name$framework_ext
# 编译的目录
# /Users/rush.d.xzj/Library/Developer/Xcode/DerivedData/HDRSDK-dhijegzprahyjqhahvwrkuecodnn/Build/Products/Release-iphoneos
# 去掉最后一个反斜杠后面的内容
build_dir=${CONFIGURATION_BUILD_DIR%/*}
# 编译的模式Debug Release
build_mode=${CONFIGURATION}
build_framework_path_iphoneos_for_framework=$build_dir/$build_mode-iphoneos/$framework_file_name
build_framework_merge_path_iphoneos=$build_framework_path_iphoneos_for_framework/$target_name
build_framework_merge_path_iphonesimulator=$build_dir/$build_mode-iphonesimulator/$framework_file_name/$target_name
echo $build_dir
echo $build_mode
echo $build_framework_merge_path_iphoneos
echo $build_framework_merge_path_iphonesimulator
sdk_home_dir=${SRCROOT%/*}
sdk_mid_build_framework_merge_path_tmp_dir=$sdk_home_dir/tmp
echo "中间临时产生的目录:$sdk_mid_build_framework_merge_path_tmp_dir"
# 判断文件夹是否存在:
if [ ! -d "$sdk_mid_build_framework_merge_path_tmp_dir" ]; then
    echo "dir not found need to mkdir"
    mkdir $sdk_mid_build_framework_merge_path_tmp_dir
fi
sdk_mid_build_framework_merge_path_dir=$sdk_mid_build_framework_merge_path_tmp_dir/sdk_mid_build
echo "中间临时产生的目录:$sdk_mid_build_framework_merge_path_dir"
# 判断文件夹是否存在:
if [ ! -d "$sdk_mid_build_framework_merge_path_dir" ]; then
    echo "dir not found need to mkdir"
    mkdir $sdk_mid_build_framework_merge_path_dir
fi
sdk_mid_build_framework_merge_path=$sdk_mid_build_framework_merge_path_dir/$target_name
# 先删除文件
rm -rf $sdk_mid_build_framework_merge_path
echo "os需要合并的文件:$build_framework_merge_path_iphoneos"
echo "simulator需要合并的文件:$build_framework_merge_path_iphonesimulator"
echo "合并后的文件:$sdk_mid_build_framework_merge_path"
# 把os的和simulator的合并成一个
lipo -create "$build_framework_merge_path_iphoneos" "$build_framework_merge_path_iphonesimulator" -output "$sdk_mid_build_framework_merge_path"
sdk_release_output_framework_path_dir=$sdk_mid_build_framework_merge_path_tmp_dir/sdk_release_output
echo "中间临时产生的目录:$sdk_release_output_framework_path_dir"
# 判断文件夹是否存在:
if [ ! -d "$sdk_release_output_framework_path_dir" ]; then
    echo "dir not found need to mkdir"
    mkdir $sdk_release_output_framework_path_dir
fi
sdk_release_output_framework_path=$sdk_release_output_framework_path_dir/$framework_file_name
echo "framework的生成后的路径:$sdk_release_output_framework_path"
# 先删除这个framework
rm -rf $sdk_release_output_framework_path
# 复制os中的framework到刚刚的framework路径下
cp -a $build_framework_path_iphoneos_for_framework $sdk_release_output_framework_path
sdk_release_output_framework_path_file=$sdk_release_output_framework_path/$target_name
echo "需要被替换的文件路径:$sdk_release_output_framework_path_file"
# 先删除此文件
rm -rf $sdk_release_output_framework_path_file
# 再复制
cp -a $sdk_mid_build_framework_merge_path $sdk_release_output_framework_path_file
# TODD: 还需要copy相关文件到相关目录下:

echo "run sdkAggregate script end"

给RXSDK工程添加一个Aggregate的Target
File->New Target->Cross-platform->Other下面的Aggregate
命名为:RXSDKBuild


16.png

点击第三个红色框中的加号
添加一个 New Run Script Phase


17.png

红色框中输入:
echo "run xcode script begin"
script_file_name=sdkAggregate.sh
script_dir=${SRCROOT%/*}/BuildScript  #  坑爹啊 */
script_path=$script_dir/$script_file_name
# 获取目录的相关权限
chmod +x $script_dir
# 获取文件的相关权限
chmod 764 $script_path
# 调用sh脚本文件
source $script_path
echo "run xcode script end"

修改RXSDKBuild的Scheme


17.png

把Debug修改成Release


image.png

这样每次编译的时候(动作C),会自动合并/生成/copy相关的文件到(注意查看相关的脚本文件):
image.png

修改.sh脚本运行的相关结果可以通过如下的方式查看:


image.png

创建framework的github的repository

生成framework的作用就是不想让别人看到我们的代码,因此我们还需要一个git地址,专门放framework文件.
在git上创建一个repository


image.png

git clone 到跟RX-iOS同一个目录下:


image.png

image.png

继续完善.sh脚本在上面的TODD下添加如下的脚本代码
# 需要copy相关文件到相关目录下, 放到framework的git文件下:
sdk_parent_path_dir=${script_dir%/*}
echo "sdk parent path:$sdk_parent_path_dir"
sdk_path_dir=${sdk_parent_path_dir}/RXSDK-iOS/RXSDK
echo "sdk path:$sdk_path_dir"
sdk_framework_file=$sdk_path_dir/$framework_file_name
echo "sdk framework file:$sdk_framework_file"
# 先删除此文件
rm -rf $sdk_framework_file
# 复制framework文件夹
cp -a $sdk_release_output_framework_path $sdk_framework_file
# 最后删除tmp文件夹
rm -rf $sdk_mid_build_framework_merge_path_tmp_dir

执行动作C后,就会得到这样的:


image.png

创建私有仓库

具体可以参考:
https://www.jianshu.com/p/ddc2490bff9f
前半部分.
此篇文章建立的私有仓库地址是:
https://github.com/xzjxylophone/RXSpecs

上传RXSDK到私有仓库中

对于此篇文章示例工程的RXTmpSDK.podspecs文件如下:

Pod::Spec.new do |s|
  s.name     = "RXTmpSDK"
  s.version  = "0.2"
  s.license  = "MIT"
  s.summary  = "RXSDK is a framework"
  s.homepage = "https://github.com/xzjxylophone/RXSDK-iOS"
  s.author   = { 'Rush.D.Xzj' => 'xzjxylophone@gmail.com' }
  s.social_media_url = "http://weibo.com/xzjxylophone"
  s.source   = { :git => 'https://github.com/xzjxylophone/RXSDK-iOS.git', :tag => "v#{s.version}" }
  s.description = %{
        RXSDK is a framework.
  }
  s.vendored_frameworks = 'RXSDK/RXSDK.framework'
  s.resource_bundle = {
    'Paramount' => ['RXSDK/RXSDK.framework/RXSDK.bundle/*.*']
}
  s.source_files = 'RXSDK/RXSDK.framework/Headers/*.h'
  #s.frameworks = 'SystemConfiguration', 'Security', 'CoreGraphics', 'CoreTelephony'
  s.requires_arc = true
  #s.libraries = 'z', 'sqlite3', 'stdc++', 'iconv'
  s.platform = :ios, '8.0'
end

保存后,cd到RXSDK-iOS 目录下后依次运行---动作D
这里有一个问题,具体的解决方案看如下的连接中的问题2:
https://www.jianshu.com/p/3d4d7dc5c6e1

git add --a
git commit -m "add"
git push origin master
git tag 'v0.2'
git push --tags
git push origin master

上面为什么是v0.2,因为我在尝试v0.1的时候有其他地方出错了,所以改成v0.2,记得也需要在.podspecs文件中修改为0.2
为什么是RXTmpSDK了? 因为在官网上已经有一个RXSDK了~~~~~~~
添加到自定义的repository中去:
执行命令:

pod repo push RXSpecs RXTmpSDK.podspec --verbose --allow-warnings

在写代码的过程中难免会有warning,记得最后一定要加上:
--allow-warnings
这样就添加成功了!!!!

验证我们的pod

新建一个工程,添加Podfile:


image.png

Podfile为什么会有:

pod 'RXCategory'

因为在我们的RXSDK中需要用到这个.

pod install一下(动作E)
在ViewController中添加如下代码:


image.png

总结

至此我们整个流程就全部搞定了.
以后需要更新framework的话可以按照如下步骤
1.修改framework中的相关代码
2.动作A
3.动作B
4.动作C
5.动作D (记得更新相关的tag)
6.动作E

步骤2至6也许可以做成一个 jenkins任务~~~~
这个是以后如果有需要的话,再去研究一下

欢迎留言与各种讨论.

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