【Flutter】突然、iOSの実機ビルドができなくなった原因はAppleWatchでした...

2022/02/03に公開
6

追記:2022年3月14日(月)

Bluetoothの接続を解除して再接続すると、実機ビルドのエラーが出なくなりました!
https://zenn.dev/link/comments/02fd493c51ff6c

今回のエラー

昨日まで、iOSの実機でビルドできていたのに、次の日にビルドしたら、以下のエラーが出て、ビルドできなくなっていました(Xcodeでの実機ビルドやSimulatorへのビルドはできました)

Launching lib/main.dart on bestriserのiPhoneXs in debug mode...
Found saved certificate choice "Apple Development: Yuya Yamamura (XXXXXXXXXX)". To clear, use "flutter config".
Signing iOS app for device deployment using developer identity: "Apple Development: Yuya Yamamura (XXXXXXXXXX)"
Running pod install...
Running Xcode build...
Xcode build done.                                           31.3s
Failed to build iOS app
Error output from Xcode build:
↳
    objc[64650]: Class AMSupportURLConnectionDelegate is implemented in both /usr/lib/libauthinstall.dylib (0x203ab6b90) and /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice (0x107a702c8). One of the two will be used. Which one is undefined.
    objc[64650]: Class AMSupportURLSession is implemented in both /usr/lib/libauthinstall.dylib (0x203ab6be0) and /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice (0x107a70318). One of the two will be used. Which one is undefined.
    xcodebuild: error: Unable to find a destination matching the provided destination specifier:
    		{ id:xxxxxxxx-xxxxxxxxxxxxxxx }

    	The requested device could not be found because no available devices matched the request.

    	Available destinations for the "Runner" scheme:
    		{ platform:macOS, arch:arm64, variant:Designed for [iPad,iPhone], id:00006000-000438593ED8801E }
    		{ platform:iOS Simulator, id:9DE3A940-BD2B-47DD-A0FC-AF18FA6A4206, OS:15.2, name:iPad (9th generation) }
    		{ platform:iOS Simulator, id:02A5CF05-A5EA-4684-8F2E-4997470A688E, OS:15.2, name:iPad Air (4th generation) }
    		{ platform:iOS Simulator, id:864DE640-100B-4FE6-9C0F-6DF9C3054D4E, OS:15.2, name:iPad Pro (9.7-inch) }
    		{ platform:iOS Simulator, id:8994CF9B-0011-4573-91A4-DA51500E6FC3, OS:15.2, name:iPad Pro (11-inch) (3rd generation) }
    		{ platform:iOS Simulator, id:5541B0DA-9722-458E-910E-CF0191861F93, OS:15.2, name:iPad Pro (12.9-inch) (5th generation) }
    		{ platform:iOS Simulator, id:18DCB970-D491-4A9D-8D1B-800F2A261C6D, OS:15.2, name:iPad mini (6th generation) }
    		{ platform:iOS Simulator, id:E13F07D3-C388-473E-B475-F1CABA5DAB88, OS:15.2, name:iPhone 8 }
    		{ platform:iOS Simulator, id:FC2120C7-79DE-473F-936B-80BA4F96EFA8, OS:15.2, name:iPhone 8 Plus }
    		{ platform:iOS Simulator, id:996904BB-A44C-48BD-A00F-C89CD0ABB359, OS:15.2, name:iPhone 11 }
    		{ platform:iOS Simulator, id:EC183C6A-9DD2-4524-9FA1-B139FB6786E2, OS:15.2, name:iPhone 11 Pro }
    		{ platform:iOS Simulator, id:635EC4F5-7A5B-44B8-91A4-E95858AD175A, OS:15.2, name:iPhone 11 Pro Max }
    		{ platform:iOS Simulator, id:CF3EF2DE-F06D-499D-A8BB-AD2D6C2113E1, OS:15.2, name:iPhone 12 }
    		{ platform:iOS Simulator, id:ADAE4053-6A0A-4CA9-8631-21DF31D815BF, OS:15.2, name:iPhone 12 Pro }
    		{ platform:iOS Simulator, id:533465E7-E047-4C9F-92F8-BF1590DCC131, OS:15.2, name:iPhone 12 Pro Max }
    		{ platform:iOS Simulator, id:EB19C2CF-9A59-4C89-A03A-78267D1C1AB3, OS:15.2, name:iPhone 12 mini }
    		{ platform:iOS Simulator, id:117AF7D4-D0F9-438B-97E1-C8D8B7A5B184, OS:15.2, name:iPhone 13 }
    		{ platform:iOS Simulator, id:D0D1D093-55D9-4D8D-AF93-604EE58A6841, OS:15.2, name:iPhone 13 Pro }
    		{ platform:iOS Simulator, id:BCC07411-40F8-4C2A-9FF9-D1116538A14F, OS:15.2, name:iPhone 13 Pro Max }
    		{ platform:iOS Simulator, id:B93F38DC-82EB-488A-8017-67A52C3FD9EC, OS:15.2, name:iPhone 13 mini }
    		{ platform:iOS Simulator, id:B514B4FA-5CDC-46FE-A2A5-13D09F511FFD, OS:15.2, name:iPhone SE (2nd generation) }
    		{ platform:iOS Simulator, id:65AAF29C-96E7-461E-9776-CF830B4EB636, OS:15.2, name:iPod touch (7th generation) }

    	Ineligible destinations for the "Runner" scheme:
    		{ platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Any iOS Device }
    		{ platform:iOS Simulator, id:dvtdevice-DVTiOSDeviceSimulatorPlaceholder-iphonesimulator:placeholder, name:Any iOS Simulator Device }
    		{ platform:iOS, id:xxxxxxxx-xxxxxxxxxxxxxxx, name:bestriserのiPhoneXs, error:Device is busy (Preparing the watch for development via bestriserのiPhoneXs) }

