From 6a45c97cca124a124b2954d9a37ac90961746f14 Mon Sep 17 00:00:00 2001 From: joshuakrueger-dfx Date: Tue, 9 Jun 2026 17:07:03 +0200 Subject: [PATCH] chore: harden repo CI, docs, license and native logging Build the native Android (example APK) and iOS (example, --no-codesign) code in CI so native-only changes can no longer pass every check while breaking the consuming app's build. Drop the stale flutter-create template tests across Android, iOS and macOS (and their Xcode/Gradle wiring) that exercised a getPlatformVersion the plugin never implemented; remove the matching template getPlatformVersion handler from the macOS plugin so it is consistent with the Android and iOS bridges. Add a real MIT LICENSE, a source-accurate README and CHANGELOG (0.0.1-0.0.8), fill pubspec metadata, and log previously swallowed native error paths. Closes #27 --- .github/workflows/pull-request.yaml | 36 ++++ CHANGELOG.md | 44 ++++- LICENSE | 22 ++- README.md | 79 +++++++- android/build.gradle | 16 -- .../operations/CloseOperation.kt | 4 +- .../operations/ConnectBitBoxOperation.kt | 2 + .../operations/InitBitBoxOperation.kt | 2 + .../bitbox_flutter/BitboxFlutterPluginTest.kt | 27 --- example/ios/Podfile | 5 +- example/ios/Runner.xcodeproj/project.pbxproj | 175 +----------------- .../xcshareddata/xcschemes/Runner.xcscheme | 13 -- example/ios/RunnerTests/RunnerTests.swift | 27 --- example/macos/Podfile | 3 - .../macos/Runner.xcodeproj/project.pbxproj | 122 ------------ .../xcshareddata/xcschemes/Runner.xcscheme | 13 -- example/macos/RunnerTests/RunnerTests.swift | 28 --- macos/Classes/BitboxFlutterPlugin.swift | 2 - pubspec.yaml | 6 +- 19 files changed, 180 insertions(+), 446 deletions(-) delete mode 100644 android/src/test/kotlin/com/cakewallet/bitbox_flutter/BitboxFlutterPluginTest.kt delete mode 100644 example/ios/RunnerTests/RunnerTests.swift delete mode 100644 example/macos/RunnerTests/RunnerTests.swift diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index 61ad4c8..4e1140a 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -40,6 +40,42 @@ jobs: - run: go vet ./... - run: go test -race -timeout 60s ./... + android: + name: Android example build + runs-on: ubuntu-latest + defaults: + run: + working-directory: example + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + - uses: subosito/flutter-action@v2 + with: + flutter-version: "3.41.6" + channel: stable + cache: true + - run: flutter pub get + - run: flutter build apk --debug + + ios: + name: iOS example build + runs-on: macos-latest + defaults: + run: + working-directory: example + steps: + - uses: actions/checkout@v4 + - uses: subosito/flutter-action@v2 + with: + flutter-version: "3.41.6" + channel: stable + cache: true + - run: flutter pub get + - run: flutter build ios --no-codesign + yaml-lint: name: Workflow YAML lint runs-on: ubuntu-latest diff --git a/CHANGELOG.md b/CHANGELOG.md index c570f90..457a45b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,43 @@ ## 0.0.8 -* Android: run the blocking `initBitBox` (Noise pairing handshake) off the serial - MethodChannel task queue so concurrent `getChannelHash` polls are serviced while - init waits for the on-device confirmation. The pairing code now appears in the app - and on the device simultaneously instead of only after confirming on the device - (iOS was already unaffected). `initBitBox` now also propagates the real init result. +* Android: show the pairing code in the app and on the device simultaneously by + running the blocking Noise pairing handshake off the serial MethodChannel queue + so concurrent `getChannelHash` polls are serviced while init awaits confirmation. +* Refactor the BitBox testkit API surface and regenerate the gomobile artefacts. +* Drop `print()` from production `lib/` and harden `flutter analyze` to `--fatal-infos`. +* Add `CONTRIBUTING.md` aligning with the BitBox-stack workflow. + +## 0.0.7 + +* Add a reusable BitBox testkit. + +## 0.0.6 + +* Rename the Go module path to `github.com/DFXswiss/bitbox_flutter`. +* CI: add Go tests, `dart format`, YAML lint, and workflow permission lockdown. + +## 0.0.5 + +* BLE: dedup single-frame init retransmits and add panic recovery for `GetDevice`. + +## 0.0.4 + +* Add the pull-request CI workflow and `BIPPath` smoke tests. + +## 0.0.3 + +* BLE read path: scoped deduplication plus a 60s timeout for long signing flows. + +## 0.0.2 + +* BLE read path: remove broken packet deduplication. +* BLE write: use guard-unwrapped locals to prevent crashes. ## 0.0.1 -* TODO: Describe initial release. +* Initial release of the BitBox02 Flutter plugin. +* Support BTC, LTC, ETH, and ERC20 chains over a gomobile-exported Go core. +* Sign PSBTs, Ethereum RLP transactions, and Bitcoin messages; fetch addresses + and the master fingerprint. +* USB transport on Android plus iOS BLE support for the BitBox02 Nova. +* Add the auto release-PR and auto-tag/GitHub-release CI workflows. diff --git a/LICENSE b/LICENSE index ba75c69..2d7f09b 100644 --- a/LICENSE +++ b/LICENSE @@ -1 +1,21 @@ -TODO: Add your license here. +MIT License + +Copyright (c) 2026 DFX AG + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 5d146a4..80d319a 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,76 @@ # bitbox_flutter -A flutter plugin for bitbox +A Flutter plugin for the [BitBox02](https://bitbox.swiss) hardware wallet. It connects over USB on Linux and Android and over BLE on iOS, then exposes signing and address operations for Bitcoin, Litecoin, Ethereum, and ERC20 tokens. The plugin keeps its native bridges thin and pushes the hardware-wallet protocol into a shared Go core (gomobile-exported) so the same firmware logic backs every platform. -## Getting Started +## Supported devices and chains -This project is a starting point for a Flutter -[plug-in package](https://flutter.dev/to/develop-plugins), -a specialized package that includes platform-specific implementation code for -Android and/or iOS. +| | Supported | +|---|---| +| Devices | BitBox02 | +| Transports | USB (Linux, Android), BLE (iOS) | +| Chains | Bitcoin (BTC), Litecoin (LTC), Ethereum (ETH), ERC20 tokens | -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +Operations exposed through the plugin include device discovery, pairing and channel-hash verification, master-fingerprint and capability queries (`supportsETH`, `supportsERC20`, `supportsLTC`), BTC xpub export and PSBT/message signing, and ETH address export plus transaction (legacy and EIP-1559), message, and EIP-712 typed-message signing. The full Dart surface is declared on `BitboxUsbPlatform` in `lib/usb/bitbox_usb_platform_interface.dart`. +## Usage + +```dart +import 'package:bitbox_flutter/bitbox_flutter.dart'; +``` + +`bitbox_manager.dart` and the `BitboxDevice` model are the public entry points. For tests, import the standalone simulator instead — see [Testing](#testing). + +## Architecture + +The plugin is layered so that protocol logic lives in one place and the per-platform code stays minimal: + +``` +Dart (lib/) + bitbox_manager.dart, lib/usb/* — public API, method-channel client + | + v MethodChannel +Native bridge (thin) + android/ Kotlin — MethodCallRegistry + operations/*Operation.kt + ios/ Swift — BitboxFlutterPlugin, MethodCallRegistry, Bluetooth + | + v gomobile FFI +Go core (go/api) + api.go, bitcoin.go, ethereum.go, bitbox_device.go + every gomobile-exported entry point starts with `defer recoverPanic("")` +``` + +- **Dart (`lib/`)** declares the abstract `BitboxUsbPlatform`, implements it over a `MethodChannel` in `lib/usb/bitbox_usb_method_channel.dart`, and wraps it for consumers in `bitbox_manager.dart`. +- **Native bridges** are deliberately thin. On Android each method maps to a `*Operation.kt` registered in `MethodCallRegistry.kt`; on iOS the equivalent dispatch lives in `MethodCallRegistry.swift`, with `Bluetooth.swift` handling the BLE transport. Bridges marshal arguments and delegate to the Go core rather than implementing wallet logic themselves. +- **Go core (`go/api`)** is gomobile-exported and built on `github.com/BitBoxSwiss/bitbox02-api-go`. Every exported function (for example `GetDevice`, `GetChannelHash`, `InitDevice`, `SupportsETH`) begins with `defer recoverPanic("")` (see `go/api/safety.go`) so a Go-side panic returns a zero value instead of crossing the gomobile boundary into the host engine. A separate `go/u2fhid` package holds the USB/BLE framing layer. + +## Rebuilding the gomobile bindings + +The native binding artifacts are vendored and checked in; rebuild them only when the gomobile-exported Go surface changes. + +- **Android** — run `run_build_tool_android.sh ` to produce `android/libs/api.aar` via `gomobile bind -target=android`. +- **iOS** — regenerate the `Api.xcframework` through the equivalent gomobile iOS pipeline. +- **Dart FFI header** — `ffigen_config.yaml` drives `ffigen` to regenerate `lib/generated_bindings.g.dart` from `go/bitbox.h`. + +The checked-in artifacts must match the Go module path declared in `go/go.mod` (`github.com/DFXswiss/bitbox_flutter`). Regenerate and commit the artifacts together with the Go change so the boundary stays consistent. + +## Testing + +The plugin ships a reusable, hardware-free Dart testkit. Consumer apps can drive their real `BitboxManager` flow against a simulator with no USB, BLE, native code, or firmware: + +```dart +import 'package:bitbox_flutter/testing.dart'; + +final bitbox = installSimulatedBitboxPlatform( + channelHash: 'hash-shown-to-the-user', +); +``` + +The simulator swaps out `BitboxUsbPlatform.instance` and covers device discovery, pairing, capability checks, BTC/ETH signing, per-method delays and errors, and an assertable call log. See [TESTING.md](TESTING.md) for the full test layers (official simulator, U2FHID/BLE contract tests, native API fake, Flutter API fake) and the regressions they guard. + +## Contributing + +See [CONTRIBUTING.md](CONTRIBUTING.md) for the branching model (`develop` is the default branch), the local/CI PR gate, the steps to add a new platform method end to end, and the automated release flow. Source: [github.com/DFXswiss/bitbox_flutter](https://github.com/DFXswiss/bitbox_flutter). + +## License + +MIT — see [LICENSE](LICENSE). diff --git a/android/build.gradle b/android/build.gradle index 0998959..23029c6 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -51,7 +51,6 @@ android { sourceSets { main.java.srcDirs += "src/main/kotlin" - test.java.srcDirs += "src/test/kotlin" } defaultConfig { @@ -60,21 +59,6 @@ android { dependencies { implementation (name: 'api', ext: 'aar') - - testImplementation("org.jetbrains.kotlin:kotlin-test") - testImplementation("org.mockito:mockito-core:5.0.0") - } - - testOptions { - unitTests.all { - useJUnitPlatform() - - testLogging { - events "passed", "skipped", "failed", "standardOut", "standardError" - outputs.upToDateWhen {false} - showStandardStreams = true - } - } } } diff --git a/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/CloseOperation.kt b/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/CloseOperation.kt index 1e20341..7597612 100644 --- a/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/CloseOperation.kt +++ b/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/CloseOperation.kt @@ -1,6 +1,7 @@ package com.cakewallet.bitbox_flutter.operations import android.content.Context +import android.util.Log import com.cakewallet.bitbox_flutter.BitboxManager import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel @@ -14,7 +15,8 @@ class CloseOperation(private val manager: BitboxManager) : ) { try { manager.close() - } catch (_: Exception) { + } catch (ex: Exception) { + Log.w("bitbox_flutter", "close failed, gracefully resetting: ${ex.message}") manager.gracefullyReset() } diff --git a/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/ConnectBitBoxOperation.kt b/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/ConnectBitBoxOperation.kt index 6ab076b..e0b67f0 100644 --- a/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/ConnectBitBoxOperation.kt +++ b/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/ConnectBitBoxOperation.kt @@ -1,6 +1,7 @@ package com.cakewallet.bitbox_flutter.operations import android.content.Context +import android.util.Log import com.cakewallet.bitbox_flutter.BitBoxException import com.cakewallet.bitbox_flutter.BitboxManager import io.flutter.plugin.common.MethodCall @@ -18,6 +19,7 @@ class ConnectBitBoxOperation(private val manager: BitboxManager) : this.manager.connectBitBox(identifier!!) result.success(true) } catch (ex: BitBoxException) { + Log.w("bitbox_flutter", "connectBitBox failed (${ex.getErrorCode()}): ${ex.message}") this.manager.gracefullyReset() result.error(ex.getErrorCode(), ex.message, null) } diff --git a/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/InitBitBoxOperation.kt b/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/InitBitBoxOperation.kt index b01265a..32d8d22 100644 --- a/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/InitBitBoxOperation.kt +++ b/android/src/main/kotlin/com/cakewallet/bitbox_flutter/operations/InitBitBoxOperation.kt @@ -3,6 +3,7 @@ package com.cakewallet.bitbox_flutter.operations import android.content.Context import android.os.Handler import android.os.Looper +import android.util.Log import api.Api import com.cakewallet.bitbox_flutter.BitboxManager import io.flutter.plugin.common.MethodCall @@ -35,6 +36,7 @@ class InitBitBoxOperation(manager: BitboxManager) : UsbMethodCallOperation(manag val success = try { Api.initDevice() } catch (e: Throwable) { + Log.w("bitbox_flutter", "initDevice failed: ${e.message}") false } Handler(Looper.getMainLooper()).post { result.success(success) } diff --git a/android/src/test/kotlin/com/cakewallet/bitbox_flutter/BitboxFlutterPluginTest.kt b/android/src/test/kotlin/com/cakewallet/bitbox_flutter/BitboxFlutterPluginTest.kt deleted file mode 100644 index 2706a7c..0000000 --- a/android/src/test/kotlin/com/cakewallet/bitbox_flutter/BitboxFlutterPluginTest.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.cakewallet.bitbox - -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel -import kotlin.test.Test -import org.mockito.Mockito - -/* - * This demonstrates a simple unit test of the Kotlin portion of this plugin's implementation. - * - * Once you have built the plugin's example app, you can run these tests from the command - * line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or - * you can run them directly from IDEs that support JUnit such as Android Studio. - */ - -internal class BitboxFlutterPluginTest { - @Test - fun onMethodCall_getPlatformVersion_returnsExpectedValue() { - val plugin = BitboxFlutterPlugin() - - val call = MethodCall("getPlatformVersion", null) - val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java) - plugin.onMethodCall(call, mockResult) - - Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE) - } -} diff --git a/example/ios/Podfile b/example/ios/Podfile index e549ee2..17adeb1 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '12.0' +# platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -31,9 +31,6 @@ target 'Runner' do use_frameworks! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end end post_install do |installer| diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 0994533..9a65f9a 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,26 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - AB701DEFFB6AFE1CD6DCB868 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A10EEEA67D9B2C6FBB31E4B /* Pods_RunnerTests.framework */; }; E74B54D16E84BA211D882202 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 456930D0E4AC8F3E96591B60 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 97C146E61CF9000F007C117D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97C146ED1CF9000F007C117D; - remoteInfo = Runner; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ 9705A1C41CF9048500538489 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; @@ -45,16 +33,12 @@ 0514708E3564CF990BA4EF56 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1A10EEEA67D9B2C6FBB31E4B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 456930D0E4AC8F3E96591B60 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 51BADE3CE0BBC0CED4BC9B85 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7C9092724D3287C45B1109B5 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -63,19 +47,9 @@ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A03E30049236909CE503300F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - B2AF63C16AAB359D3D67D160 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - FEAC2EB4C40B2D927EE5485C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 30A666CB1522C30AAA75C56D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AB701DEFFB6AFE1CD6DCB868 /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -87,14 +61,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -112,7 +78,6 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, - 331C8082294A63A400263BE5 /* RunnerTests */, AED68CD2E0068B2E9D64B6C6 /* Pods */, E05E46D9EAE3679630B36D8C /* Frameworks */, ); @@ -122,7 +87,6 @@ isa = PBXGroup; children = ( 97C146EE1CF9000F007C117D /* Runner.app */, - 331C8081294A63A400263BE5 /* RunnerTests.xctest */, ); name = Products; sourceTree = ""; @@ -148,9 +112,6 @@ A03E30049236909CE503300F /* Pods-Runner.debug.xcconfig */, 51BADE3CE0BBC0CED4BC9B85 /* Pods-Runner.release.xcconfig */, 0514708E3564CF990BA4EF56 /* Pods-Runner.profile.xcconfig */, - FEAC2EB4C40B2D927EE5485C /* Pods-RunnerTests.debug.xcconfig */, - B2AF63C16AAB359D3D67D160 /* Pods-RunnerTests.release.xcconfig */, - 7C9092724D3287C45B1109B5 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -160,7 +121,6 @@ isa = PBXGroup; children = ( 456930D0E4AC8F3E96591B60 /* Pods_Runner.framework */, - 1A10EEEA67D9B2C6FBB31E4B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -168,25 +128,6 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 331C8080294A63A400263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 966B0BC04635DB6993B9986A /* [CP] Check Pods Manifest.lock */, - 331C807D294A63A400263BE5 /* Sources */, - 331C807F294A63A400263BE5 /* Resources */, - 30A666CB1522C30AAA75C56D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 331C8086294A63A400263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; 97C146ED1CF9000F007C117D /* Runner */ = { isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; @@ -219,10 +160,6 @@ LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { - 331C8080294A63A400263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 97C146ED1CF9000F007C117D; - }; 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; LastSwiftMigration = 1100; @@ -243,19 +180,11 @@ projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, - 331C8080294A63A400263BE5 /* RunnerTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 331C807F294A63A400263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 97C146EC1CF9000F007C117D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -286,28 +215,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 966B0BC04635DB6993B9986A /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -365,14 +272,6 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 331C807D294A63A400263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 97C146EA1CF9000F007C117D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -384,14 +283,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ 97C146FA1CF9000F007C117D /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -455,7 +346,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -486,56 +377,6 @@ }; name = Profile; }; - 331C8088294A63A400263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FEAC2EB4C40B2D927EE5485C /* Pods-RunnerTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.cakewallet.bitboxFlutterExample.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Debug; - }; - 331C8089294A63A400263BE5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B2AF63C16AAB359D3D67D160 /* Pods-RunnerTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.cakewallet.bitboxFlutterExample.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Release; - }; - 331C808A294A63A400263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7C9092724D3287C45B1109B5 /* Pods-RunnerTests.profile.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.cakewallet.bitboxFlutterExample.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Profile; - }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -585,7 +426,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -636,7 +477,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -695,16 +536,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C8088294A63A400263BE5 /* Debug */, - 331C8089294A63A400263BE5 /* Release */, - 331C808A294A63A400263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 15cada4..30305b6 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -36,19 +36,6 @@ ReferencedContainer = "container:Runner.xcodeproj"> - - - - - - - - - - - -