-
Notifications
You must be signed in to change notification settings - Fork 29.7k
Fix #160622: Restore watchOS Companion App Build Compatibility #172436
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix #160622: Restore watchOS Companion App Build Compatibility #172436
Conversation
|
It looks like this pull request may not have tests. Please make sure to add tests or get an explicit test exemption before merging. If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix? Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing.If you believe this PR qualifies for a test exemption, contact "@test-exemption-reviewer" in the #hackers channel in Discord (don't just cc them here, they won't see it!). The test exemption team is a small volunteer group, so all reviewers should feel empowered to ask for tests, without delegating that responsibility entirely to the test exemption group. |
a8bc522 to
7c63dbd
Compare
|
@darshankawar, If this pr has been merged, can it be cherry-picked for the next hotfix release? |
|
@lukemmtt I patched my locale flutter_tool with your fix. It compiles again. However, I don't get the message watch companion app detected anymore, but that could be because of another change, I guess. If you patch the mac.dart file in your locale Flutter directory and commit the change(locale only). The flutter_tool will rebuild with the changes the first time it's used again. |
|
Thank you for the insights @RCVZ! I won't be able to test this again for a few more days but I look forward to doing so soon. |
7c63dbd to
86f110d
Compare
|
So I don't think this is the correct solution. I was able to recreate the original issue locally and the issue is that the containsWatchCompanion is not returning the correct value. When I looked at the verbose logs ( To fix this, I think all we need to do is remove this:
|
Here's a guide on how to make changes to the flutter tool locally! |
|
I have patched my flutter_tools with the suggestion of @vashworth. |
|
This pull request has been changed to a draft. The currently pending flutter-gold status will not be able to resolve until a new commit is pushed or the change is marked ready for review again. For more guidance, visit Writing a golden file test for Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. |
c668626 to
89b3943
Compare
|
Thanks for the testing @RCVZ, and for the new proposed solution, @vashworth! I've replaced my PR with the one-line fix proposed in @vashworth's comment, although I'm afraid I'm not sure where to begin with creating a regression test for something like this, if that's warranted. |
1b50691 to
31a8c28
Compare
|
Unfortunately we don't test watch extensions in CI, so we likely can't currently add a regression test. Looks like some of the unit tests in |
|
@RCVZ I was still unable to get this to compile even after changing my local xcode_project.dart file. Maybe I did not change the flutter tool properly, but even after deleting bin/cache/flutter_tools.snapshot file and rebuilding it still did not compile with the watch companion app. |
|
Please check #176832 for the improvement dealing with containsWatchCompanion I think my pr is important thing to be handled together. |
|
Closing this as a non-solution, according to comments above |
…on watch apps defined by only the project info file. (#176832) (Please be generous for some typos and grammar error in sentences below. English is not my mother tongue) TRDR : This patch fixes flutter run(and might be flutter build too) failure on iOS flutter apps with companion watchOS app in case the WKCompanionAppBundleIdentifier value is defined by xcode project configuration and uses different app bundle id by scheme(which happens when you do something like com.myapp.app1.dev things for scheme bundle id) This change checks default scheme (the scheme with corresponding name for the debug/release mode and selected build flavor.) in the build settings check step of containsWatchCompanion function. current code of containsWatchCompanion function works like below 1. check all default Info.plist file's content of all targets to determine if the project has watchOS companion apps. (this doesn't work well in mordern xcode settings when they use multi plist files which are selected on build time by build configuration. Sometimes, the default Info.plist file doesn't even exist in the project.) 2. check if "WKCompanionAppBundleIdentifier" is included in the xcode project info file(the ios/Runner.xcodeproj/project.pbxproj file in case of iOS project generated by flutter) 3. If "WKCompanionAppBundleIdentifier" has found in the project info file, check build configuration variables of every single scheme but the current target scheme if they have config value with key "INFOPLIST_KEY_WKCompanionAppBundleIdentifier" identical to current build configuration's bundle identifier returned by productBundleIdentifier@xcode_project.dart function. I believe The third step causes many problems reported in some issue and pr, saying iOS app with companion watchOS app fails on build or run. #160622 #172436 In my case, My iOS project had multiple schemes which are linked to different build configurations, but using single Runner setting per app. because we exclude current scheme for the check, we get all the INFOPLIST_KEY_WKCompanionAppBundleIdentifier values except the one which should be same with the identifier returned by productBundleIdentifier@xcode_project.dart function. that is because companion watch apps doesn't have to have same WKCompanionAppBundleIdentifier with other scheme's main app. We have to check the default scheme to see watchOS companion app`s WKCompanionAppBundleIdentifier, not other scheme. (other schemes can have slightly different or totally different bundle id. that was to support different environment systems like dev, prod in my case) as a result, flutter run gave me WatchOS app built for device target iOS/iPad, not Watch. which caused problem during installation of iOS app to a simulator because the embeded Watch App was in invalid format. I found this by inspecting Info.plist of generated watchOS app. below is part of the flutter run verbose log with failure caused by old code. [+1154 ms] An error was encountered processing the command (domain=IXUserPresentableErrorDomain, code=1): App installation failed: ‘Bora Debug-dev’을(를) 설치할 수 없음 (which says "cannot install" in korean) 나중에 다시 시도하십시오. (which says "try again later" in korean) Found WatchKit 2.0 app at /Users/javalia/Library/Developer/CoreSimulator/Devices/071691B3-7901-47E5-9B38-4D5B799F3530/data/Library/Caches/com.apple.mobile.installd.staging/temp.8HZIEG/extracted/Payload/Runner.app/Watch/bora Watch App.app but it does not have a WKWatchKitApp or WKApplication key set to true in its Info.plist Underlying error (domain=IXUserPresentableErrorDomain, code=1): ‘Bora Debug-dev’을(를) 설치할 수 없음 (which says "cannot install" in korean) 나중에 다시 시도하십시오. (which says "try it later" in korean) I suggest this change with two reasons : 1. I think forcing watchOS app makers split their runner configurations to support watch companion app is something not recommendable/not good to force as a convention. (Which is implied in the comment which is removed by this pr, and could be one of the valid detouring. some people in this issue #160622 said that a detouring is adding of dummy WKCompanionAppBundleIdentifier configuration in iOS app, which should be in only watchOS apps in normal.) 2. The function should work as it's name implies, so I guess it should not omit default scheme during check. Matching function's behavior with it's name will be likely to reduce potential errors caused by this change while fixing problems. ## Pre-launch Checklist - [ X ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ X ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ X ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ X ] I signed the [CLA]. - [ X ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] I added new tests to check the change I am making, or this PR is [test-exempt]. - [ ] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [ ] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --------- Co-authored-by: hellohuanlin <[email protected]>
…companion watch apps defined by only the project info file. (flutter#176832) (Please be generous for some typos and grammar error in sentences below. English is not my mother tongue) TRDR : This patch fixes flutter run(and might be flutter build too) failure on iOS flutter apps with companion watchOS app in case the WKCompanionAppBundleIdentifier value is defined by xcode project configuration and uses different app bundle id by scheme(which happens when you do something like com.myapp.app1.dev things for scheme bundle id) This change checks default scheme (the scheme with corresponding name for the debug/release mode and selected build flavor.) in the build settings check step of containsWatchCompanion function. current code of containsWatchCompanion function works like below 1. check all default Info.plist file's content of all targets to determine if the project has watchOS companion apps. (this doesn't work well in mordern xcode settings when they use multi plist files which are selected on build time by build configuration. Sometimes, the default Info.plist file doesn't even exist in the project.) 2. check if "WKCompanionAppBundleIdentifier" is included in the xcode project info file(the ios/Runner.xcodeproj/project.pbxproj file in case of iOS project generated by flutter) 3. If "WKCompanionAppBundleIdentifier" has found in the project info file, check build configuration variables of every single scheme but the current target scheme if they have config value with key "INFOPLIST_KEY_WKCompanionAppBundleIdentifier" identical to current build configuration's bundle identifier returned by productBundleIdentifier@xcode_project.dart function. I believe The third step causes many problems reported in some issue and pr, saying iOS app with companion watchOS app fails on build or run. flutter#160622 flutter#172436 In my case, My iOS project had multiple schemes which are linked to different build configurations, but using single Runner setting per app. because we exclude current scheme for the check, we get all the INFOPLIST_KEY_WKCompanionAppBundleIdentifier values except the one which should be same with the identifier returned by productBundleIdentifier@xcode_project.dart function. that is because companion watch apps doesn't have to have same WKCompanionAppBundleIdentifier with other scheme's main app. We have to check the default scheme to see watchOS companion app`s WKCompanionAppBundleIdentifier, not other scheme. (other schemes can have slightly different or totally different bundle id. that was to support different environment systems like dev, prod in my case) as a result, flutter run gave me WatchOS app built for device target iOS/iPad, not Watch. which caused problem during installation of iOS app to a simulator because the embeded Watch App was in invalid format. I found this by inspecting Info.plist of generated watchOS app. below is part of the flutter run verbose log with failure caused by old code. [+1154 ms] An error was encountered processing the command (domain=IXUserPresentableErrorDomain, code=1): App installation failed: ‘Bora Debug-dev’을(를) 설치할 수 없음 (which says "cannot install" in korean) 나중에 다시 시도하십시오. (which says "try again later" in korean) Found WatchKit 2.0 app at /Users/javalia/Library/Developer/CoreSimulator/Devices/071691B3-7901-47E5-9B38-4D5B799F3530/data/Library/Caches/com.apple.mobile.installd.staging/temp.8HZIEG/extracted/Payload/Runner.app/Watch/bora Watch App.app but it does not have a WKWatchKitApp or WKApplication key set to true in its Info.plist Underlying error (domain=IXUserPresentableErrorDomain, code=1): ‘Bora Debug-dev’을(를) 설치할 수 없음 (which says "cannot install" in korean) 나중에 다시 시도하십시오. (which says "try it later" in korean) I suggest this change with two reasons : 1. I think forcing watchOS app makers split their runner configurations to support watch companion app is something not recommendable/not good to force as a convention. (Which is implied in the comment which is removed by this pr, and could be one of the valid detouring. some people in this issue flutter#160622 said that a detouring is adding of dummy WKCompanionAppBundleIdentifier configuration in iOS app, which should be in only watchOS apps in normal.) 2. The function should work as it's name implies, so I guess it should not omit default scheme during check. Matching function's behavior with it's name will be likely to reduce potential errors caused by this change while fixing problems. ## Pre-launch Checklist - [ X ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ X ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ X ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ X ] I signed the [CLA]. - [ X ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] I added new tests to check the change I am making, or this PR is [test-exempt]. - [ ] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [ ] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --------- Co-authored-by: hellohuanlin <[email protected]>
…companion watch apps defined by only the project info file. (flutter#176832) (Please be generous for some typos and grammar error in sentences below. English is not my mother tongue) TRDR : This patch fixes flutter run(and might be flutter build too) failure on iOS flutter apps with companion watchOS app in case the WKCompanionAppBundleIdentifier value is defined by xcode project configuration and uses different app bundle id by scheme(which happens when you do something like com.myapp.app1.dev things for scheme bundle id) This change checks default scheme (the scheme with corresponding name for the debug/release mode and selected build flavor.) in the build settings check step of containsWatchCompanion function. current code of containsWatchCompanion function works like below 1. check all default Info.plist file's content of all targets to determine if the project has watchOS companion apps. (this doesn't work well in mordern xcode settings when they use multi plist files which are selected on build time by build configuration. Sometimes, the default Info.plist file doesn't even exist in the project.) 2. check if "WKCompanionAppBundleIdentifier" is included in the xcode project info file(the ios/Runner.xcodeproj/project.pbxproj file in case of iOS project generated by flutter) 3. If "WKCompanionAppBundleIdentifier" has found in the project info file, check build configuration variables of every single scheme but the current target scheme if they have config value with key "INFOPLIST_KEY_WKCompanionAppBundleIdentifier" identical to current build configuration's bundle identifier returned by productBundleIdentifier@xcode_project.dart function. I believe The third step causes many problems reported in some issue and pr, saying iOS app with companion watchOS app fails on build or run. flutter#160622 flutter#172436 In my case, My iOS project had multiple schemes which are linked to different build configurations, but using single Runner setting per app. because we exclude current scheme for the check, we get all the INFOPLIST_KEY_WKCompanionAppBundleIdentifier values except the one which should be same with the identifier returned by productBundleIdentifier@xcode_project.dart function. that is because companion watch apps doesn't have to have same WKCompanionAppBundleIdentifier with other scheme's main app. We have to check the default scheme to see watchOS companion app`s WKCompanionAppBundleIdentifier, not other scheme. (other schemes can have slightly different or totally different bundle id. that was to support different environment systems like dev, prod in my case) as a result, flutter run gave me WatchOS app built for device target iOS/iPad, not Watch. which caused problem during installation of iOS app to a simulator because the embeded Watch App was in invalid format. I found this by inspecting Info.plist of generated watchOS app. below is part of the flutter run verbose log with failure caused by old code. [+1154 ms] An error was encountered processing the command (domain=IXUserPresentableErrorDomain, code=1): App installation failed: ‘Bora Debug-dev’을(를) 설치할 수 없음 (which says "cannot install" in korean) 나중에 다시 시도하십시오. (which says "try again later" in korean) Found WatchKit 2.0 app at /Users/javalia/Library/Developer/CoreSimulator/Devices/071691B3-7901-47E5-9B38-4D5B799F3530/data/Library/Caches/com.apple.mobile.installd.staging/temp.8HZIEG/extracted/Payload/Runner.app/Watch/bora Watch App.app but it does not have a WKWatchKitApp or WKApplication key set to true in its Info.plist Underlying error (domain=IXUserPresentableErrorDomain, code=1): ‘Bora Debug-dev’을(를) 설치할 수 없음 (which says "cannot install" in korean) 나중에 다시 시도하십시오. (which says "try it later" in korean) I suggest this change with two reasons : 1. I think forcing watchOS app makers split their runner configurations to support watch companion app is something not recommendable/not good to force as a convention. (Which is implied in the comment which is removed by this pr, and could be one of the valid detouring. some people in this issue flutter#160622 said that a detouring is adding of dummy WKCompanionAppBundleIdentifier configuration in iOS app, which should be in only watchOS apps in normal.) 2. The function should work as it's name implies, so I guess it should not omit default scheme during check. Matching function's behavior with it's name will be likely to reduce potential errors caused by this change while fixing problems. ## Pre-launch Checklist - [ X ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ X ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ X ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ X ] I signed the [CLA]. - [ X ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] I added new tests to check the change I am making, or this PR is [test-exempt]. - [ ] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [ ] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --------- Co-authored-by: hellohuanlin <[email protected]>
…companion watch apps defined by only the project info file. (flutter#176832) (Please be generous for some typos and grammar error in sentences below. English is not my mother tongue) TRDR : This patch fixes flutter run(and might be flutter build too) failure on iOS flutter apps with companion watchOS app in case the WKCompanionAppBundleIdentifier value is defined by xcode project configuration and uses different app bundle id by scheme(which happens when you do something like com.myapp.app1.dev things for scheme bundle id) This change checks default scheme (the scheme with corresponding name for the debug/release mode and selected build flavor.) in the build settings check step of containsWatchCompanion function. current code of containsWatchCompanion function works like below 1. check all default Info.plist file's content of all targets to determine if the project has watchOS companion apps. (this doesn't work well in mordern xcode settings when they use multi plist files which are selected on build time by build configuration. Sometimes, the default Info.plist file doesn't even exist in the project.) 2. check if "WKCompanionAppBundleIdentifier" is included in the xcode project info file(the ios/Runner.xcodeproj/project.pbxproj file in case of iOS project generated by flutter) 3. If "WKCompanionAppBundleIdentifier" has found in the project info file, check build configuration variables of every single scheme but the current target scheme if they have config value with key "INFOPLIST_KEY_WKCompanionAppBundleIdentifier" identical to current build configuration's bundle identifier returned by productBundleIdentifier@xcode_project.dart function. I believe The third step causes many problems reported in some issue and pr, saying iOS app with companion watchOS app fails on build or run. flutter#160622 flutter#172436 In my case, My iOS project had multiple schemes which are linked to different build configurations, but using single Runner setting per app. because we exclude current scheme for the check, we get all the INFOPLIST_KEY_WKCompanionAppBundleIdentifier values except the one which should be same with the identifier returned by productBundleIdentifier@xcode_project.dart function. that is because companion watch apps doesn't have to have same WKCompanionAppBundleIdentifier with other scheme's main app. We have to check the default scheme to see watchOS companion app`s WKCompanionAppBundleIdentifier, not other scheme. (other schemes can have slightly different or totally different bundle id. that was to support different environment systems like dev, prod in my case) as a result, flutter run gave me WatchOS app built for device target iOS/iPad, not Watch. which caused problem during installation of iOS app to a simulator because the embeded Watch App was in invalid format. I found this by inspecting Info.plist of generated watchOS app. below is part of the flutter run verbose log with failure caused by old code. [+1154 ms] An error was encountered processing the command (domain=IXUserPresentableErrorDomain, code=1): App installation failed: ‘Bora Debug-dev’을(를) 설치할 수 없음 (which says "cannot install" in korean) 나중에 다시 시도하십시오. (which says "try again later" in korean) Found WatchKit 2.0 app at /Users/javalia/Library/Developer/CoreSimulator/Devices/071691B3-7901-47E5-9B38-4D5B799F3530/data/Library/Caches/com.apple.mobile.installd.staging/temp.8HZIEG/extracted/Payload/Runner.app/Watch/bora Watch App.app but it does not have a WKWatchKitApp or WKApplication key set to true in its Info.plist Underlying error (domain=IXUserPresentableErrorDomain, code=1): ‘Bora Debug-dev’을(를) 설치할 수 없음 (which says "cannot install" in korean) 나중에 다시 시도하십시오. (which says "try it later" in korean) I suggest this change with two reasons : 1. I think forcing watchOS app makers split their runner configurations to support watch companion app is something not recommendable/not good to force as a convention. (Which is implied in the comment which is removed by this pr, and could be one of the valid detouring. some people in this issue flutter#160622 said that a detouring is adding of dummy WKCompanionAppBundleIdentifier configuration in iOS app, which should be in only watchOS apps in normal.) 2. The function should work as it's name implies, so I guess it should not omit default scheme during check. Matching function's behavior with it's name will be likely to reduce potential errors caused by this change while fixing problems. ## Pre-launch Checklist - [ X ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ X ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ X ] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [ X ] I signed the [CLA]. - [ X ] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] I added new tests to check the change I am making, or this PR is [test-exempt]. - [ ] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [ ] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --------- Co-authored-by: hellohuanlin <[email protected]>
This PR is an attempt to fix a regression where Flutter apps with Apple Watch extensions fail to build via
flutter runsince Flutter 3.27.0.Background
Flutter projects containing Apple Watch companion apps have been failing with various errors since Flutter 3.27.0:
'StateObject' is only available in iOS 14.0 or newer(watchOS SwiftUI code being compiled with iOS deployment targets)'HKWorkoutSession' is unavailable in iOS(watchOS-specific APIs being compiled for iOS)Unsupported Swift architecture(iOS architectures being forced on watchOS targets)flutter runRoot Cause
The
containsWatchCompanionmethod was incorrectly passing an iOS device identifier when querying build settings for watchOS schemes, causing xcodebuild to fail with "Unable to find a destination matching the provided destination specifier". This prevented proper detection of watch companion apps, leading to iOS-specific build settings being incorrectly applied to watchOS targets.Solution
This fix removes the
deviceIdparameter when querying build settings for watch schemes, allowing xcodebuild to properly return the watch target's configuration. This solution was identified by @vashworth in https://github.com/flutter/flutter/pull/172436#issuecomment-3140433428—thank you for pinpointing the exact issue!Previous Attempt
My initial PR #172436 attempted to restore the conditional
ARCHSlogic that was removed in PR #154645, but that addressed a symptom rather than the root cause. The real issue was thatcontainsWatchCompanionwas failing to detect the watch app due to the incorrect deviceId parameter.Fixes #160622
Pre-launch Checklist
///).