iOS Xcode Framework 私有pod

環(huán)境:
Mac OS 10.13.3
Xcode 9.2

公司需要部門與部門之間的合作,需要部門提供一個(gè)SDK(.framework, .a都可以).

創(chuàng)建RX-iOS github

1.png

記得選擇 .gitignore 和 license
創(chuàng)建成功后:https://github.com/xzjxylophone/RX-iOS
在.gitignore 中添加

Podfile.lock
Pods
.DS_Store

Xcode framework創(chuàng)建

2.png

創(chuàng)建成功后顯示如下:


3.png

給這個(gè)SDK添加一個(gè)pod:

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

現(xiàn)在要添加資源文件和相關(guān)的類
首先添加2個(gè)文件夾


4.png

在res添加bundle文件


5.png

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

刪除RXSDK.bundle下所有的文件,并添加一個(gè)圖片文件
7.png

在src添加相關(guān)的類


8.png

其中比較重要的文件內(nèi)容:
讀取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文件之間的關(guān)系
在RXSDK.h添加:

#import "RXSDKHeader.h"

在 RXSDKHeader.h中文件如下:

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

注意上面的OC類名與文件名的關(guān)系.
這樣別人調(diào)用的時(shí)候就可以:

UIView *view = [RXSDK rxsdkView];

修改相關(guān)的配置項(xiàng)目

修改Mach-O Type


9.png

修改Build Phases中配置


10.png

把第二個(gè)紅色框中的RXSDKHeader.h拖動(dòng)到第一個(gè)紅色框(也就是說你需要把所有需要開發(fā)中的.h文件拖到Public中去)

生成framework文件

選擇任意一個(gè)模擬器運(yùn)行一次(command+B)(動(dòng)作A)
選擇Generic iOS Device運(yùn)行一次(command+B)(動(dòng)作B)


11.png

在Products下的RXSDK.framework右擊后點(diǎn)擊Show in Finder后打開如下的文件夾:


12.png
選擇任意一個(gè)模擬器會(huì)生成-iphonesimulator下的sdk文件
選擇Generic iOS Device會(huì)生成-iphoneos下的sdk文件

此時(shí)顯示的都是Debug模式下的sdk文件.
實(shí)際上我們是需要release模式的,因此我們可以通過如下的方式來修改
選擇Edit Scheme(點(diǎn)擊選取Device旁邊的那個(gè)會(huì)彈出一個(gè)下拉框后選擇Edit Scheme)


13.png

把紅色框中的Debug改成Release后,點(diǎn)擊 Close
重新執(zhí)行動(dòng)作A和動(dòng)作B
這個(gè)時(shí)候再Show in Finder得到的文件如下:


14.png

以Release開頭的文件夾下的2個(gè)內(nèi)容就是我們所需要的

生成framework

需要合并這兩個(gè)文件,合并的命令和方式網(wǎng)上也有,此篇文章是使用腳本的方式完成合并.
插入一個(gè)知識(shí)點(diǎn)介紹:


image.png

需要合并的是第二個(gè)紅色框中的文件.把兩個(gè)目錄下的RXSDK文件合并成一個(gè)后,替換掉其中任何一個(gè)后,就是我們最終需要的framework
首先我們?cè)?/p>

15.png

