iOS開發的另類神器:libimobiledevice開源包【類似android adb 方便獲取iOS設備信息】


簡介

libimobiledevice又稱libiphone,是一個開源包,可以讓Linux支持連接iPhone/iPod Touch等iOS設備。由於蘋果官方並不支持Linux系統,但是Linux上的高手絕對不能忍受因為要連接iOS設備就換用操作系統這個事兒。因此就有人逆向出iOS設備與Windows/Mac Host接口的通訊協議,最終成就了橫跨三大桌面平台的非官方版本USB接口library。經常用Linux系統的人一定對libimobiledevice不陌生,但是許多Windows和Mac用戶也許就不知道了。事實上,它同iTools一樣,都是可以替代iTunes,進行iOS設備管理的工具。因為源碼是開放的,可以自行編譯,所以對很多開發者而言可以說更為實用。

官方github地址:https://github.com/libimobiledevice/libimobiledevice

最后還有一點,作為一個前Android開發,習慣使用adb命令各種調試,轉了iOS怎么能沒有這種工具,而去使用iTunes和iTools呢?對此零容忍!

快速直接安裝libmobiledevice的方法

  • 在MacOS下安裝可以使用brew,類似Ubuntu中的apt-get
sudo brew update
sudo brew install libimobiledevice
#libimobiledevice中並不包含ipa的安裝命令,所以還需要安裝
sudo brew install ideviceinstaller
  • Ubuntu下安裝需要添加一個新的軟件庫,里面包含了libimobiledevice
sudo add-apt-repository ppa:pmcenery/ppa
sudo apt-get update
apt-get install libimobiledevice-utils
sudo apt-get install ideviceinstaller

常用功能

  1. 安裝ipa包,卸載應用
//命令安裝一個ipa文件到手機上,如果是企業簽名的,非越獄機器也可以直接安裝了。
ideviceinstaller -i xxx.ipa

//命令卸載應用,需要知道此應用的bundleID
ideviceinstaller -U [bundleID]
  1. 查看系統日志
idevicesyslog
  1. 查看當前已連接的設備的UUID
idevice_id --list 
  1. 截圖
idevicescreenshot 
  1. 查看設備信息
ideviceinfo
  1. 獲取設備時間
idevicedate
  1. 設置代理(也好像是端口轉發的工具,具體能利用它干啥還沒試過)
iproxy
  1. 掛載DeveloperDiskImage,用於調試
ideviceimagemounter
  1. 獲取設備名稱
idevicename
  1. 調試程序(需要預先掛載DeveloperImage)
idevicedebug
  1. 查看和操作設備的描述文件
ideviceprovision list

ideviceinstaller安裝ipa報錯(已經支持iOS11)

"Could not connect to lockdownd. Exiting."

出現這個問題一般是因為新版操作系統的通信協議可能有些微調,參考下面的stackoverflow的帖子,可以通過下面的命令嘗試更新使用最新的libimobiledevice構建版本。

http://stackoverflow.com/questions/39035415/ideviceinstaller-fails-with-could-not-connect-to-lockdownd-exiting

The best solution here is to get the latest libimobiledevice, which has a fix for this particular issue:

brew uninstall ideviceinstaller
brew uninstall libimobiledevice
brew install --HEAD libimobiledevice
brew link --overwrite libimobiledevice
brew install ideviceinstaller
brew link --overwrite ideviceinstaller

掛載文件系統工具:ifuse

  • ifuse是一個依賴libimobiledevice庫的工具,所以必須首先安裝libimobiledevice

  • 首先去 https://osxfuse.github.io/ 下載fuse for macos的庫。

  • 然后github上clone下載ifuse最新源碼到本地(自己決定放哪):

//cd 到要安裝的目標路徑,然后:

git clone https://github.com/libimobiledevice/ifuse.git
  • 進入clone好的目錄,執行:
//將源碼在本機編譯:

./autogen.sh
./configure
make

