diff --git a/.github/workflows/release_dapp_ios.yml b/.github/workflows/release_dapp_ios.yml
index 17589b82..26b666f8 100644
--- a/.github/workflows/release_dapp_ios.yml
+++ b/.github/workflows/release_dapp_ios.yml
@@ -66,7 +66,7 @@ jobs:
- name: Build App
working-directory: example/dapp
env:
- PROJECT_ID: ${{ secrets.PROJECT_ID }}
+ PROJECT_ID: ${{ secrets.DAPP_PROJECT_ID }}
run: |
PUBSPEC_FILE=../../pubspec.yaml
FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
@@ -82,7 +82,7 @@ jobs:
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_DAPP_ID: ${{ secrets.APPLE_DAPP_ID }}
- PROJECT_ID: ${{ secrets.PROJECT_ID }}
+ PROJECT_ID: ${{ secrets.DAPP_PROJECT_ID }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
diff --git a/.github/workflows/release_wallet_ios.yml b/.github/workflows/release_wallet_ios.yml
new file mode 100644
index 00000000..c38b1437
--- /dev/null
+++ b/.github/workflows/release_wallet_ios.yml
@@ -0,0 +1,103 @@
+name: iOS Web3Wallet deploy
+
+on:
+ workflow_dispatch:
+ push:
+ tags:
+ - v[0-9]+.[0-9]+.[0-9]+
+
+jobs:
+ build:
+ runs-on: macos-latest-xlarge
+
+ steps:
+ # Checkout the repo
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ # - uses: actions/checkout@v3
+ # - uses: ruby/setup-ruby@v1
+ # with:
+ # bundler-cache: true
+
+ # # Cache
+ # - name: Cache
+ # uses: actions/cache@v3
+ # with:
+ # path: |
+ # .build
+ # SourcePackagesCache
+ # DerivedDataCache
+ # key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
+ # restore-keys: |
+ # ${{ runner.os }}-spm-
+
+ # # Install Ruby
+ # - name: Install Ruby
+ # uses: ruby/setup-ruby@v1
+ # with:
+ # ruby-version: 3.0.2
+ # bundler-cache: true
+
+ # # Install Fastlane
+ # - name: Install Fastlane
+ # run: gem install fastlane
+
+ # Install Flutter SDK
+ - name: Install Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ channel: "stable"
+ architecture: x64
+
+ # Get package dependencies and generate files
+ - name: Get package dependencies and generate files
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+
+ # Get example app dependencies and generate files
+ - name: Get example app dependencies and generate files
+ working-directory: example/wallet
+ run: |
+ flutter pub get
+ flutter pub run build_runner build --delete-conflicting-outputs
+
+ # Build App
+ - name: Build App
+ working-directory: example/wallet
+ env:
+ PROJECT_ID: ${{ secrets.WALLET_PROJECT_ID }}
+ run: |
+ PUBSPEC_FILE=../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ flutter build ipa --build-name $VERSION_NUMBER --dart-define="PROJECT_ID=$PROJECT_ID" --release
+
+ # Fastlane
+ - name: Fastlane
+ working-directory: example/wallet/ios
+ env:
+ APPLE_ID: ${{ secrets.APPLE_ID }}
+ APPLE_DAPP_ID: ${{ secrets.APPLE_WALLET_ID }}
+ PROJECT_ID: ${{ secrets.WALLET_PROJECT_ID }}
+ MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
+ APP_STORE_KEY_ID: ${{ secrets.APP_STORE_KEY_ID }}
+ APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
+ GH_BASIC_AUTH: ${{ secrets.GH_BASIC_AUTH }}
+ APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }}
+ MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
+ SLACK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ run: |
+ PUBSPEC_FILE=../../../pubspec.yaml
+ FILE_VALUE=$(echo | grep "^version: " $PUBSPEC_FILE)
+ PARTS=(${FILE_VALUE//:/ })
+ FULL_VERSION=${PARTS[1]}
+ VERSION_NUMBER=(${FULL_VERSION//-/ })
+
+ fastlane release_testflight username:$APPLE_ID token:$GH_BASIC_AUTH project_id:$PROJECT_ID app_id:$APPLE_DAPP_ID app_store_key_id:$APP_STORE_KEY_ID apple_issuer_id:$APPLE_ISSUER_ID app_store_connect_key:"$APP_STORE_CONNECT_KEY" match_git_url:$MATCH_GIT_URL app_version:$VERSION_NUMBER
+
+# Launch locally
+# act -j build --container-architecture linux/amd64 -P macos-latest-xlarge=-self-hosted --secret-file .github/workflows/.env.secret -W .github/workflows/release_wallet_ios.yml
diff --git a/example/dapp/ios/fastlane/Fastfile b/example/dapp/ios/fastlane/Fastfile
index 27067673..47e17ebd 100644
--- a/example/dapp/ios/fastlane/Fastfile
+++ b/example/dapp/ios/fastlane/Fastfile
@@ -52,6 +52,7 @@ platform :ios do
match_password = ENV['MATCH_PASSWORD']
slack_url = ENV['SLACK_URL']
+ app_identifier = CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)
api_key = app_store_connect_api_key(
key_id: options[:app_store_key_id],
@@ -64,7 +65,7 @@ platform :ios do
match(
readonly: false,
type: "appstore",
- app_identifier: "com.walletconnect.flutterdapp",
+ app_identifier: "#{app_identifier}",
git_url: options[:match_git_url],
git_basic_authorization: options[:token],
api_key: api_key,
@@ -74,7 +75,7 @@ platform :ios do
)
number = latest_testflight_build_number(
- app_identifier: "com.walletconnect.flutterdapp",
+ app_identifier: "#{app_identifier}",
username: options[:username],
)
new_build_number = number + 1
@@ -100,18 +101,18 @@ platform :ios do
apple_id: options[:app_id],
app_version: options[:app_version],
build_number: "#{new_build_number}",
- app_identifier: "com.walletconnect.flutterdapp",
+ app_identifier: "#{app_identifier}",
changelog: changelog,
distribute_external: true,
notify_external_testers: true,
distribute_external: true,
notify_external_testers: true,
skip_waiting_for_build_processing: false,
- groups: ["External testers"]
+ groups: ["External Testers"]
)
slack(
- message: "📲 Web3Dapp Flutter #{options[:app_version]} (#{new_build_number}) successfully released!\n\n",
+ message: "📱 Web3Dapp Flutter #{options[:app_version]} (#{new_build_number}) successfully released!\n\n",
default_payloads: [],
attachment_properties: {
fields: [
diff --git a/example/wallet/ios/Gemfile b/example/wallet/ios/Gemfile
new file mode 100644
index 00000000..7a118b49
--- /dev/null
+++ b/example/wallet/ios/Gemfile
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gem "fastlane"
diff --git a/example/wallet/ios/Gemfile.lock b/example/wallet/ios/Gemfile.lock
new file mode 100644
index 00000000..550231d9
--- /dev/null
+++ b/example/wallet/ios/Gemfile.lock
@@ -0,0 +1,220 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.7)
+ base64
+ nkf
+ rexml
+ addressable (2.8.7)
+ public_suffix (>= 2.0.2, < 7.0)
+ artifactory (3.0.17)
+ atomos (0.1.3)
+ aws-eventstream (1.3.0)
+ aws-partitions (1.956.0)
+ aws-sdk-core (3.201.1)
+ aws-eventstream (~> 1, >= 1.3.0)
+ aws-partitions (~> 1, >= 1.651.0)
+ aws-sigv4 (~> 1.8)
+ jmespath (~> 1, >= 1.6.1)
+ aws-sdk-kms (1.88.0)
+ aws-sdk-core (~> 3, >= 3.201.0)
+ aws-sigv4 (~> 1.5)
+ aws-sdk-s3 (1.156.0)
+ aws-sdk-core (~> 3, >= 3.201.0)
+ aws-sdk-kms (~> 1)
+ aws-sigv4 (~> 1.5)
+ aws-sigv4 (1.8.0)
+ aws-eventstream (~> 1, >= 1.0.2)
+ babosa (1.0.4)
+ base64 (0.2.0)
+ claide (1.1.0)
+ colored (1.2)
+ colored2 (3.1.2)
+ commander (4.6.0)
+ highline (~> 2.0.0)
+ declarative (0.0.20)
+ digest-crc (0.6.5)
+ rake (>= 12.0.0, < 14.0.0)
+ domain_name (0.6.20240107)
+ dotenv (2.8.1)
+ emoji_regex (3.2.3)
+ excon (0.111.0)
+ faraday (1.10.3)
+ faraday-em_http (~> 1.0)
+ faraday-em_synchrony (~> 1.0)
+ faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
+ faraday-net_http (~> 1.0)
+ faraday-net_http_persistent (~> 1.0)
+ faraday-patron (~> 1.0)
+ faraday-rack (~> 1.0)
+ faraday-retry (~> 1.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-cookie_jar (0.0.7)
+ faraday (>= 0.8.0)
+ http-cookie (~> 1.0.0)
+ faraday-em_http (1.0.0)
+ faraday-em_synchrony (1.0.0)
+ faraday-excon (1.1.0)
+ faraday-httpclient (1.0.1)
+ faraday-multipart (1.0.4)
+ multipart-post (~> 2)
+ faraday-net_http (1.0.1)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
+ faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
+ faraday_middleware (1.2.0)
+ faraday (~> 1.0)
+ fastimage (2.3.1)
+ fastlane (2.221.1)
+ CFPropertyList (>= 2.3, < 4.0.0)
+ addressable (>= 2.8, < 3.0.0)
+ artifactory (~> 3.0)
+ aws-sdk-s3 (~> 1.0)
+ babosa (>= 1.0.3, < 2.0.0)
+ bundler (>= 1.12.0, < 3.0.0)
+ colored (~> 1.2)
+ commander (~> 4.6)
+ dotenv (>= 2.1.1, < 3.0.0)
+ emoji_regex (>= 0.1, < 4.0)
+ excon (>= 0.71.0, < 1.0.0)
+ faraday (~> 1.0)
+ faraday-cookie_jar (~> 0.0.6)
+ faraday_middleware (~> 1.0)
+ fastimage (>= 2.1.0, < 3.0.0)
+ gh_inspector (>= 1.1.2, < 2.0.0)
+ google-apis-androidpublisher_v3 (~> 0.3)
+ google-apis-playcustomapp_v1 (~> 0.1)
+ google-cloud-env (>= 1.6.0, < 2.0.0)
+ google-cloud-storage (~> 1.31)
+ highline (~> 2.0)
+ http-cookie (~> 1.0.5)
+ json (< 3.0.0)
+ jwt (>= 2.1.0, < 3)
+ mini_magick (>= 4.9.4, < 5.0.0)
+ multipart-post (>= 2.0.0, < 3.0.0)
+ naturally (~> 2.2)
+ optparse (>= 0.1.1, < 1.0.0)
+ plist (>= 3.1.0, < 4.0.0)
+ rubyzip (>= 2.0.0, < 3.0.0)
+ security (= 0.1.5)
+ simctl (~> 1.6.3)
+ terminal-notifier (>= 2.0.0, < 3.0.0)
+ terminal-table (~> 3)
+ tty-screen (>= 0.6.3, < 1.0.0)
+ tty-spinner (>= 0.8.0, < 1.0.0)
+ word_wrap (~> 1.0.0)
+ xcodeproj (>= 1.13.0, < 2.0.0)
+ xcpretty (~> 0.3.0)
+ xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
+ gh_inspector (1.1.3)
+ google-apis-androidpublisher_v3 (0.54.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-core (0.11.3)
+ addressable (~> 2.5, >= 2.5.1)
+ googleauth (>= 0.16.2, < 2.a)
+ httpclient (>= 2.8.1, < 3.a)
+ mini_mime (~> 1.0)
+ representable (~> 3.0)
+ retriable (>= 2.0, < 4.a)
+ rexml
+ google-apis-iamcredentials_v1 (0.17.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-playcustomapp_v1 (0.13.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-storage_v1 (0.31.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-cloud-core (1.7.0)
+ google-cloud-env (>= 1.0, < 3.a)
+ google-cloud-errors (~> 1.0)
+ google-cloud-env (1.6.0)
+ faraday (>= 0.17.3, < 3.0)
+ google-cloud-errors (1.4.0)
+ google-cloud-storage (1.47.0)
+ addressable (~> 2.8)
+ digest-crc (~> 0.4)
+ google-apis-iamcredentials_v1 (~> 0.1)
+ google-apis-storage_v1 (~> 0.31.0)
+ google-cloud-core (~> 1.6)
+ googleauth (>= 0.16.2, < 2.a)
+ mini_mime (~> 1.0)
+ googleauth (1.8.1)
+ faraday (>= 0.17.3, < 3.a)
+ jwt (>= 1.4, < 3.0)
+ multi_json (~> 1.11)
+ os (>= 0.9, < 2.0)
+ signet (>= 0.16, < 2.a)
+ highline (2.0.3)
+ http-cookie (1.0.6)
+ domain_name (~> 0.5)
+ httpclient (2.8.3)
+ jmespath (1.6.2)
+ json (2.7.2)
+ jwt (2.8.2)
+ base64
+ mini_magick (4.13.2)
+ mini_mime (1.1.5)
+ multi_json (1.15.0)
+ multipart-post (2.4.1)
+ nanaimo (0.3.0)
+ naturally (2.2.1)
+ nkf (0.2.0)
+ optparse (0.5.0)
+ os (1.1.4)
+ plist (3.7.1)
+ public_suffix (6.0.0)
+ rake (13.2.1)
+ representable (3.2.0)
+ declarative (< 0.1.0)
+ trailblazer-option (>= 0.1.1, < 0.2.0)
+ uber (< 0.2.0)
+ retriable (3.1.2)
+ rexml (3.2.9)
+ strscan
+ rouge (2.0.7)
+ ruby2_keywords (0.0.5)
+ rubyzip (2.3.2)
+ security (0.1.5)
+ signet (0.19.0)
+ addressable (~> 2.8)
+ faraday (>= 0.17.5, < 3.a)
+ jwt (>= 1.5, < 3.0)
+ multi_json (~> 1.10)
+ simctl (1.6.10)
+ CFPropertyList
+ naturally
+ strscan (3.1.0)
+ terminal-notifier (2.0.0)
+ terminal-table (3.0.2)
+ unicode-display_width (>= 1.1.1, < 3)
+ trailblazer-option (0.1.2)
+ tty-cursor (0.7.1)
+ tty-screen (0.8.2)
+ tty-spinner (0.9.3)
+ tty-cursor (~> 0.7)
+ uber (0.1.0)
+ unicode-display_width (2.5.0)
+ word_wrap (1.0.0)
+ xcodeproj (1.24.0)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.3.0)
+ rexml (~> 3.2.4)
+ xcpretty (0.3.0)
+ rouge (~> 2.0.7)
+ xcpretty-travis-formatter (1.0.1)
+ xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+ arm64-darwin-23
+ ruby
+
+DEPENDENCIES
+ fastlane
+
+BUNDLED WITH
+ 2.5.14
diff --git a/example/wallet/ios/Runner.xcodeproj/project.pbxproj b/example/wallet/ios/Runner.xcodeproj/project.pbxproj
index 5a386a7a..d849cf7e 100644
--- a/example/wallet/ios/Runner.xcodeproj/project.pbxproj
+++ b/example/wallet/ios/Runner.xcodeproj/project.pbxproj
@@ -357,6 +357,8 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = W5R8AG9K22;
ENABLE_BITCODE = NO;
@@ -367,6 +369,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterwallet;
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
@@ -486,8 +489,10 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = W5R8AG9K22;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = W5R8AG9K22;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -496,6 +501,8 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterwallet;
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development com.walletconnect.flutterwallet";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -509,8 +516,11 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
+ CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEVELOPMENT_TEAM = W5R8AG9K22;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = W5R8AG9K22;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@@ -519,6 +529,8 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.walletconnect.flutterwallet;
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.walletconnect.flutterwallet";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
diff --git a/example/wallet/ios/Runner/Info.plist b/example/wallet/ios/Runner/Info.plist
index ed04ff0f..15c9facd 100644
--- a/example/wallet/ios/Runner/Info.plist
+++ b/example/wallet/ios/Runner/Info.plist
@@ -24,6 +24,8 @@
????
CFBundleVersion
$(FLUTTER_BUILD_NUMBER)
+ ITSAppUsesNonExemptEncryption
+
LSRequiresIPhoneOS
NSCameraUsageDescription
diff --git a/example/wallet/ios/fastlane/Appfile b/example/wallet/ios/fastlane/Appfile
new file mode 100644
index 00000000..8c2bde20
--- /dev/null
+++ b/example/wallet/ios/fastlane/Appfile
@@ -0,0 +1,7 @@
+app_identifier("com.walletconnect.flutterwallet") # The bundle identifier of your app
+
+itc_team_id("123564616") # App Store Connect Team ID
+team_id("W5R8AG9K22") # Developer Portal Team ID
+
+# For more information about the Appfile, see:
+# https://docs.fastlane.tools/advanced/#appfile
diff --git a/example/wallet/ios/fastlane/Fastfile b/example/wallet/ios/fastlane/Fastfile
new file mode 100644
index 00000000..6507a297
--- /dev/null
+++ b/example/wallet/ios/fastlane/Fastfile
@@ -0,0 +1,137 @@
+# This file contains the fastlane.tools configuration
+# You can find the documentation at https://docs.fastlane.tools
+#
+# For a list of all available actions, check out
+#
+# https://docs.fastlane.tools/actions
+#
+# For a list of all available plugins, check out
+#
+# https://docs.fastlane.tools/plugins/available-plugins
+#
+
+# Uncomment the line if you want fastlane to automatically update itself
+# update_fastlane
+
+ENV["FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT"] = "120"
+
+default_platform(:ios)
+
+platform :ios do
+
+ # Helper method to read the changelog
+ def read_changelog
+ changelog_file = '../../../../CHANGELOG.md'
+ changelog = ""
+
+ if File.exist?(changelog_file)
+ File.open(changelog_file, 'r') do |file|
+ changelog = file.read
+ end
+
+ # Split the changelog into entries based on the version header pattern
+ entries = changelog.split(/^##\s/)
+
+ # Get the latest entry, which is the first one after splitting
+ latest_entry = entries[1]
+
+ # Re-add the '##' header to the latest entry and remove empty lines
+ changelog = latest_entry.strip if latest_entry
+ changelog = changelog.gsub /^$\n/, ''
+ else
+ UI.user_error!("CHANGELOG.md file not found")
+ end
+
+ changelog
+ end
+
+ lane :release_testflight do |options|
+
+ # Setup the keychain and match to work with CI
+ setup_ci
+
+ match_password = ENV['MATCH_PASSWORD']
+ slack_url = ENV['SLACK_URL']
+ app_identifier = CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)
+
+ api_key = app_store_connect_api_key(
+ key_id: options[:app_store_key_id],
+ issuer_id: options[:apple_issuer_id],
+ key_content: options[:app_store_connect_key],
+ duration: 1200,
+ in_house: false,
+ )
+
+ match(
+ readonly: false,
+ type: "appstore",
+ app_identifier: "#{app_identifier}",
+ git_url: options[:match_git_url],
+ git_basic_authorization: options[:token],
+ api_key: api_key,
+ include_all_certificates: true,
+ force_for_new_devices: true,
+ force_for_new_certificates: true,
+ )
+
+ number = latest_testflight_build_number(
+ app_identifier: "#{app_identifier}",
+ username: options[:username],
+ )
+ new_build_number = number + 1
+
+ increment_build_number(
+ build_number: new_build_number,
+ xcodeproj: "Runner.xcodeproj"
+ )
+
+ gym(
+ configuration: "Release",
+ # project: "Runner.xcodeproj",
+ workspace: "Runner.xcworkspace",
+ scheme: "Runner",
+ export_method: "app-store",
+ clean: true,
+ xcargs: "PROJECT_ID='#{options[:project_id]}'"
+ )
+
+ changelog = read_changelog
+
+ upload_to_testflight(
+ apple_id: options[:app_id],
+ app_version: options[:app_version],
+ build_number: "#{new_build_number}",
+ app_identifier: "#{app_identifier}",
+ changelog: changelog,
+ distribute_external: true,
+ notify_external_testers: true,
+ distribute_external: true,
+ notify_external_testers: true,
+ skip_waiting_for_build_processing: false,
+ groups: ["External Testers"]
+ )
+
+ slack(
+ message: "🔐 Web3Wallet Flutter #{options[:app_version]} (#{new_build_number}) successfully released!\n\n",
+ default_payloads: [],
+ attachment_properties: {
+ fields: [
+ {
+ title: "CHANGELOG",
+ value: changelog,
+ # short: true
+ },
+ {
+ title: "LINK",
+ value: "https://testflight.apple.com/join/Uv0XoBuD",
+ # short: true
+ },
+ ]
+ }
+ )
+
+ clean_build_artifacts()
+
+ end
+
+end