Could not build the precompiled application for the device.
════════════════════════════════════════════════════════════════════════════════
Building a deployable iOS app requires a selected Development Team with a 
Provisioning Profile. Please ensure that a Development Team is selected by:
  1- Open the Flutter project's Xcode target with
       open ios/Runner.xcworkspace
  2- Select the 'Runner' project in the navigator then the 'Runner' target
     in the project settings
  3- Make sure a 'Development Team' is selected under Signing & Capabilities > Team. 
     You may need to:
         - Log in with your Apple ID in Xcode first
         - Ensure you have a valid unique Bundle ID
         - Register your device with your Apple Developer Account
         - Let Xcode automatically provision a profile for your app
  4- Build or run your project again

For more information, please visit:
  https://flutter.dev/docs/get-started/install/macos#deploy-to-ios-devices

Or run on an iOS simulator without code signing
════════════════════════════════════════════════════════════════════════════════

Error launching application on bestriserのiPhoneXs.

開発チームの設定?

最後のエラーメッセージを読むと、「デプロイ可能なiOSアプリを構築するには、開発チームと
プロビジョニングプロファイルが選択されている事を確認して下さい」と書かれていたので、Xcodeで、Runner > TARGETS > Runner > Signing & Capabilities > Team を確認してみましたが、特に問題はなさそうでした。

Xcode > Team

デバイスリストの設定?

他のTeamを設定しているプロジェクトではビルドできたので、Teamの設定がおかしいのかな?と思い、Certificates, Identifiers & Profiles を確認してみたところ、警告が出ていました。
Certificates 1

「新しいデバイスを追加する前に、デバイスリストが新しい会員年度用に更新されていることを確認してください」と書かれていたので、これだな。。と思い、指示に従ってみました。
Update your device list.
Confirm your devices and reset.

が、ビルド結果は同じでした。。

他の実機でも同じ?

試しに、別のiPhone(奥さんのiPhone)をデバイス登録してみたところ、エラーメッセージが変わりました!

Launching lib/main.dart on mayuのiPhoneXs in debug mode...
Automatically signing iOS for device deployment using specified development team in Xcode project: KR52U58XC9
Running Xcode build...
Xcode build done.                                            3.5s
Failed to build iOS app
Error output from Xcode build:
↳
    objc[69851]: Class AMSupportURLConnectionDelegate is implemented in both /usr/lib/libauthinstall.dylib (0x203ab6b90) and /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice (0x1066cc2c8). One of the two will be used. Which one is undefined.
    objc[69851]: Class AMSupportURLSession is implemented in both /usr/lib/libauthinstall.dylib (0x203ab6be0) and /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice (0x1066cc318). One of the two will be used. Which one is undefined.
    ** BUILD FAILED **


Xcode's output:
↳
    note: Using new build system
    note: Planning
    note: Build preparation complete
    note: Building targets in dependency order
    error: Provisioning profile "iOS Team Provisioning Profile: *" doesn't include the currently selected device "xxxxのiPhoneXs" (identifier xxxxxxxx-xxxxxxxxxxxxxxxx). (in target 'Runner' from project 'Runner')
    /Users/yuyayamamura/Development/Projects/Flutter/bestrise/video_base_app/ios/Pods/Pods.xcodeproj: warning: The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.2.99. (in target 'FMDB' from project 'Pods')

Could not build the precompiled application for the device.

Error launching application on mayuのiPhoneXs.

デバイスの初期設定が必要かと思ったので、Xcodeでビルドしてから、AndroidStudioでビルドしてみたところ、ビルドが成功しました!

成功した実機と失敗した実機の違いはAppleWatch?!

自分のiPhoneでビルドできるようにしたいので、もう少し調査したいと思います。

