USB接続したiOSのudidをCLIから取得する方法あれこれ
iOS開発をしていると、ちょっとしたことを自動化したいということがたまにある。
今回は、開発用のMacに接続しているiOS実機のudid(とついでにnameも)をrubyから扱いたくなったので、CLIから情報を取得する方法を調べたのでまとめてみた。
3種類の方法を紹介します。
- xcrun instruments -s
- mobiledevice
- FastlaneCore::DeviceManager
xcrun instruments -s
やりたいことをググると一番多く見つかるのがこれ。
実際に実行してみると、たくさんのiOSシミュレータのudidがズラズラと列挙されて分かりにくいが、3行目あたりに接続しているiOS実機のnameとudidが表示されているはず。
少々めんどくさいが、正規表現を使えば抽出することが可能。
ちなみに、よく-sの後にdevice
を付ける紹介を見かけるが、自分が試した感じではdevice
の有無で結果は全く変わらなかった。diffコマンドで確認しても差分はなかった。
そもそもxcrun instruments
を実行したときに-sというオプションは表示されていないので出自からして若干謎である。隠しコマンドなのだろうか?
mobiledevice
iOSデバイスの様々な情報を表示したり、アプリのインストールなどができるCLIツール。
仕組みとしては、iTunesが使っているプライベートフレームワークであるMobileDevice.frameworkを叩いてCLIツールとして機能を提供しているようだ。
残念ながら自分はこのあたりに詳しくないが、このMobileDeviceを外から呼び出すライブラリは他にも存在するみたいでこの界隈では有名らしい。
MobileDevice Library - The iPhone Wiki
homebrewからインストールできるが、残念ながらHigh Sierraではインストールできなかった。幸い、git cloneして自分でmakeすればHigh Sierraでも普通に使える。
makeに失敗する場合はxcode-select --install
でcommand line developer toolsをインストールすればmakeできるようになるはずだ。
使い方は、mobiledevice list_devices
で接続しているiOSデバイスのudidだけが列挙される。シンプル。
udid以外の情報も取得可能で、例えばnameならmobiledevice get_device_prop -u UDID DeviceName
で取れる。UDIDにはlist_devicesで表示されたudidを入れてほしい。
mobiledevice list_device_props
で他にも取得可能な要素の一覧が表示されるので、興味があれば色々試してみると面白いかもしれない。
FastlaneCore::DeviceManager
自分は最終的にここに行き着いた。みんな大好きFastlane。
connected_devicesというメソッドを使うことで接続されているiOS実機の情報を取得できる。
fastlane/device_manager.rb at 2.91.0 · fastlane/fastlane · GitHub
ドキュメントは多分存在しないが、使い方はこんな感じで簡単だ。
require 'fastlane_core/device_manager' require 'pp' devices = FastlaneCore::DeviceManager.connected_devices('iOS') pp devices # [#<FastlaneCore::DeviceManager::Device:0x007f883c2a3bb0 # @ios_version="11.2.6", # @is_simulator=false, # @name="Kesin's iPhone", # @os_type="iOS", # @os_version="11.2.6", # @state="Booted", # @udid="*****">] 自分のiPhoneのudidが表示されているので伏せさせて頂く
裏側の仕組みとしては、やはりxcrun instrumens -s
の結果を頑張って正規表現でパースしてインスタンスを作っている。
先人の努力に感謝しつつ、ありがたく使わせて頂きます。
まとめ
- xcrun instruments -s
- 実行するのは最も手軽。ただし、自力で正規表現を頑張る必要はある
- mobiledevice
- FastlaneCore::DeviceManager
- 自分と同じくrubyから使いたい人は最も手軽
自分の用途に合った方法をどうぞ。