スマホとPCを遠隔で動かす 第1回
スマホの自動操作はできる?!iOSとAndroid端末の違い

この記事でわかること
- 同じ仕事を Android と iOS で動かした結果
- 必要な物・コードの行数・時間・部品の一覧の差
- iPhone の実機で要る物と、ショートカット等の範囲
確認した環境: Android 11(国内向けスマホ・adb 1.0.41)/ iOS 26.5 シミュレーター(Xcode 26.6・macOS 26.5.2)/ 2026年10月14日に確認
スマホの画面を、プログラムで自動に操作することはできます。ただし、Android と iOS では、必要な物と、できることの範囲が違います。編集部は、同じ仕事を両方で動かして、必要な物・コードの行数・1 回の時間・画面の部品の一覧が取れるかを測りました。iPhone の実機は編集部にないので、iOS はシミュレーターで測り、実機で要る物の一部を Apple の公式の資料で読みました。

自動にする道は 3 つある

- A: PC から adb で Android を動かす。 adb(Android Debug Bridge)は、PC から端末と通信するコマンドです。公式のドキュメントでは、端末の中で命令を実行する窓口(シェル)も使えると説明されています。使うには、端末の「開発者向けオプション」で USB デバッグを ON にします。
- B: 端末の中のアプリが動かす。 Android には、ユーザー補助サービスという仕組みがあります。公式のドキュメントでは、画面の内容を調べ、利用者の代わりにアプリを操作するアプリと説明されています。スクリーン リーダーなどが、その例です。
- C: Mac から Xcode で iPhone のアプリを動かす。 XCUITest は、Xcode に入っている UI のテストの仕組みです。テストのプログラムが、アプリを起動して、画面の部品を押したり読んだりします。
PC で言う「マウスとキーボードを自動で動かす」ことが、スマホでも同じようにできるわけではありません。スマホは、画面を押す・文字を入れるといった操作を、OS が用意した窓口を通して受け付けます。この窓口が、Android と iOS で違います。
実験: 同じ仕事を動かす
仕事と最後の画面