奥さんのiPhoneと僕のiPhoneの違いは何でしょうか?

flutter doctor -vを叩いてみると、僕のiPhoneだけ、! Error: bestriserのiPhoneXs is busy: Preparing the watch for development via bestriserのiPhoneXs. Xcode will continue when bestriserのiPhoneXs is finished. (code -10)が表示されていました。

【Xcode】”〜のiPhone is busy: Preparing debugger support for 〜のiPhone”というエラーを解消出来るかもしれない方法を参考に、

  1. iPhoneを再起動
  2. Xcodeを再起動
  3. iPhoneをXcodeに接続し直す
  4. Window > Devices and Simulatorsを開く

まで、試してみたところ、AppleWatch関連の警告が表示されていました。
Devices and Simulators 1
Devices and Simulators 2

一応、参考記事の通りに、Unpair Deviceを実行してみます。
Unpair Device

Devices and Simulatorsの警告は消えませんでした。

次は、AppleWatchの原因を調査するために、

  1. AppleWatchのペアリングを解除
  2. Xcodeを再起動
  3. iPhoneを右クリックして、Unpair Deviceを実行

を実行してみたところ、Devices and Simulatorsの警告は消えました。
Devices and Simulators 3

このまま、AndroidStudioに戻って、iOSの実機ビルドを実行してみたところ、自分のiPhoneでも実機ビルドができました!!!

AppleWatchのペアリングが問題だったようです。

AppleWatchをペアリングしながら実機ビルドするためには?

AppleWatchを接続しながら、iPhoneに実機ビルドできるようにしたいので、もう少し、調査してみます。

もう一度、AppleWatchとペアリングして、ERROR AND WARNINGSの詳細を確認してみたところ、「リカバリーの提案 デバイス上のOSのバージョンが、インストールされているXcodeのバージョンと互換性がない場合、この操作は失敗する可能性があります。また、互換性を正しく検出するために、macやデバイスを再起動する必要がある場合があります。」と書かれていました。

ERROR AND WARNINGS 1
ERROR AND WARNINGS 2

Details

山村祐也さんのApple Watch via bestriserのiPhoneXs: Failed to prepare device for development.
Domain: com.apple.dtdevicekit
Code: 806
Recovery Suggestion: This operation can fail if the version of the OS on the device is incompatible with the installed version of Xcode. You may also need to restart your mac and device in order to correctly detect compatibility.
User Info: {
    AssociatedMobileDeviceFunction = AMDeviceMountImage;
    DVTDeviceErrorIsProxied = 1;
    DVTErrorCreationDateKey = "2022-02-03 04:01:28 +0000";
    DVTRadarComponentKey = 487927;
    NSLocalizedFailure = "The operation timed out.";
}
--
The operation timed out.
Domain: com.apple.dt.MobileDeviceErrorDomain
Code: -402653172
User Info: {
    DVTRadarComponentKey = 261622;
    MobileDeviceErrorCode = "(0xE800000C)";
    "com.apple.dtdevicekit.stacktrace" = (
	0   DTDeviceKitBase                     0x00000001293debec DTDKCreateNSErrorFromAMDErrorCode + 272
	1   DTDeviceKitBase                     0x0000000129418188 -[DTDKMobileDeviceToken _mountDeveloperDiskImage:withError:] + 772
	2   DTDeviceKitBase                     0x0000000129418c54 __58-[DTDKMobileDeviceToken mountDeveloperDiskImageWithError:]_block_invoke + 564
	3   libdispatch.dylib                   0x00000001a9f7abac _dispatch_client_callout + 20
	4   libdispatch.dylib                   0x00000001a9f89e00 _dispatch_lane_barrier_sync_invoke_and_complete + 56
	5   DTDeviceKitBase                     0x00000001294189c4 -[DTDKMobileDeviceToken mountDeveloperDiskImageWithError:] + 168
	6   IDEiOSSupportCore                   0x00000001292b737c __43-[DVTiOSDevice prepareProxiedDevicesAsync:]_block_invoke + 596
	7   DVTFoundation                       0x0000000103faa66c __DVT_CALLING_CLIENT_BLOCK__ + 16
	8   DVTFoundation                       0x0000000103fabc58 __DVTDispatchAsync_block_invoke + 564
	9   libdispatch.dylib                   0x00000001a9f78e60 _dispatch_call_block_and_release + 32
	10  libdispatch.dylib                   0x00000001a9f7abac _dispatch_client_callout + 20
	11  libdispatch.dylib                   0x00000001a9f82330 _dispatch_lane_serial_drain + 672
	12  libdispatch.dylib                   0x00000001a9f82ea4 _dispatch_lane_invoke + 392
	13  libdispatch.dylib                   0x00000001a9f8d708 _dispatch_workloop_worker_thread + 656
	14  libsystem_pthread.dylib             0x00000001aa135304 _pthread_wqthread + 288
	15  libsystem_pthread.dylib             0x00000001aa134018 start_wqthread + 8
);
}
--


