1. 問題背景
iOS馬甲包同時安裝后,導(dǎo)致無法搜索到本地設(shè)備。
但是,只安裝一個app的話,就沒有此問題(這說明應(yīng)該是app互相干擾導(dǎo)致的)。
2. 解決過程
1)對比不同打包工具Xcode的版本,iPad對應(yīng)系統(tǒng)的版本。
2)一開始發(fā)現(xiàn)其他事打的包,安裝就沒有該問題,但是后續(xù)用同樣的配置去打包,安裝之后也有問題。
3)重裝系統(tǒng)后,首次安裝使用就是沒有問題的。但是繼續(xù)使用其他app,問題就會復(fù)現(xiàn)。
以上都無法徹底解決該問題,直到測試同事發(fā)現(xiàn)如果只安裝一個APP的話,就不會有網(wǎng)絡(luò)問題。這給排查提供了思路。
經(jīng)過各種查資料,查閱iOS網(wǎng)絡(luò)相關(guān)知識,分析每一個安裝包的UUID(iOS系統(tǒng)下的應(yīng)用唯一標(biāo)識),發(fā)現(xiàn)同一個工程打出的包UUID是相同的,繼而發(fā)現(xiàn)相同的包在網(wǎng)絡(luò)請求時會發(fā)生沖突。
這也是由于我們剛好使用同一套工程去打包出不同app導(dǎo)致的:相同的代碼,僅僅是在打包的時候更換部分資源。這樣系統(tǒng)分辨出可執(zhí)行代碼都是相同的,也就造成了系統(tǒng)給出了同一個UUID。
同時也解釋了為什么安裝北京同事打出的包就沒有網(wǎng)絡(luò)問題,因?yàn)樗麄冐?fù)責(zé)的app和西安團(tuán)隊(duì)不是同一個軟件,也不是同一個工程。
解決方案:
在打每個包時加一些混淆文件,讓系統(tǒng)認(rèn)為這些app差異較大。
具體做法:在每個項(xiàng)目iOS主工程創(chuàng)建一個swift文件,內(nèi)容如下:
class udp1567367194 :UIView{
let myAppleID = "1567367194"
func temporaryFuncToFixUDPIssue(apple:String){
print(myAppleID)
}
}
注意:一定要寫一個print函數(shù),如果只是手動拖入一個類,會被系統(tǒng)認(rèn)為是靜態(tài)資源,但是有了print,iOS系統(tǒng)在編譯的時候,會將方法處理成-performSelector:…這種,從而觸發(fā)系統(tǒng)重構(gòu)UUID。
3. 參考代碼
otool -l Runner.app/Runner| grep LC_UUID -B 1 -A 2
#dirname $0 ,取得當(dāng)前執(zhí)行腳本文件的父目錄
basepath=$(cd `dirname $0`;pwd)
cd ${basepath}/ipas
currentPath=$(pwd)
record=/Users/dragon/Desktop/fix_udp/uuid.txt
echo "當(dāng)前文件夾路徑:$currentPath"
for dir in `ls`
do
#進(jìn)入子目錄
cd $currentPath/$dir
rm -rf Payload
mv *.ipa $dir.zip
unzip *.zip
cd Payload
echo [$dir]的uuid:?? >> $record
uuid=`otool -l Runner.app/Runner| grep LC_UUID -B 1 -A 2`
echo $uuid >> $record
#不用返回上層目錄,for循環(huán)會清空當(dāng)前子路徑
done
