Help us understand the problem. What is going on with this article?

iOSコマンド操作

これは何か

Apple Configurator 2のコマンド版

インストール方法

App StoreからApple Configurator 2をインストール。
起動してメニューの「Apple Configurator 2」から「自動化ツールをインストール」を選択
あとはターミナルで任意のディレクトリで。

SSHで実行するときは追加コマンドが必要

$ sudo /bin/launchctl asuser 0 cfgutil list

アプリ(ipa)のインストール

エンタープライズAppやAdhocアプリのインストールにのみ用いる。
古いiTunesとかで取っているストアAppのインストールには不適

$ cfgutil install-app [filename].ipa

ステップ 1/3:同期を開始中 [1/3] [****************************]  100%
ステップ 2/3:“Application Name”を転送中 [2/3] [*************]  100%
ステップ 3/3:デバイスが転送を完了するのを待機中 [3/3] 
Installed [filename].ipa on xxxxxxxxのiPhone (ECID: 0xXXXXXXXXXXXXX).

--- Summary ---
Operation "install-app" succeeded on 1 devices.

アプリのアンインストール

$ cfgutil remove-app [app identifier]

ステップ 1/2:同期を開始中 [1/2] [****************************]  100%
ステップ 2/2:同期中 [2/2] [*************************************]  100%
Removed com.example.app from xxxxxxxxのiPhone (ECID: 0xXXXXXXXXXXXXX).

--- Summary ---
Operation "remove-app" succeeded on 1 devices.

iOSデバイスの復元

最新iOSのインストールと初期化

$ cfgutil restore

--ipsw オプションにて、ipswファイルを指定することが可能

iOSデバイスのアップデート

OSの最新化

$ cfgutil update

--ipsw オプションにて、ipswファイルを指定することが可能

ホーム画面アイコン配置の取得

app identifierを取るのにも使える
ファイルへの保存はリダイレクトで

$ cfgutil get-icon-layout > layout.json

ホーム画面アイコン配置の設定

取得したレイアウトファイルに準じてアイコンを配置する。
設定ファイルに記述され、iOSデバイスにインストールされていないアプリがある場合は、強制オプション(-f | --force)が必要
設定ファイルに記述がないアプリが、iOSデバイスにインストールされている場合は、設定ファイル以降にアプリ名昇順で配置

$ cfgutil set-icon-layout -f layout.json

バックアップ

iTunesのバックアップと同じ

$ cfg-util backup

リストア

$ cfg-util restore-backup

プロファイルのインストール

$cfgutil install-profile [filename].mobileconfig

プロファイルの削除

元のプロファイルがある場合はidentifierの代わりにファイル名の指定も可能

$ cfgutil remove-profile [profile identifier]

iOSデバイスの初期設定

「準備」に相当
監視モードにするときはDER形式のRSA証明書が必要。
地域と言語設定は、スキップさせるとバージョンによっては自動設定が効かないので注意が必要
※基本的に、スキップした場合はmacOS側の地域/言語設定が適用される。

$ cfgutil prepare \
  --locale ja_JP \
  --language jp \
  --skip-all

iOSデバイス情報取得

$ cfgutil get [name]
例:全部
$ cfgutil get all

以下のコマンドをうつと、iOSのUDIDを確認しなくてもrvictlが使えるのでパケットキャプチャとりたい時に稀に便利

rvictl自動化
$ rvictl -s $(cfgutil get UDID)

エイリアス化しておけば即

~/.bash_profile
alias rvistart='rvictl -s $(cfgutil get UDID)'

オプションを指定することで出力結果をJSONで吐き出すことができるので、jqとかでパースをかければ割といい感じでデバイス情報が吐き出せる。

自動実行

接続時
$ cfgutil exec -a attach.sh
接続解除時
$ cfgutil exec -d dettach.sh

iOSデバイスをUSB接続した時、または接続解除したときに指定のスクリプトを実行させる。
下記使用例にあるようなスクリプトを組んでおけば、繋ぐだけで実行されるのでブループリントに比べたらPC側の操作が不要になるかもしれず、楽になるかも知れないことが期待されなくもない。

使用例

ブループリントの置き換えとかに。
同一設定を複数の場所でやるときとかに使えるかもしれない。

mydevice.command
# !/bin/sh

# ダブルクリックで実行できるように
cd `dirname $0`

# 初期化とOS最新化
cfgutil restore

# 準備、監視モード有効化
cfgutil prepare /
 --supervised \
 --host-cert supervisor.der \
 --magic  \
 --name\
 --locale ja_JP \
 --language jp

# プロファイルのインストール
cfgutil install-profile iijmio-cellular.mobileconfig
cfgutil install-profile iOS設定.mobileconfig

# アイコンの配置
cfgutil set-icon-layout -f layout.json

# iOSデバイスの名前変更
cfgutil rename テスト用iPhone

# 壁紙変更
cfgutil set-wallpaper -s lock lockscreen.png
cfgutil set-wallpaper -s home homescreen.png

余談

automatorも使えるようになるけど使いづらかった。
なお上記以外にも機能はあるので、一覧は引数無しでcfgutilを実行。

追伸

上記コマンド例について、Supervisor化した端末に対してコマンドを実施する場合はグローバルオプションで組織識別情報の指定が必要な場合があり。「cfgutil -K supervisor.key -C supervisor.der ~」てな感じで。
逆にこれを指定しない方がいい場合もあり。対話型インストールが必要なプロファイルとか。

garupon
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away