当初は「設定の検索に Wi-Fi と入れて、最初の結果を開く」仕事を考えていました。iOS のシミュレーターでは、検索に「Wi-Fi」「Siri」「アクセシビリティ」「General」と入れても、4 回とも「検索結果なし」でした。設定アプリに、Wi-Fi の項目もありませんでした。シミュレーターの設定が、実機とは違うためと考えられますが、原因は調べていません。
そこで、「設定アプリを開き、アクセシビリティ(Android は ユーザー補助)を開いて、画面の文字を読み取る」仕事に変えました。この項目は、どちらにもあります。
Android: PC から adb(15 行)
PC に adb を入れ、端末を USB でつなぎ、端末で USB デバッグを ON にしました。シェルの手順は、次の 15 行です(コメントと空行を含む)。
#!/bin/zsh
# 設定 → ユーザー補助 を開いて、画面の部品を読み取る(PC から adb)
export PATH=$HOME/Library/Android/sdk/platform-tools:$PATH
cd ~/hda-b6
dump() { adb shell uiautomator dump /sdcard/h.xml >/dev/null && adb pull /sdcard/h.xml h.xml >/dev/null; }
center() { python3 -c '(画面の部品の一覧から、文字が合う部品の中心を探す)' "$1"; }
adb shell am start -W -a android.settings.SETTINGS -f 0x10008000 >/dev/null
for i in 1 2 3 4 5 6 7 8; do
dump; xy=$(center "ユーザー補助"); [ -n "$xy" ] && break
adb shell input swipe 540 1500 540 600 250
done
adb shell input tap $xy
sleep 1; dump
adb exec-out screencap -p > acc.png
python3 -c '(部品の数を数えて表示)'
(読みやすさのために、2 か所の python の中身は文で置き換えています。)
am startで設定アプリを開きます。uiautomator dumpで、いま画面にある部品の一覧(XML)を取ります。- 一覧の中から「ユーザー補助」の文字がある部品を探し、見つからなければ
input swipeで画面を送ります。 - 見つかった部品の中心を
input tapで押し、もう一度一覧を取って、screencapで画面の写しを取ります。
結果は、10 回とも成功でした。1 回の時間は、中央値 12.83 秒(12.56〜15.25 秒)です。最大の 15.25 秒は 1 回目で、別の作業が同じ端末を操作していたという警告が出ていた時間帯です。取れた部品は 61 個で、そのうち文字のある物が 16 個でした。この時間には、画面が整うのを待つ 1 秒と、一覧の取得が含まれます。
画面の写しを取る screencap は、公式のドキュメントにも書かれている命令です。部品の一覧を取る uiautomator dump は、編集部の端末に入っていた命令で、公式の UI Automator のページでは確認できませんでした。UI Automator は、アプリの外から、ほかのアプリや OS のアプリを操作するテストの仕組みと説明されています。
Android: 端末の中のユーザー補助アプリ
同じ端末には、編集部が検証用に入れた、ユーザー補助の権限を持つアプリがあります。インターネットの中継のサーバーを通して、画面の写しを取る・クリックする・文字を入れる、などの命令を送れます。PC を端末につなぐ必要はありません。
同じ仕事を、この道で 1 回動かしました。スクロールを 3 回、画面の写しを 1 回、クリックを 1 回で、「ユーザー補助」の画面が開きました。位置は、画面の写し(画像)を見て決めました。
- 用意されていた道具は、画面の写し・クリック・スクロール・文字入力・キー入力・クリップボード・コマンドの実行などでした。画面の部品の一覧を返す物は、ありませんでした。
- 命令の実行は、アプリと同じ権限の範囲でした。コマンドでアプリを起動しようとしたら、権限がないと断られました。
この道の使い道と、時間、守る決まりは、第 2 回で詳しく扱います。
iOS: Mac と Xcode の XCUITest(18 行)
テストは、Swift で次のように書きました(空行を含めて 18 行)。設定アプリは bundle ID(アプリの識別子)の com.apple.Preferences で起動します。
import XCTest
final class SettingsTest: XCTestCase {
func testOpenAccessibility() throws {
let t0 = Date()
let app = XCUIApplication(bundleIdentifier: "com.apple.Preferences")
app.launch()
let item = app.buttons["com.apple.settings.accessibility"]
XCTAssertTrue(item.waitForExistence(timeout: 10))
item.tap()
XCTAssertTrue(app.navigationBars.firstMatch.waitForExistence(timeout: 10))
let texts = app.staticTexts.allElementsBoundByIndex.map { $0.label }.filter { !$0.isEmpty }
let all = app.descendants(matching: .any).count
let report = "staticTexts=\(texts.count)\nall=\(all)\n\(texts.joined(separator: "\n"))\n---\n\(app.debugDescription)"
try report.write(toFile: "/tmp/hda-b6-report.txt", atomically: true, encoding: .utf8)
print("HDA-ELAPSED \(Date().timeIntervalSince(t0)) STATIC \(texts.count) ALL \(all)")
}
}
テストを動かすための Xcode のプロジェクトは、Xcode の画面を使わず、Ruby の部品(xcodeproj)で 18 行のプログラムから作りました。シミュレーターは xcrun simctl で新しく作り、xcodebuild test で動かしました。画面は開いていません。
結果は、10 回とも成功でした。xcodebuild を動かして終わるまでの全体が、中央値 12.0 秒(11.97〜12.05 秒)です。テストの中だけでは、中央値 8.39 秒でした。ビルドを含む初回の 1 回は、約 41 秒でした。取れた部品は 148 個で、文字のある物が 17 個です。部品ごとに、型・位置・識別子が取れました。
simctl だけでは、アプリの起動・URL を開く・画面の写し・動画の録画まではできますが、画面を押す・文字を入れる命令は見つかりませんでした。押す操作は XCUITest の役目でした。
結果の比較


分かったことは 3 つです。
- 時間は同じくらい。 どちらも 1 回で十数秒でした。iOS の時間はシミュレーターでの値で、実機の時間は測っていません。この時間には、アプリを開く時間と、画面が整うのを待つ時間が含まれます。
- iOS は、Mac と Xcode が前提。 編集部の実験で iOS の自動操作に使った物は、Mac・Xcode・シミュレーターです。Android は、adb が動く PC なら種類を問いません。
- 部品の一覧が取れると、位置を探すのが楽。 adb と XCUITest は、部品の名前や識別子で探せます。画像だけの道は、画像を見て位置を決める必要があります。
iPhone の実機でやるときに要る物
編集部には iPhone の実機がありません。ここからは、Apple の公式の資料に書かれていることです。実機では確かめていません。

