??最近在項目的開發(fā)中遇到了一個問題。用戶反映在iPhone Xs Max上一些界面顯示異常纪蜒。但是手頭沒有這個手機衷恭,而且自從集成了螢石云的SDK以后,項目無法在模擬器上調(diào)試〈啃現(xiàn)在再申請購置一部XS Max手機也來不及了随珠,而且總不能一遇到手頭沒有的設備就申請新手機吧。于是就需要考慮如何讓這種集成了不支持模擬器的SDK如何也能在模擬器上運行杆烁,從而解決這類項目中遇到的個別機型差異造成的BUG牙丽。
一、什么情況下出現(xiàn)這種問題
??剛才說了兔魂,出現(xiàn)在這種問題是集成了第三方的SDK,該SDK不支持模擬器運行举娩。其實析校,再問題具體一點构罗,是因為這類SDK不支持在x86下編譯的話,則不能在模擬器上調(diào)試運行智玻。
二遂唧、解決這種問題的思路。
??其實吊奢,解決這類問題的方法就是四個字:條件編譯盖彭。利用條件編譯,在模擬器環(huán)境下不對不支持x86的SDK進行編譯即可页滚。
??對于有些SDK提供了兩套版本召边,一套Release環(huán)境,一套Debug環(huán)境裹驰。Debug環(huán)境支持在模擬器進行隧熙,對于這類SDK,則可以通過替換SDK的framework的方式來解決模擬器調(diào)試問題幻林。比如阿里云短視頻SDK贞盯,七牛視頻播放SDK等等。
三沪饺、具體解決問題的方法躏敢。
??我們要設置一個預編譯宏,來處理條件編譯整葡,比如設置一個預編譯宏父丰,名字叫EZDISABLE。在Target的Build Settings選項卡下面掘宪,我們找到Preprocessor Macros項蛾扇,雙擊后增加一項:EZDISABLE=1∥汗觯可以只在Debug或者只在Release加入該宏镀首,具體依據(jù)你自己的需求而定。這里我都加入了鼠次。
??下面更哄,就是將用到不支持x86的SDK的調(diào)用,通過EZDISABLE宏“隔離”開腥寇。在我這個項目中成翩,需要把螢石云的SDK“隔離”。
// 如果沒有定義EZDISABLE宏, 則編譯以下內(nèi)容, 否則不編譯
#ifndef EZDISABLE
#import <EZOpenSDKFramework/EZOpenSDKFramework.h>
#endif
......
......
- (void)setupEZ{
// 如果沒有定義EZDISABLE宏, 則編譯以下內(nèi)容, 否則不編譯
#ifndef EZDISABLE
[EZOpenSDK initLibWithAppKey:@"xxxxxx"];
#endif
}
??代碼可能分散的比較多赦役,需要耐心的一個個把他給去掉麻敌。
??上面還說了,有些SDK分Release和Debug兩個版本掂摔,Debug支持模擬器編譯术羔。對于這類赢赊,如果你的SDK是通過手工添加的方式來集成的話,那你就手工一個個一個把SDK給替換了级历,如果你用的是cocoaPods的話释移,那一般只需要將Podfile的引用稍作修改既可以。我這個用的是cocoaPods來集成的七牛視頻播放SDK寥殖。我將Podfile文件修改成下面的即可:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
inhibit_all_warnings!
target 'BBTSer' do
...
...
pod "PLPlayerKit", :podspec => 'https://raw.githubusercontent.com/pili-engineering/PLPlayerKit/master/PLPlayerKit-Universal.podspec' #七牛官方提供的支持模擬器的版本玩讳,在官方網(wǎng)站上可以查到
end
??有時候,我們?yōu)榱朔奖愦a的復用嚼贡,做了很多的私有Pod子庫提供給主項目集成熏纯。如果在這些私有庫中引用了類似七牛這種SDK該怎么辦?其實我們根據(jù)cocoaPods的規(guī)則编曼,完全可以不用考慮子庫豆巨,直接在主工程的Podfile文件將SDK的引用改了就行。cocoaPods會自動處理這類依賴掐场,非常方便往扔。
四、問題優(yōu)化熊户。
??在上面萍膛,已經(jīng)基本上解決了如何在模擬器上編譯的問題。但是不太方便嚷堡,我們總不能每次切換真機與模擬器的時候蝗罗,都去修改一下預編譯宏和Podfile文件吧?
??具體該怎么進行優(yōu)化可以讓我們方便的切換調(diào)試環(huán)境呢?
??對于預編譯宏的設置蝌戒,我們可以通過再設置一個Target的方式來處理串塑,我們將工程的Target復制一個,比如原工程Target名字為:BBTSer北苟。復制的一個改名為:BBTSer Simulator桩匪。我們只在BBTSer Simulator的Build Settings選項卡中的Preprocessor Macros增加預編譯宏EZDISABLE=1。原來的老Target不變友鼻。如果用cocoaPods的話傻昙,在增加了一個新的Target后要相應的修改一下Podfile文件來增加對這個Target的支持。這樣彩扔,就可以通過切換Target的方式來處理真機與模擬器的調(diào)試切換妆档。
??再說下Podfile文件的優(yōu)化。上面講了虫碉,對于七牛的SDK官方支持了在模擬器調(diào)試贾惦,但是是不同的pod庫地址。需要進行切換。那么我們?nèi)绾文軌蚴筩ocoaPod能夠以一種相對自動的方式來處理這種切換呢纤虽?這需要我們更加的了解Podfile的語法才行乳绕。首先绞惦,在上面我們建立了兩個Target逼纸。所以Podfile文件要同時處理兩個Target的集成。然后济蝉,對于不同的Target有可能要集成不同的七牛SDK地址杰刽,如何在pod install的時候來處理這種不同?
??對于第一個問題其實很簡單王滤,百度一下很多方式贺嫂,這里不在敘述。對于第二個問題需要說一下雁乡。在Podfile中第喳,如果兩個或者多個Target引用了相同的pod庫,但是源文件地址不一樣的話踱稍,是會報錯的曲饱。那么我們就需要增加一個開關來處理一下,如果開關打開珠月,則引入正常地址扩淀,如果開關關閉則引入另外一個地址氯窍。我們知道洋幻,Podfile文件的語法其實跟Ruby差不多。所以奈嘿,我們可以增加一個變量release庆聘,然后通過判斷release變量是false還是true來引入不同的源地址胜臊。這樣,我們的Podfile文件就變成了如下行使伙判。
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
inhibit_all_warnings!
#開關變量
release=false
# abstract_target:抽象target象对。內(nèi)部包含兩個Target:BBTSer和BBTSer Simulator。這兩個Targe繼承這個抽象target澳腹。抽象target的名字可以隨意定義织盼,這里我定義成BBT
abstract_target 'BBT' do
...
...
if release then
target 'BBTSer' do
pod "PLPlayerKit"
end
else
target 'BBTSer Simulator' do
pod "PLPlayerKit", :podspec => 'https://raw.githubusercontent.com/pili-engineering/PLPlayerKit/master/PLPlayerKit-Universal.podspec'
end
end
end
到了這里,我們在每次切換模擬器和真機的時候酱塔,只要把release的狀態(tài)改一下就可以了沥邻,真機改成true,模擬器改成false羊娃。然后在pod install或者pod update唐全。你可能會說,這樣也不好。每次還要改Podfile文件邮利。那么好弥雹,我再加一個shell腳本,來幫著我們處理這個改動延届,不要每次都改Podfile文件了剪勿,省的不小心改錯了。shell文件起名為podinstall.sh方庭。內(nèi)容如下:
#!/bin/bash
file="Podfile"
if [ ! -f "$file" ]; then
echo '沒有找到Podfile文件'
exit
fi
if [ ! -n "$1" ] ;then
echo "請輸入?yún)?shù)厕吉。真機調(diào)試以及發(fā)布到AppStore請輸入release,模擬器調(diào)試輸入debug"
exit
fi
MODE=$1
if [ "$MODE" != "release" ] && [ "$MODE" != "debug" ];then
echo "請輸入正確的參數(shù)械念。真機調(diào)試以及發(fā)布到AppStore請輸入release头朱,模擬器調(diào)試輸入debug"
exit
fi
echo "當前集成環(huán)境:$MODE"
podmodel="release=false"
if [ "$MODE" == "release" ];then
podmodel="release=true"
fi
echo $podmodel
# sed -i "s/release=true/$podmodel/g"
# sed -i '' '/release=true/$podmodel/g' $file
sed -i '' "s#release=true#$podmodel#g" $file
sed -i '' "s#release=false#$podmodel#g" $file
#更新pod配置
echo "********************************************"
echo "* 配置完畢,開始Pod集成 *"
echo "********************************************"
pod install
每次pod install的時候龄减,用這個shell來代替项钮。將它和Podfile文件放到一起。真機pod調(diào)用./podinstall.sh release希停。模擬器pod調(diào)用./podinstall.sh debug烁巫。怎么樣,是不是方便多了脖苏?