//執行腳本ifuse到系統終端(其實也可以不用,直接去src中運行也可以)
sudo make install
  • 掛載媒體文件目錄:
//注意,此處的掛載點必須要真實存在,需要預先創建好目錄,否則掛載失敗

ifuse [掛載點]
  • 掛載某應用的documents目錄
ifuse --documents [要掛載的應用的bundleID] [掛載點]

//注意,iOS 8.3之后要求應用的UIFileSharingEnabled權限要開啟,否則可能沒有權限訪問,會有如下的錯誤提示

ERROR: InstallationLookupFailed
The App 'com.wsgh.test' is either not present on the device, or the 'UIFileSharingEnabled' key is not set in its Info.plist. Starting with iOS 8.3 this key is mandatory to allow access to an app's Documents folder.
  • 掛載某應用的整個沙盒目錄 ifuse --container [要掛載的應用的bundleID] [掛載點]
  • 獲取bundleID    ideviceinstaller -l
  • 卸載掛載點   fusermount -u [掛載點]
  • 如果是越獄的設備,並且配置好了,可以使用下面命令掛載整個iphone文件系統(暫時沒試過,還沒有開始研究越獄設備)
ifuse --root [掛載點]
  • 詳細說明,可以進入ifuse的github主頁查看原版文檔
https://github.com/libimobiledevice/ifuse

libimobiledevice其實包含了一大坨有用的工具,裝完后可以敲idevice,再按兩下Tab查看。這里提到的查看控制台日志的工具叫做idevicesyslog,只是那一大坨中的一個而已,其他好玩的請自行發掘。另外要注意,還有個ideviceinstaller不屬於libimobiledevice套件,需要單獨安裝,我上面的命令中順帶着把它也安裝了。這貨是用來管理真機上的app的,安裝/升級/卸載……無所不能。

好了,回歸真題。使用idevicesyslog有些前提條件必須准備好。首先你的iOS設備必須跟當前主機配對過,對,就是第一次插上數據線后手機上提示是否信任電腦的那個提示框,你點擊了信任,就算配對成功。配對功能對應於libimobiledevice套件中的idevicepair命令,具體使用方法可以通過idevicepair --help查看。

其次,你的iOS設備如果處於鎖屏狀態,那idevicesyslog也是無法工作的,這條其實適用於所有idevice*命令。

配對過的iOS設備通過數據線連接到電腦后,執行idevice_id -l,便會列出設備的udid,idevice*系列命令都需要通過-u udid參數來指定操作哪台設備,但如果只有一台設備可用時,就可以忽略-u參數。

好了,有了以上認識,直接執行idevicesyslog來查看通過數據線連接的iOS設備的控制台日志吧。

接下來自然是本文的重點——不插數據線,而是通過WiFi,必須啟用iTunes中的WiFi Sync(無線同步)功能。我們知道,iTunes WiFi Sync工作時,需要手機插着充電,但這里根本無需這個限制。按本屌的理解,啟用這個功能並不是真正要用這個功能,而只是借用它來使手機啟用跟主機進行無線通訊的某個進程而已。一旦WiFi Sync啟用后,libimobiledevice套件就能發現跟當前主機處於同一局域網中,並且配對過的iOS設備。試試idevice_id -l便知,是不是不插數據線也能列出你的udid來了?當然,如果此時還同時連着數據線,那同樣的udid會出現兩次。貌似這是一個feature,而非bug。

只要idevice_id -l能通過WiFi發現你的設備,那idevicesyslog自然也能工作了。

最后嘮一下idevicedebug和上面提到的ideviceinstaller,這兩個(至少是這兩個)命令不能通過WiFi工作,必須通過數據線。
idevicedebug run 'APP_BUNDLE_ID'可以直接launch某個app,當然,這個app必須是你通過development證書build到手機上的才行。
ideviceinstaller -l則可以列出手機上所有的用戶安裝的app,關於ideviceinstaller的其他強大功能,這里就不提了,有興趣的朋友自己去研究吧。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM