iOS 【私有庫】模擬真機合并

下面我們用系統(tǒng)自帶的來新建.framework.然后再添加一個依賴庫 AFNetworking

  1. xcode的菜單欄 File -> New Project 建立一個名為 YohunlUtilsLib 的Cocoa Touch Framework的工程. 將Target 改為 7.0(由于現(xiàn)在大多數(shù)應用都還要支持7.0sdk,故此處我們修改為支持7.0)
    這時候,編譯一下,你可能會遇到警告

我們要修改 Mach-O Type.從默認的Dynamic Library 改為 Static Library,再編譯,警告消失
Static Library 支持IOS8.0 sdk以下的,從目前來看,大多數(shù)工程都還要支持7.0 sdk,所以我們最常用的就是Static Library

命令行,進入目錄下 pod init 建立一個podfile文件,因為我們制作的.framework需要用到AFNetworking網(wǎng)絡庫 PS:你也可以用任意的方式建立這個podfile文件
打開它,因為我采用 pod init命令建立的,打開后你會發(fā)現(xiàn)它已經有內容了
再執(zhí)行 pod install 建立依賴

platform :ios, ‘8.0’
inhibit_all_warnings!

target 'OSUtilsFirstLib' do

pod 'AFNetworking'

end

打開工程,添加一個類TestMode,在其中添加方法(同理添加類AdvModel)

//TestMode.m
#import <Foundation/Foundation.h>

@interface TestMode : NSObject

+ (NSString *)testName:(NSString *)name;
@end

//TestMode.m
#import "TestMode.h"

@implementation TestMode

+ (NSString *)testName:(NSString *)name {
   return [NSString stringWithFormat:@"test:----%@",name];
}
@end

//創(chuàng)建一個帶網(wǎng)絡請求的 類

#import <Foundation/Foundation.h>
@interface YONetwork : NSObject
// 需要 pod AFNetworking

- (void)getGithubReposForUser:(NSString*)user withSuccess:(void(^)(id responseObject))success failure:(void(^)(NSError*error))failure;
- (void)test;
@end

//  YONetwork.m
#import "YONetwork.h"
#import "AFNetworking.h"

@implementation YONetwork

- (void)getGithubReposForUser:(NSString*)user withSuccess:(void(^)(id responseObject))success failure:(void(^)(NSError*error))failure
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:@"https://www.baidu.com" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
        
    }
         success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
             NSLog(@"這里打印請求成功要做的事");
         }
         failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull   error) {
             NSLog(@"%@",error);  //這里打印錯誤信息
         }];
}
- (void) test {
    [self getGithubReposForUser:@"occ"withSuccess:^(id responseObject) {
        NSLog(@"getGithubReposForUser response = %@",responseObject);
    } failure:^(NSError*error) {
        NSLog(@"getGithubReposForUser error = %@",error);
    }];
}
@end

私有庫里的文件頭設置

//  OSUtilsFirstLib.h
#import <UIKit/UIKit.h>
FOUNDATION_EXPORT double OSUtilsFirstLibVersionNumber;
FOUNDATION_EXPORT const unsigned char OSUtilsFirstLibVersionString[];
// 設置開放的頭文件
#import  <OSUtilsFirstLib/YONetwork.h>
6DBF4EB1-E565-42C0-9329-02EE38880820.png

編譯運行 (command + B),生成相應的.framework文件(先選擇模擬器,編譯企锌,在選擇真機讥裤,編譯)
~/資源庫/Developer/Xcode/DerivedData/ 找到 OSUtilsFirstLib 或 在庫上右鍵Show in Finder

434C53BB-3D81-4B73-9B35-DD899E2DB77E.png

可以看到目錄結構如下:

B672600D-38AE-4CCF-8613-C61D0028A932.png

查看靜態(tài)庫支持的CPU架構

?  Release-iphoneos git:(master) ? lipo -info OSUtilsFirstLib.framework/OSUtilsFirstLib
Architectures in the fat file: OSUtilsFirstLib.framework/OSUtilsFirstLib are: armv7 arm64 

