目的
iPhoneを機種変更したところ、MacのiPhoneミラーリングが使えなくなった。
iPhoneミラーリングを起動しても、次のメッセージが表示される。
iPhoneに接続できません
「やり直す」を押しても状況は変わらない。
Macの「システム設定」→「一般」→「AirDropおよび連係」を確認すると、次の状態になっていた。
iPhone ペアリングが進行中です。ペアリングが完了すると、このiPhoneはiPhoneミラーリングに使用されます。
この「ペアリングが進行中です」がいつまで待っても終わらない。
本記事では、Mac側に残ったペアリング情報を作り直し、新しいiPhoneと接続できるようにする。
環境
今回確認した環境は以下。
- macOS 27.0
- macOSビルド番号:26A428
- iOS 27.0
- Appleシリコン搭載Mac
- iPhoneとMacは同じApple Accountを使用
- Wi-Fi、Bluetooth、Handoffはオン
- VPNは未使用
- Macのファイアウォールで「外部からの接続をすべてブロック」はオフ
iPhoneとMacの間でユニバーサルクリップボードによるコピー&ペーストは成功していた。
つまり、Apple AccountやHandoff全体の問題ではなく、iPhoneミラーリング固有のペアリングで止まっているようだ。
最初に試したこと
以下を試したが改善しなかった。
- iPhoneの再起動
- Macの再起動
- iPhoneミラーリングの「やり直す」
- MacのHandoffを一度オフにしてオンに戻す
- Wi-FiとBluetoothの確認
- VPNとファイアウォールの確認
MacのiPhoneミラーリングで「設定」を開いても、「iPhoneアクセスを無効にする」はグレーアウトしていた。
また、新しいiPhoneの「設定」→「一般」→「AirPlayと連係」には「iPhoneミラーリング」が表示されなかった。
Appleによると、iPhone側の「iPhoneミラーリング」設定は、そのiPhoneでミラーリングを正常に使用した後に表示される。そのため、新しいiPhoneで表示されないこと自体は異常ではない。
調査
replicatordとは
macOSには replicatord という標準サービスがある。
Terminalで以下を実行すると説明を確認できる。
man 8 replicatord
replicatord は、iPhoneのリモートウィジェットやiPhoneミラーリングで使う端末情報をMacへ同期するサービスらしい。
写真や連絡先、iPhoneのバックアップを管理するものではない。iPhoneミラーリングで「どの端末とペアリングしているか」といった状態の管理に関係している。
macOS 27では、ペアリング情報が次のSQLiteデータベースに保存されている。
~/Library/Group Containers/group.com.apple.replicatord/replicatord/replicatord.sql
今回と同じmacOS 27.0、同じビルド番号で、ペアリングDBに未完了の状態が残り、iPhoneミラーリングが接続できなくなった報告があった。
症状も次のようにほぼ同じだった。
- MacはiPhoneをBluetoothで検出している
- 「やり直す」を押しても接続できない
- 「iPhoneアクセスを無効にする」がグレーアウト
- iPhone側に「iPhoneミラーリング」が表示されない
- ペアリングが完了しない
そこで、replicatord のDBをバックアップした上で作り直してみることにした。
注意
ここからはApple公式の対処手順ではない。
replicatord の内部DBを退避し、macOSに再生成させる。実行する場合は自己責任で。
必ず先にバックアップを作成する。
また、iPhoneウィジェットなど、iPhoneミラーリング以外の関連付けも再設定が必要になる可能性がある。
(ちなみに写真、アプリ、連絡先、iCloud上のファイルなどを削除する操作ではないことは確認済み)
対処
Terminalにフルディスクアクセスを許可する
「システム設定」→「プライバシーとセキュリティ」→「フルディスクアクセス」を開く。
「ターミナル」をオンにする。
Terminalをすでに起動していた場合は、一度終了して開き直す。
iPhoneミラーリングを終了する
iPhoneミラーリングが起動している場合は、command + Qで完全に終了する。
replicatordを一時停止する
Terminalで以下を実行する。
PAIRING_PID="$(pgrep -x replicatord)"
echo "$PAIRING_PID"
PIDが表示されたことを確認してから一時停止する。
kill -STOP "$PAIRING_PID"
ps -o pid,state,command -p "$PAIRING_PID"
次のように、STATが T になっていれば停止している。
PID STAT COMMAND
713 T /System/Library/PrivateFrameworks/ReplicatorCore.framework/Support/replicatord
PIDは環境によって異なるのでそのつもりで。
DBをバックアップする
DBの保存場所とバックアップ先を変数に設定する。
PAIRING_STATE="$HOME/Library/Group Containers/group.com.apple.replicatord/replicatord"
PAIRING_BACKUP="$HOME/Documents/replicatord-backup-$(date +%Y%m%d-%H%M%S)"
バックアップフォルダを作成し、DB関連ファイルをコピーする。
mkdir -p "$PAIRING_BACKUP"
cp -p "$PAIRING_STATE/replicatord.sql" "$PAIRING_BACKUP/"
cp -p "$PAIRING_STATE/replicatord.sql-wal" "$PAIRING_BACKUP/"
cp -p "$PAIRING_STATE/replicatord.sql-shm" "$PAIRING_BACKUP/"
3ファイルがコピーされたことを確認する。
ls -lh "$PAIRING_BACKUP"
さらにチェックサムを取得する。
shasum -a 256 "$PAIRING_BACKUP"/replicatord.sql*
今回は以下の3ファイルを確認できた。
replicatord.sql
replicatord.sql-shm
replicatord.sql-wal
使用中のDBを退避する
バックアップフォルダ内に、元DBを退避するためのフォルダを作る。
mkdir -p "$PAIRING_BACKUP/originals"
使用中の3ファイルを移動する。
mv -n "$PAIRING_STATE/replicatord.sql" \
"$PAIRING_BACKUP/originals/"
mv -n "$PAIRING_STATE/replicatord.sql-wal" \
"$PAIRING_BACKUP/originals/"
mv -n "$PAIRING_STATE/replicatord.sql-shm" \
"$PAIRING_BACKUP/originals/"
削除ではなく、バックアップフォルダへの移動としている。
退避できたことを確認する。
ls -lh "$PAIRING_BACKUP/originals"
find "$PAIRING_STATE" -maxdepth 1 -name 'replicatord.sql*' -print
最初のコマンドで3ファイルが表示され、2番目のコマンドで何も表示されなければよい。
サービスを再起動する
停止中の古い replicatord を終了する。
kill -KILL "$PAIRING_PID"
Handoffや近距離通信に関係するサービスも再起動する。
killall -TERM sharingd rapportd
これらのサービスはmacOSによって自動的に起動される。
iPhoneミラーリングを起動する
iPhoneをMacの近くに置き、画面をロックする。
TerminalからiPhoneミラーリングを起動する。
open -a "iPhone Mirroring"
今回は初回設定が開始され、新しいiPhoneへ正常に接続できた。
Macの「システム設定」→「一般」→「AirDropおよび連係」に表示されていた「ペアリングが進行中です」も解消した。
バックアップの片づけ
念のためMacを一度再起動し、再起動後もiPhoneミラーリングへ接続できることを確認する。
問題がなければ、作成したバックアップフォルダをゴミ箱へ移動する。
バックアップフォルダ名は各環境で異なるため、実際に作成された名前を確認して指定する。
mv "$HOME/Documents/replicatord-backup-YYYYMMDD-HHMMSS" \
"$HOME/.Trash/"
ゴミ箱を空にするまでは復元できる。
最後にTerminalを終了し、「システム設定」→「プライバシーとセキュリティ」→「フルディスクアクセス」で「ターミナル」をオフに戻す。
元に戻す場合
問題が発生した場合は、新しく作成されたDBを退避し、バックアップしたDBを元の場所へ戻す。
まずiPhoneミラーリングを終了し、新しい replicatord を停止する。
ROLLBACK_PID="$(pgrep -x replicatord)"
kill -STOP "$ROLLBACK_PID"
新しく生成されたDBを別フォルダへ退避する。
FAILED_DB="$PAIRING_BACKUP/failed-new-db"
mkdir -p "$FAILED_DB"
mv -n "$PAIRING_STATE/replicatord.sql" "$FAILED_DB/" 2>/dev/null
mv -n "$PAIRING_STATE/replicatord.sql-wal" "$FAILED_DB/" 2>/dev/null
mv -n "$PAIRING_STATE/replicatord.sql-shm" "$FAILED_DB/" 2>/dev/null
バックアップを元へ戻す。
cp -p "$PAIRING_BACKUP/originals/replicatord.sql" "$PAIRING_STATE/"
cp -p "$PAIRING_BACKUP/originals/replicatord.sql-wal" "$PAIRING_STATE/"
cp -p "$PAIRING_BACKUP/originals/replicatord.sql-shm" "$PAIRING_STATE/"
停止中のサービスを終了して再生成する。
kill -KILL "$ROLLBACK_PID"
killall -TERM sharingd rapportd
まとめ
どうやら、iPhoneの機種変前の情報がMac側のペアリングDBに残っていたようだ。
Wi-Fi、Bluetooth、Handoff、Apple Accountに問題がなくても、replicatord のDBに不整合があると、iPhoneミラーリングだけが接続できなくなる場合がある。
今回はDBをバックアップしてから再生成することで、新しいiPhoneへ接続できるようになった。