# iOS Add-to-App UIScene Integration Test This directory contains the assets and templates for an integration test that verifies the behavior of Flutter in an add-to-app scenario on iOS, specifically with regards to UIScene lifecycle events. The test is located at `dev/devicelab/bin/tasks/module_uiscene_test_ios.dart`. ## Purpose This test ensures that Flutter behaves correctly when integrated into a native iOS application that uses UIScene for lifecycle management. It covers various scenarios, including: * The native app has migrated to UIScene, but the Flutter plugin has not. * Both the native app and the Flutter plugin have migrated to UIScene. * The native app has not migrated to UIScene, but the Flutter plugin has. * Neither the native app nor the Flutter plugin has migrated to UIScene. The test checks whether the correct lifecycle events (e.g., scene-based or application-based) are sent to the Flutter plugin in each scenario. ## Directory Structure * `xcode_uikit_swift`: A template for a native iOS app using UIKit and Swift. This app acts as the host for the Flutter module. * `native`: Contains Swift files used to replace files in the `xcode_uikit_swift` template for different test scenarios. This includes different implementations of `AppDelegate.swift`, `SceneDelegate.swift`, `ViewController.swift`, and the UI tests that verify the lifecycle events. * `flutterapp`: Contains the `main.dart` and `pubspec.yaml` files for the Flutter module (`my_module`) used in the test. * `flutterplugin`: Contains the files for the Flutter plugin (`my_plugin`) used in the test, including different implementations for migrated and unmigrated lifecycle event handling. Dart template files don't have a .dart extension so the analyzer will ignore them. They don't work on their own outside of the module, app, or plugin they're copied into. ## How to run the test This test is intended to be run as a Flutter devicelab test. To run it locally, you can use the following command from the `flutter/dev/devicelab` directory: ```bash ../../bin/cache/dart-sdk/bin/dart bin/test_runner.dart test -t module_uiscene_test_ios ``` You can also run it with a local engine build: ```bash ../../bin/cache/dart-sdk/bin/dart bin/test_runner.dart test -t module_uiscene_test_ios --local-engine --local-engine-host host_debug ``` The test create the Flutter module, Flutter plugin, and native iOS app and deletes them at the end of the test. You can also create these files in a specific directory that will not be deleted: ```bash ../../bin/cache/dart-sdk/bin/dart bin/test_runner.dart test -t module_uiscene_test_ios --task-args destination=[/path/to/copy/destination] ``` ## Adding a new scenario To add a new test scenario, you need to modify the `scenarios` map in the `Scenarios` class in `dev/devicelab/bin/tasks/module_uiscene_test_ios.dart`. Each scenario is defined by a list of `FileReplacements` that swap out files in the generated Xcode project with templates from this directory. To add a new scenario: 1. Add a new entry to the `scenarios` map. The key is the name of your new scenario. 2. The value is a `List`. Each `FileReplacements` object takes a source template file and a destination path in the generated project. 3. If your scenario requires new file content, add the new template files to the appropriate subdirectory (`native`, `flutterapp`, or `flutterplugin`). 4. Reference these new template files in the `FileReplacements` for your new scenario.