說明我們生成的真機framework: OSUtilsFirstLib.framework 包含了兩種架構 armv7 arm64

我們使用命令來合并我們生成的真機和模擬器的framework

1捶惜、建立一個新的target(Aggregate)


54F73597-C916-4B83-AC01-89A6B6158684.png

2搬卒、選擇Target ——> 【+】號———>【New Run Script Phase]


64FF1B25-5B0A-428D-ADAC-26631CFE6C6B.png

添加如下的合并模擬器和真機的腳本(【Run Script 】添加腳本)

4749B363-E0AE-4BCA-B2F2-F22EFE7DBDD5.png

私有庫.framework合并(coocaPods項目)

if [ "${ACTION}" = "build" ]
then


####### PROJECT_NAME = OSUtilsFirstLib
#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"


######## SRCROOT = /Users/occ/Desktop/組件化/私有庫2/OSUtilsFirstLib2
#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"

#真機build生成的.framework文件路徑
BUILD_DEVICE_DIR_F=${build_DIR}/Build/Products/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
echo "BUILD_DEVICE_DIR_F=${BUILD_DEVICE_DIR_F}"

#模擬器build生成的.framework文件路徑
BUILD_SIMULATOR_DIR_F=${build_DIR}/Build/Products/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
echo "BUILD_SIMULATOR_DIR_F=${BUILD_SIMULATOR_DIR_F}"


#合并目標文件夾路徑
RESULT_DIR_F=${SRCROOT}/Products/${PROJECT_NAME}
echo "RESULT_DIR_F=${RESULT_DIR_F}"

#合并目標路徑(合并的包替換目標文件.framework中對應的包)
#└── OSUtilsFirstLib.framework
#    ├── Headers
#    ├── Info.plist
#    ├── Modules
#    ├── OSUtilsFirstLib (替換這個)
#    └── PrivateHeaders

RESULT_DIR_F_A=${SRCROOT}/Products/${PROJECT_NAME}/${PROJECT_NAME}.framework/${PROJECT_NAME}
echo "RESULT_DIR_F_A=${RESULT_DIR_F_A}"

#判斷build文件夾是否存在棕兼,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi

#判斷合并目標文件夾是否存在梅掠,存在則刪除該文件夾
if [ -d "${RESULT_DIR_F}" ]
then
rm -rf "${RESULT_DIR_F}"
fi
#創(chuàng)建目標文件夾
mkdir -p “${RESULT_DIR_F}"

#build之前clean一下
# ============================== build之前clean一下 =============================#

xcodebuild -target ${target_Name} clean

####PROJECT_FILE_PATH = /Users/occ/Desktop/組件化/私有庫2/OSUtilsFirstLib2/OSUtilsFirstLib.xcodeproj
#### CONFIGURATION = Debug

# ============================== build(帶有Pods的) =============================#
#模擬器build
xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration "${CONFIGURATION}" -sdk iphonesimulator -derivedDataPath "${build_DIR}"

#真機build
xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration "${CONFIGURATION}" -sdk iphoneos -derivedDataPath "${build_DIR}"

# 直接換成模擬與真機的
#xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration "${CONFIGURATION}" -derivedDataPath "${build_DIR}" ONLY_ACTIVE_ARCH=NO || exit

#復制真機build的framework文件到目標文件夾
cp -R "${BUILD_DEVICE_DIR_F}" “${RESULT_DIR_F}"

# ======================= 合成模擬器和真機.framework包=========================== #
echo "真機build生成的.framework文件路徑=${BUILD_DEVICE_DIR_F}/${PROJECT_NAME}"
echo "模擬器build生成的.framework文件路徑=${BUILD_SIMULATOR_DIR_F}/${PROJECT_NAME}"

#/Users/occ/Desktop/組件化/私有庫2/OSUtilsFirstLib2/build/Build/Products/Release-iphoneos/OSUtilsFirstLib.framework/OSUtilsFirstLib
#/Users/occ/Desktop/組件化/私有庫2/OSUtilsFirstLib2/build/Build/Products/Release-iphonesimulator/OSUtilsFirstLib.framework/OSUtilsFirstLib