System Information

macOS Version 12.1 (Build 21C52)
Xcode 13.2.1 (19586) (Build 13C100)
Timestamp: 2022-02-03T13:01:28+09:00

iPhoneとAppleWatchは、先ほど再起動したので、Macだけを再起動してみましたが、結果は変わりませんでした。

Certificatesの権限からAppleWatchを外したら?

僕は、iPhoneのアプリが開発できれば良いので、Certificatesで、AppleWatchのDeveloper権限を付与しないようにしてみようと思います。

現在は、AppleDeveloperとAppleDistributionで、全てのOSの権限を持った状態です。
Certificates 2
Create a New Certificate

AppleDeveloperとAppleDistributionのCertificateを削除して、iOS DevelopmentとiOS DistributionのCertificateを追加しました。
Certificates 3

Certificateからios_distribution.cerios_development.cerをダウンロードして、ダブルクリックで、キーチェーンアクセスに登録し、キーチェーンアクセスに残っていた古い証明書は削除しました。
ios_distribution.cer,ios_development.cer
キーチェーンアクセス

ProfilesにAppleDeveloperとAppleDistributionのCertificateを紐付けていたので、iOS DevelopmentとiOS DistributionのCertificateを紐付け直します。
Profiles
Generate a Provisioning Profile

Xcodeを再起動して、Signing & Capabilitiesを確認すると、AppleDeveloperがiPhoneDeveloperに変更されていました。
Signing & Capabilities

これでも、Devices and Simulatorsの警告は消えないままで、AndroidStudioからiOSの実機ビルドしても、エラーが出たままでした。。

AppleWatchをデバイス一覧に登録したら?

Certificates, Identifiers & ProfilesにAppleWatchもデバイス登録しないとダメになった?と思い、登録してみました。
Register a New Device

それでも、状況は変わらなかったです。。

AppleWatchのOSが古い?

AppleWatchのOSが古いから、最新のXcodeと相性が悪いのかな?と思い、AppleWatchのOSを確認してみたところ、最新版でした。

AppleWatchのデバッグは不安定?

Xcode will continue when iPhone is finished. が表示されて Apple Watch でデバッグ実行できないを読んでみると、 AppleWatchのデバッグは不安定なようです。

まとめ

XcodeとAppleWatchの相性が改善されるまで、開発中はAppleWatchのペアリングを解除しておこうと思います。

ペアリングの解除と接続に10分以上掛かってしまうので、AppleWatchを使いたければ、開発用iPhoneとプライベート用iPhoneを分けた方が現実的かもしれませんが...。

やはり、iPhoneにAppleWatchを接続した状態で、AndroidStudioからiOSの実機ビルドできるようになりたいので、もし、知見がある方がいらっしゃいましたら、コメントを頂けると嬉しいですm(_ _)m

最後に

「Flutter好きが集まる朝もく会」というFlutterの朝活勉強会を定期開催しております!
「ご質問がある方」や「一緒に黙々と作業したい方」は参加してみて頂けると嬉しいです♫
https://bit.ly/3ByTvvA

Discussion

yoonchul kohyoonchul koh

情報ありがとうございます!
今全く同じ状態になってしまって困ってました。

自分の場合はApple Watchのペアリング解除まではしてなくて、
「Apple WatchでのMacのロック機能」をオフにすると解消しました。

山村祐也(朝活応援 / Flutter / Firebase)山村祐也(朝活応援 / Flutter / Firebase)

再度、AppleWatchをペアリングしてみて
「AppleWatchでのMacのロック機能」がオフになっている事を確認してから
実機ビルドしてみたのですが、同じエラーが出てしまいました><

僕のAppleWatchは第一世代なので、古過ぎるのかもしれませんね。。

山村祐也(朝活応援 / Flutter / Firebase)山村祐也(朝活応援 / Flutter / Firebase)

iPhoneのBluetoothの接続一覧に
「AppleWatch」と「bestriserのAppleWatch」が並んでいたので
AppleWatchは1台しか持っていないんだけどな...と思い
「AppleWatch」の方を解除してみたところ、
AppleWatchに接続したまま、実機ビルドできるようになりました!!

最新のiOSではBluetoothリストに
AppleWatchが表示されなくなった?みたいなので
過去に接続したキャッシュが残ったままになっていて
それが実機ビルド時のエラーに繋がっていたのかもしれませんね。。

yoonchul kohyoonchul koh

症状違ったみたいですが、解決できてよかったです!
同僚も同じくビルド出来てなかったのですが、Apple Watch周りを色々いじってるとビルドできたみたいです。
この辺なかなか謎いですね。