新建一個(gè)文件夾 BuildScript
在BuildScript添加一個(gè)sdkAggregate.sh文件
文件內(nèi)容如下:
#!/bin/bash
# = 前后不能有空格要不然會(huì)出錯(cuò)
echo "run sdkAggregate script begin"
script_dir=${SRCROOT%/*}
target_name=${TARGET_NAME}
# framework的名稱
target_name=RXSDK
# framework的擴(kuò)展名
framework_ext=.framework
framework_file_name=$target_name$framework_ext
# 編譯的目錄
# /Users/rush.d.xzj/Library/Developer/Xcode/DerivedData/HDRSDK-dhijegzprahyjqhahvwrkuecodnn/Build/Products/Release-iphoneos
# 去掉最后一個(gè)反斜杠后面的內(nèi)容
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 "中間臨時(shí)產(chǎn)生的目錄:$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 "中間臨時(shí)產(chǎn)生的目錄:$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的合并成一個(gè)
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 "中間臨時(shí)產(chǎn)生的目錄:$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"
# 先刪除這個(gè)framework
rm -rf $sdk_release_output_framework_path
# 復(fù)制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
# 再復(fù)制
cp -a $sdk_mid_build_framework_merge_path $sdk_release_output_framework_path_file
# TODD: 還需要copy相關(guān)文件到相關(guān)目錄下:

echo "run sdkAggregate script end"

給RXSDK工程添加一個(gè)Aggregate的Target
File->New Target->Cross-platform->Other下面的Aggregate
命名為:RXSDKBuild


16.png

點(diǎn)擊第三個(gè)紅色框中的加號(hào)
添加一個(gè) 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
# 獲取目錄的相關(guān)權(quán)限
chmod +x $script_dir
# 獲取文件的相關(guān)權(quán)限
chmod 764 $script_path
# 調(diào)用sh腳本文件
source $script_path
echo "run xcode script end"

修改RXSDKBuild的Scheme


17.png

把Debug修改成Release


image.png

這樣每次編譯的時(shí)候(動(dòng)作C),會(huì)自動(dòng)合并/生成/copy相關(guān)的文件到(注意查看相關(guān)的腳本文件):
image.png

修改.sh腳本運(yùn)行的相關(guān)結(jié)果可以通過如下的方式查看:


image.png

創(chuàng)建framework的github的repository

生成framework的作用就是不想讓別人看到我們的代碼,因此我們還需要一個(gè)git地址,專門放framework文件.
在git上創(chuàng)建一個(gè)repository


image.png

git clone 到跟RX-iOS同一個(gè)目錄下:


image.png

image.png

繼續(xù)完善.sh腳本在上面的TODD下添加如下的腳本代碼
# 需要copy相關(guān)文件到相關(guān)目錄下, 放到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
# 復(fù)制framework文件夾
cp -a $sdk_release_output_framework_path $sdk_framework_file
# 最后刪除tmp文件夾
rm -rf $sdk_mid_build_framework_merge_path_tmp_dir

執(zhí)行動(dòng)作C后,就會(huì)得到這樣的:


image.png

創(chuàng)建私有倉庫

具體可以參考:
http://www.reibang.com/p/ddc2490bff9f
前半部分.
此篇文章建立的私有倉庫地址是:
https://github.com/xzjxylophone/RXSpecs

上傳RXSDK到私有倉庫中

對(duì)于此篇文章示例工程的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 目錄下后依次運(yùn)行---動(dòng)作D
這里有一個(gè)問題,具體的解決方案看如下的連接中的問題2:
http://www.reibang.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,因?yàn)槲以趪L試v0.1的時(shí)候有其他地方出錯(cuò)了,所以改成v0.2,記得也需要在.podspecs文件中修改為0.2
為什么是RXTmpSDK了? 因?yàn)樵诠倬W(wǎng)上已經(jīng)有一個(gè)RXSDK了~~~~~~~
添加到自定義的repository中去:
執(zhí)行命令:

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

在寫代碼的過程中難免會(huì)有warning赴魁,記得最后一定要加上:
--allow-warnings
這樣就添加成功了!!!!

驗(yàn)證我們的pod

新建一個(gè)工程,添加Podfile:


image.png

Podfile為什么會(huì)有:

pod 'RXCategory'

因?yàn)樵谖覀兊腞XSDK中需要用到這個(gè).

pod install一下(動(dòng)作E)
在ViewController中添加如下代碼:


image.png

總結(jié)

至此我們整個(gè)流程就全部搞定了.
以后需要更新framework的話可以按照如下步驟
1.修改framework中的相關(guān)代碼
2.動(dòng)作A
3.動(dòng)作B
4.動(dòng)作C
5.動(dòng)作D (記得更新相關(guān)的tag)
6.動(dòng)作E

步驟2至6也許可以做成一個(gè) jenkins任務(wù)~~~~
這個(gè)是以后如果有需要的話,再去研究一下

歡迎留言與各種討論.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末集峦,一起剝皮案震驚了整個(gè)濱河市凝化,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窟她,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妹孙,居然都是意外死亡罗标,警方通過查閱死者的電腦和手機(jī)庸队,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門积蜻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人彻消,你說我怎么就攤上這事竿拆。” “怎么了宾尚?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵丙笋,是天一觀的道長。 經(jīng)常有香客問我煌贴,道長御板,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任牛郑,我火速辦了婚禮怠肋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘井濒。我一直安慰自己灶似,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布瑞你。 她就那樣靜靜地躺著酪惭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪者甲。 梳的紋絲不亂的頭發(fā)上春感,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音虏缸,去河邊找鬼鲫懒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刽辙,可吹牛的內(nèi)容都是我干的窥岩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼宰缤,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼颂翼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起慨灭,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤朦乏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氧骤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呻疹,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年筹陵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刽锤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镊尺。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姑蓝,靈堂內(nèi)的尸體忽然破棺而出鹅心,到底是詐尸還是另有隱情,我是刑警寧澤纺荧,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布旭愧,位于F島的核電站,受9級(jí)特大地震影響宙暇,放射性物質(zhì)發(fā)生泄漏输枯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一占贫、第九天 我趴在偏房一處隱蔽的房頂上張望桃熄。 院中可真熱鬧,春花似錦型奥、人聲如沸瞳收。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽螟深。三九已至,卻和暖如春烫葬,著一層夾襖步出監(jiān)牢的瞬間界弧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工搭综, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垢箕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓兑巾,卻偏偏與公主長得像条获,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蒋歌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348