#(合并的包替換目標文件.framework中對應的包)
#└── OSUtilsFirstLib.framework
#    ├── Headers
#    ├── Info.plist
#    ├── Modules
#    ├── OSUtilsFirstLib (替換這個)
#    └── PrivateHeaders
lipo -create "${BUILD_DEVICE_DIR_F}/${PROJECT_NAME}" "${BUILD_SIMULATOR_DIR_F}/${PROJECT_NAME}" -output "${RESULT_DIR_F_A}"

#打開目標文件夾
open "${RESULT_DIR_F}"
fi

靜態(tài)庫.a文件合成(非coocaPods項目)

if [ "${ACTION}" = "build" ]
then


#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"


#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"

#真機build生成的頭文件的文件夾路徑
DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}
echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"

#真機build生成的.a文件路徑
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"

#模擬器build生成的.a文件路徑
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"


#目標文件夾路徑
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
echo "INSTALL_DIR=${INSTALL_DIR}"

#目標頭文件文件夾路徑
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"

#目標.a路徑
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
echo "INSTALL_DIR_A=${INSTALL_DIR_A}"

#判斷build文件夾是否存在枢析,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi

#判斷目標文件夾是否存在玉掸,存在則刪除該文件夾
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#創(chuàng)建目標文件夾
mkdir -p "${INSTALL_DIR}"


#build之前clean一下
xcodebuild -target ${target_Name} clean

#模擬器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator

#真機build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos

#復制頭文件到目標文件夾
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"

#合成模擬器和真機.a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"

#打開目標文件夾
open "${INSTALL_DIR}"
fi

靜態(tài)庫.a文件合成(coocaPods項目)

if [ "${ACTION}" = "build" ]
then

#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"

#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"

#真機build生成的頭文件的文件夾路徑
DEVICE_DIR_INCLUDE=${build_DIR}/Build/Products/Release-iphoneos/include/${PROJECT_NAME}
echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"

#真機build生成的.a文件路徑
DEVICE_DIR_A=${build_DIR}/Build/Products/Release-iphoneos/lib${PROJECT_NAME}.a
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"

#模擬器build生成的.a文件路徑
SIMULATOR_DIR_A=${build_DIR}/Build/Products/Release-iphonesimulator/lib${PROJECT_NAME}.a
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"


#目標文件夾路徑
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
echo "INSTALL_DIR=${INSTALL_DIR}"

#目標頭文件文件夾路徑
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"

#目標.a路徑
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
echo "INSTALL_DIR_A=${INSTALL_DIR_A}"

#判斷build文件夾是否存在,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi

#判斷目標文件夾是否存在醒叁,存在則刪除該文件夾
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#創(chuàng)建目標文件夾
mkdir -p "${INSTALL_DIR}"


#build之前clean一下
xcodebuild -target ${target_Name} clean

#模擬器build
xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration Release -sdk iphonesimulator -derivedDataPath "${build_DIR}"

#真機build
xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration Release -sdk iphoneos -derivedDataPath “${build_DIR}"

#復制頭文件到目標文件夾
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"

#合成模擬器和真機.a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"

#打開目標文件夾
open "${INSTALL_DIR}"
fi

對于添加的腳本,其中用到了很多的 xcode預定義的變量,這些變量怎么來的呢?你可以在命令行下, 輸入

?  OSUtilsFirstLib git:(master) ? xcodebuild -workspace OSUtilsFirstLib.xcworkspace -scheme OSUtilsFirstLib -sdk iphonesimulator -configuration Debug -showBuildSettings > xcodebuild_showBuildSettings.txt

來將所有的xcode預定義變量都導入到文本xcodebuild_showBuildSettings.txt 中,然后你就可以選用你需要的啦

一般都應該合并release模式的,而不是debug模式的framework司浪,設置好后: ccmmand+B 編譯

BF13290E-E3D6-4C55-BAA6-093FDEB3E0E2.png

測試:新建一個項目,將合并的OSUtilsFirstLib.framework拖入到項目中把沼,測試