- Apple の「Enabling Developer Mode on a device」には、Xcode で作ったアプリを実機で動かすには、実機の開発者モードを ON にすると書かれています。
- 開発者モードの項目は、Mac とペアリングを始めたときか、以前にペアリングしたときだけ、設定に出ます。
- ON にするには、設定の「プライバシーとセキュリティ」でスイッチを入れ、再起動し、もう一度出る確認で、パスコードを入れます。
- テストの中で、アプリは bundle ID で指定して起動できます。Apple のドキュメントには、探す順番も書かれています。見つからない場合は、すでに実機に入っているアプリが起動する、とも書かれています。
署名や開発者としての登録に、どんな条件があるかは、編集部は公式の資料で確かめられていません。実機でやる場合は、Apple のドキュメントで確かめてください。
ショートカット・ミラーリング・スイッチコントロール
Mac から Xcode を使う以外にも、iPhone には自動や遠隔の仕組みがあります。公式の資料で確かめた範囲を、次の表にまとめました。

- ショートカットのオートメーション。 Apple のガイドでは、時刻・場所・アプリを開く、などの出来事をきっかけに、動作を実行する仕組みと説明されています。出来事が起きると、実行するかを聞く通知が出ます。確認なしに動かす設定もあります。オートメーションは、その iPhone だけの設定です。ほかのアプリの画面の、好きな場所を押せるのかは、公式の資料では確かめられませんでした。
- iPhone ミラーリング。 Mac から iPhone の画面を開き、クリック・スクロール・入力で操作できます。iPhone は、ロックされていて Mac の近くにある必要があります。iPhone のカメラとマイクは使えません。EU では使えません。2 台とも同じ Apple Account でサインインしている必要もあります。
- スイッチコントロール。 スイッチ(Bluetooth などの機器・画面・前面のカメラ)を使って、画面の項目を順に選ぶ、アクセシビリティの機能です。項目を自動で順に進める方式などがあります。
どれも、実機では試していません。目的に合うかは、公式の資料で確かめてください。
選び方の目安

目安にした点は、次のとおりです。
- Android は、PC につなげるなら adb が手軽でした。部品の一覧が取れるので、文字や位置で探せます。
- iPhone のアプリを試験的に自動で動かすなら、Mac と Xcode の XCUITest です。部品の識別子まで取れました。
- 端末だけで動かす道もありますが、使える道具が画像だけの場合があります。
気をつけること
- 自動で操作するのは、自分の端末か、持ち主の許可を得た端末だけにしてください。
- アプリの利用規約で、自動操作が禁じられていることがあります。サービスごとに違うので、使う前に各サービスの規約を確かめてください。
- Android のユーザー補助の権限は、画面の内容を調べ、操作できる強い権限です。Google Play の方針と、守るべき点は第 2 回で扱います。
- 画面を OS の窓口から読む自動操作は、画面が変わると動かなくなることがあります。時間の計測は、編集部の 1 台の端末での結果です。
遠隔の操作を OS の外から行う方法は、第 3 回で扱います。
まとめ
- 同じ仕事は、Android が 15 行・約 13 秒、iOS が 18 行・約 12 秒で動きました。
- iOS は Mac と Xcode が前提です。実機で要る物のうち、開発者モードの手順は公式の資料で読みました。署名や開発者としての登録の条件は確かめられておらず、実機での確認もしていません。
- ショートカット・iPhone ミラーリング・スイッチコントロールは、できることと条件がそれぞれ違います。
- 自動操作の前に、端末の持ち主と、アプリの規約を確かめてください。
参考にした公式の情報
- Android Developers「Android Debug Bridge (adb)」
- Android Developers「UI Automator」
- Android Developers「Create your own accessibility service」
- Apple Developer Documentation「XCUIApplication」
- Apple Developer Documentation「init(bundleIdentifier:)」
- Apple Developer Documentation「Enabling Developer Mode on a device」
- Apple サポート「Shortcuts ユーザガイド(Intro to automation shortcuts)」
- Apple サポート「iPhone Mirroring: Use your iPhone from your Mac」
- Apple サポート「iPhone ユーザガイド(Set up Switch Control)」
執筆者
株式会社Game 代表取締役。工学部出身で、21歳で起業してからシステム会社の経営一筋で8期目。アプリの受託開発から始め、いまはAIを使ったシステムソリューションを手がけています。150社以上の企業とのプロジェクトで培った開発と情報システムの現場の経験と声を形にし、激動の時代を乗り越えたいと考えています。
この記事は、Claude Code を使って執筆しました。画面の画像は、検証環境で実際に操作して撮影したものです(引用の画像は出典を記載しています)。内容の誤りはお問い合わせからお知らせください。
連載
スマホとPCを遠隔で動かす全 3 回の目次
- 1スマホの自動操作はできる?!iOSとAndroid端末の違い(この記事)
- 2Android端末を自動で遠隔操作?!アプリしかないあのサービスも遠隔で見られるかも
- 3IP-KVMとは?!次元が違うリモートデスクトップが話題に
