diff --git a/.github/workflows/ios-staging.yml b/.github/workflows/ios-staging.yml new file mode 100644 index 0000000..2097d41 --- /dev/null +++ b/.github/workflows/ios-staging.yml @@ -0,0 +1,88 @@ +name: Release iOS Staging + +on: + workflow_dispatch: + +jobs: + build: + name: Build iOS + runs-on: macos-latest + timeout-minutes: 180 + steps: + - name: Checkout source + uses: actions/checkout@v3 + + - uses: pnpm/action-setup@v2 + name: Install pnpm + id: pnpm-install + with: + version: 8 + run_install: false + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18.x + cache: 'pnpm' + + # Install dependencies using pnpm + - name: Install Dependencies + run: pnpm install + + - name: Build SolidJS app + env: + VITE_NETWORK: signet + VITE_PROXY: wss://p.mutinywallet.com + VITE_ESPLORA: https://mutinynet.com/api + VITE_LSP: https://signet-lsp.mutinywallet.com + VITE_RGS: https://rgs.mutinynet.com/snapshot/ + VITE_AUTH: https://auth-staging.mutinywallet.com + VITE_SUBSCRIPTIONS: https://subscriptions-staging.mutinywallet.com + VITE_STORAGE: https://storage-staging.mutinywallet.com/v2 + VITE_FEEDBACK: https://feedback-staging.mutinywallet.com + VITE_SCORER: https://scorer-staging.mutinywallet.com + VITE_PRIMAL: https://primal-cache.mutinywallet.com/api + run: pnpm build + + - uses: actions/cache@v3 + with: + path: ios/App/Pods + key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-pods- + + - name: Capacitor sync + run: npx cap sync + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2.2' + bundler-cache: true + working-directory: 'ios/App' + + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '14.2.0' + + - uses: maierj/fastlane-action@v3.0.0 + env: + DEVELOPER_APP_IDENTIFIER: ${{ secrets.DEVELOPER_APP_IDENTIFIER }} + # PROVISIONING_PROFILE_SPECIFIER: match AppStore ${{ secrets.DEVELOPER_APP_IDENTIFIER }} + KEYCHAIN_NAME: ${{ secrets.KEYCHAIN_NAME }} + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }} + APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }} + APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }} + CERTIFICATE_STORE_URL: ${{ secrets.CERTIFICATE_STORE_URL }} + GIT_USERNAME: ${{ secrets.GIT_USERNAME }} + GIT_TOKEN: ${{ secrets.GIT_TOKEN }} + FASTLANE_APPLE_ID: ${{ secrets.FASTLANE_APPLE_ID }} + MATCH_USERNAME: ${{ secrets.FASTLANE_APPLE_ID }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }} + DEVELOPER_PORTAL_TEAM_ID: ${{ secrets.DEVELOPER_PORTAL_TEAM_ID }} + with: + lane: 'beta' + subdirectory: 'ios/App' + + diff --git a/ios/.gitignore b/ios/.gitignore index f470299..a2957a9 100644 --- a/ios/.gitignore +++ b/ios/.gitignore @@ -11,3 +11,6 @@ capacitor-cordova-ios-plugins # Generated Config files App/App/capacitor.config.json App/App/config.xml + +App/App.app.dSYM.zip +App/App.ipa \ No newline at end of file diff --git a/ios/App/App.app.dSYM.zip b/ios/App/App.app.dSYM.zip new file mode 100644 index 0000000..9b0fc85 Binary files /dev/null and b/ios/App/App.app.dSYM.zip differ diff --git a/ios/App/App.ipa b/ios/App/App.ipa new file mode 100644 index 0000000..4cad690 Binary files /dev/null and b/ios/App/App.ipa differ diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index 37dd785..0201f01 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -351,7 +351,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 11; DEVELOPMENT_TEAM = X773Y823TN; INFOPLIST_FILE = App/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; @@ -374,9 +374,11 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; - DEVELOPMENT_TEAM = X773Y823TN; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 11; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = X773Y823TN; INFOPLIST_FILE = App/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; IPHONEOS_DEPLOYMENT_TARGET = 14.0; @@ -385,6 +387,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.mutinywallet.mutiny; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.mutinywallet.mutiny"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist index 10ca0f1..f39e235 100644 --- a/ios/App/App/Info.plist +++ b/ios/App/App/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - $(CURRENT_PROJECT_VERSION) + 11 LSRequiresIPhoneOS NSCameraUsageDescription diff --git a/ios/App/Gemfile b/ios/App/Gemfile new file mode 100644 index 0000000..7a118b4 --- /dev/null +++ b/ios/App/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/ios/App/Gemfile.lock b/ios/App/Gemfile.lock new file mode 100644 index 0000000..7520d71 --- /dev/null +++ b/ios/App/Gemfile.lock @@ -0,0 +1,218 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.6) + rexml + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) + artifactory (3.0.15) + atomos (0.1.3) + aws-eventstream (1.2.0) + aws-partitions (1.843.0) + aws-sdk-core (3.185.2) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.72.0) + aws-sdk-core (~> 3, >= 3.184.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.136.0) + aws-sdk-core (~> 3, >= 3.181.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.6) + aws-sigv4 (1.6.1) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + 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.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.8.1) + emoji_regex (3.2.3) + excon (0.104.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.2.7) + fastlane (2.216.0) + 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 + 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-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) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.3) + 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) + gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.51.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-core (0.11.2) + 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 + webrick + 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.19.0) + google-apis-core (>= 0.9.0, < 2.a) + google-cloud-core (1.6.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.6.0) + faraday (>= 0.17.3, < 3.0) + google-cloud-errors (1.3.1) + google-cloud-storage (1.44.0) + addressable (~> 2.8) + digest-crc (~> 0.4) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.19.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.5) + domain_name (~> 0.5) + httpclient (2.8.3) + jmespath (1.6.2) + json (2.6.3) + jwt (2.7.1) + mini_magick (4.12.0) + mini_mime (1.1.5) + multi_json (1.15.0) + multipart-post (2.3.0) + nanaimo (0.3.0) + naturally (2.2.1) + optparse (0.1.1) + os (1.1.4) + plist (3.7.0) + public_suffix (5.0.3) + rake (13.1.0) + 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.6) + rouge (2.0.7) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + security (0.1.3) + signet (0.18.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 + 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.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) + unicode-display_width (2.5.0) + webrick (1.8.1) + word_wrap (1.0.0) + xcodeproj (1.23.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 + x86_64-darwin-20 + +DEPENDENCIES + fastlane + +BUNDLED WITH + 2.4.10 diff --git a/ios/App/fastlane/.gitignore b/ios/App/fastlane/.gitignore new file mode 100644 index 0000000..4dfd54d --- /dev/null +++ b/ios/App/fastlane/.gitignore @@ -0,0 +1 @@ +report.xml \ No newline at end of file diff --git a/ios/App/fastlane/Appfile b/ios/App/fastlane/Appfile new file mode 100644 index 0000000..a3756d9 --- /dev/null +++ b/ios/App/fastlane/Appfile @@ -0,0 +1,7 @@ +app_identifier(ENV["DEVELOPER_APP_IDENTIFIER"]) # The bundle identifier of your app +apple_id(ENV["FASTLANE_APPLE_ID"]) # Your Apple Developer Portal username +itc_team_id(ENV["APP_STORE_CONNECT_TEAM_ID"]) # App Store Connect Team ID +team_id(ENV["DEVELOPER_PORTAL_TEAM_ID"]) # Developer Portal Team ID + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile diff --git a/ios/App/fastlane/Fastfile b/ios/App/fastlane/Fastfile new file mode 100644 index 0000000..9698694 --- /dev/null +++ b/ios/App/fastlane/Fastfile @@ -0,0 +1,59 @@ +# 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 + +default_platform(:ios) + +ISSUER_ID = ENV["APPLE_ISSUER_ID"] +KEY_ID = ENV["APPLE_KEY_ID"] +KEY_CONTENT = ENV["APPLE_KEY_CONTENT"] + +KEYCHAIN_NAME = ENV["KEYCHAIN_NAME"] +KEYCHAIN_PASSWORD = ENV["KEYCHAIN_PASSWORD"] + +platform :ios do + desc "Push a new beta build to TestFlight" + lane :beta do + api_key = app_store_connect_api_key( + key_id: KEY_ID, + issuer_id: ISSUER_ID, + key_content: KEY_CONTENT + ) + + # In CI we don't want to be prompted for a password + create_keychain( + name: KEYCHAIN_NAME, + password: KEYCHAIN_PASSWORD, + default_keychain: true, + unlock: true, + timeout: 3600, + add_to_search_list: true + ) + + match( + type: "appstore", + keychain_name: KEYCHAIN_NAME, + keychain_password: KEYCHAIN_PASSWORD, + readonly: is_ci + ) + + increment_build_number(xcodeproj: "App.xcodeproj") + build_app( + workspace: "App.xcworkspace", + scheme: "App", + xcargs: "-allowProvisioningUpdates" + ) + upload_to_testflight(api_key: api_key, skip_waiting_for_build_processing: true) + end +end diff --git a/ios/App/fastlane/Matchfile b/ios/App/fastlane/Matchfile new file mode 100644 index 0000000..57c62ef --- /dev/null +++ b/ios/App/fastlane/Matchfile @@ -0,0 +1,20 @@ +CERTIFICATE_STORE_URL = ENV["CERTIFICATE_STORE_URL"] +GIT_USERNAME = ENV["GIT_USERNAME"] +GIT_TOKEN = ENV["GIT_TOKEN"] +FASTLANE_APPLE_ID = ENV["FASTLANE_APPLE_ID"] + +git_url(CERTIFICATE_STORE_URL) + +storage_mode("git") +type("appstore") # The default type, can be: appstore, adhoc, enterprise or development + +git_basic_authorization(Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}")) +username(FASTLANE_APPLE_ID) + +# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"]) +# username("user@fastlane.tools") # Your Apple Developer Portal username + +# For all available options run `fastlane match --help` +# Remove the # in the beginning of the line to enable the other options + +# The docs are available on https://docs.fastlane.tools/actions/match diff --git a/ios/App/fastlane/README.md b/ios/App/fastlane/README.md new file mode 100644 index 0000000..891747d --- /dev/null +++ b/ios/App/fastlane/README.md @@ -0,0 +1,32 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## iOS + +### ios beta + +```sh +[bundle exec] fastlane ios beta +``` + +Push a new beta build to TestFlight + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/src/components/BetaWarningModal.tsx b/src/components/BetaWarningModal.tsx index 82bc1cc..f3ca699 100644 --- a/src/components/BetaWarningModal.tsx +++ b/src/components/BetaWarningModal.tsx @@ -58,15 +58,17 @@ export const WarningModal: ParentComponent<{
- - {props.title} - - - - - -
{props.children}
-
+
+ + {props.title} + + + + + +
{props.children}
+
+
diff --git a/src/utils/download.ts b/src/utils/download.ts index 87e5576..6014884 100644 --- a/src/utils/download.ts +++ b/src/utils/download.ts @@ -3,6 +3,8 @@ import { Directory, Encoding, Filesystem } from "@capacitor/filesystem"; import { Share } from "@capacitor/share"; import { Toast } from "@capacitor/toast"; +import { eify } from "./eify"; + export async function downloadTextFile( content: string, fileName: string, @@ -35,10 +37,18 @@ export async function downloadTextFile( "Error creating or sharing the file: ", JSON.stringify(error) ); - await Toast.show({ - text: `Error while saving or sharing file`, - duration: "long" - }); + + const err = eify(error); + + if (err.message.includes("Share canceled")) { + // Do nothing + return; + } else { + await Toast.show({ + text: `Error while saving or sharing file`, + duration: "long" + }); + } } } else { // https://stackoverflow.com/questions/34156282/how-do-i-save-json-to-local-text-file