091523FD-D164-4A4F-B027-74C65F7B1C37.png

當我們使用 Dynamic Library模式(只有iOS8.0及以上才支持)的時候.如同普通文件一樣添加到示例工程中去的話,
直接運行,會出現(xiàn)提示:啊易,可能會報錯:Reason: image not found

選擇 TARGETS [SOTestDemo] ——> Build Phases ——> 【+】號 ——> 【New Copy..】——>【Copy Filses】 添加庫


4136D563-3F08-4EE0-907F-408D3A244529.png

終端命令

打包Framework,測試時:
1饮睬、用模擬器打包租谈,測試時只能跑在模擬器
2、用真機打包,測試時只能跑在真機

解決如下:
1割去、打開終端
2窟却、輸入 lipo -create 【模擬器打包path】 【真機打包path】 -output 【導出兼容版本path】

實現(xiàn)步驟:
1、右擊打開包呻逆,在finder顯示

78429194-A085-4C61-BC7B-5328D177F27C.png

2夸赫、正常我們會看到這些,(一般習慣設置成Release環(huán)境下)咖城,重點是第三個紅框茬腿,這就是我們要合并的東西。


BB10184A-D40D-4EF0-92C0-17734B19F603.png

3宜雀、創(chuàng)建合并文件夾combine
4切平、合并

F89B0C94-4A07-455E-BBAF-5C8DE81EE019.png
lipo -create /Users/occ/Library/Developer/Xcode/DerivedData/OSUtilsFirstLib-absygfecsqswxbfursvwqzmxpzpo/Build/Products/Release-iphoneos/OSUtilsFirstLib.framework/OSUtilsFirstLib /Users/occ/Library/Developer/Xcode/DerivedData/OSUtilsFirstLib-absygfecsqswxbfursvwqzmxpzpo/Build/Products/Release-iphonesimulator/OSUtilsFirstLib.framework/OSUtilsFirstLib -output /Users/occ/Library/Developer/Xcode/DerivedData/OSUtilsFirstLib-absygfecsqswxbfursvwqzmxpzpo/Build/Products/combine/OSUtilsFirstLib 

5、合并文件夾下會出現(xiàn)一個文件

89718EE2-53D3-4D5C-A2B2-2F41A1D6D1CE.png

私有庫合并

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末辐董,一起剝皮案震驚了整個濱河市揭绑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌郎哭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菇存,死亡現(xiàn)場離奇詭異夸研,居然都是意外死亡,警方通過查閱死者的電腦和手機依鸥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門亥至,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贱迟,你說我怎么就攤上這事姐扮。” “怎么了衣吠?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵茶敏,是天一觀的道長。 經常有香客問我缚俏,道長惊搏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任忧换,我火速辦了婚禮恬惯,結果婚禮上,老公的妹妹穿的比我還像新娘亚茬。我一直安慰自己酪耳,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布刹缝。 她就那樣靜靜地躺著碗暗,像睡著了一般颈将。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讹堤,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天吆鹤,我揣著相機與錄音,去河邊找鬼洲守。 笑死疑务,一個胖子當著我的面吹牛,可吹牛的內容都是我干的梗醇。 我是一名探鬼主播知允,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼比庄,長吁一口氣:“原來是場噩夢啊……” “哼忽肛!你這毒婦竟也來了?” 一聲冷哼從身側響起秉版,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤手负,失蹤者是張志新(化名)和其女友劉穎涤垫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竟终,經...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡蝠猬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了统捶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榆芦。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖喘鸟,靈堂內的尸體忽然破棺而出匆绣,到底是詐尸還是另有隱情,我是刑警寧澤什黑,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布崎淳,位于F島的核電站,受9級特大地震影響愕把,放射性物質發(fā)生泄漏凯力。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一礼华、第九天 我趴在偏房一處隱蔽的房頂上張望咐鹤。 院中可真熱鬧,春花似錦圣絮、人聲如沸祈惶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捧请。三九已至凡涩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疹蛉,已是汗流浹背活箕。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留可款,地道東北人育韩。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像闺鲸,于是被迫代替她去往敵國和親筋讨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容