Vovan 7 mēneši atpakaļ
revīzija
6e6fe83e94
100 mainītis faili ar 3390 papildinājumiem un 0 dzēšanām
  1. 20 0
      .gitignore
  2. 10 0
      .metadata
  3. 2 0
      .pubignore
  4. 40 0
      .vscode/launch.json
  5. 96 0
      CHANGELOG.md
  6. 10 0
      Gemfile
  7. 277 0
      Gemfile.lock
  8. 18 0
      LICENSE
  9. 763 0
      README.md
  10. 4 0
      analysis_options.yaml
  11. 8 0
      android/.gitignore
  12. 49 0
      android/build.gradle
  13. 3 0
      android/gradle.properties
  14. 5 0
      android/gradle/wrapper/gradle-wrapper.properties
  15. 6 0
      android/settings.gradle
  16. 8 0
      android/src/main/AndroidManifest.xml
  17. 19 0
      android/src/main/kotlin/ru/yoomoney/sdk/kassa/payments/flutter/TokenizationResultExtensions.kt
  18. 314 0
      android/src/main/kotlin/ru/yoomoney/sdk/kassa/payments/flutter/YookassaPaymentsFlutterPlugin.kt
  19. BIN
      assets/images/sberpay-reg-url-scheme.png
  20. 46 0
      example/.gitignore
  21. 10 0
      example/.metadata
  22. 3 0
      example/README.md
  23. 29 0
      example/analysis_options.yaml
  24. 13 0
      example/android/.gitignore
  25. 64 0
      example/android/app/build.gradle
  26. 47 0
      example/android/app/src/main/AndroidManifest.xml
  27. 6 0
      example/android/app/src/main/kotlin/ru/yoomoney/yookassa_payments_flutter_example/MainActivity.kt
  28. 12 0
      example/android/app/src/main/res/drawable-v21/launch_background.xml
  29. 12 0
      example/android/app/src/main/res/drawable/launch_background.xml
  30. BIN
      example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  31. BIN
      example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  32. BIN
      example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  33. BIN
      example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  34. BIN
      example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  35. 18 0
      example/android/app/src/main/res/values-night/styles.xml
  36. 18 0
      example/android/app/src/main/res/values/styles.xml
  37. 17 0
      example/android/build.gradle
  38. 3 0
      example/android/gradle.properties
  39. 6 0
      example/android/gradle/wrapper/gradle-wrapper.properties
  40. 25 0
      example/android/settings.gradle
  41. 35 0
      example/ios/.gitignore
  42. 26 0
      example/ios/Flutter/AppFrameworkInfo.plist
  43. 2 0
      example/ios/Flutter/Debug.xcconfig
  44. 2 0
      example/ios/Flutter/Release.xcconfig
  45. 48 0
      example/ios/Podfile
  46. 227 0
      example/ios/Podfile.lock
  47. 471 0
      example/ios/Runner.xcodeproj/project.pbxproj
  48. 7 0
      example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  49. 8 0
      example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  50. 8 0
      example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  51. 87 0
      example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  52. 10 0
      example/ios/Runner.xcworkspace/contents.xcworkspacedata
  53. 8 0
      example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  54. 8 0
      example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  55. 40 0
      example/ios/Runner/AppDelegate.swift
  56. 122 0
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  57. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
  58. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
  59. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
  60. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
  61. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
  62. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
  63. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
  64. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
  65. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
  66. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
  67. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
  68. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
  69. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
  70. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
  71. BIN
      example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
  72. 23 0
      example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
  73. BIN
      example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
  74. BIN
      example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
  75. BIN
      example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
  76. 5 0
      example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
  77. 122 0
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Contents.json
  78. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-1024x1024@1x.png
  79. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-20x20@1x.png
  80. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-20x20@2x.png
  81. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-20x20@3x.png
  82. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-29x29@1x.png
  83. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-29x29@2x.png
  84. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-29x29@3x.png
  85. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-40x40@1x.png
  86. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-40x40@2x.png
  87. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-40x40@3x.png
  88. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-60x60@2x.png
  89. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-60x60@3x.png
  90. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-76x76@1x.png
  91. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-76x76@2x.png
  92. BIN
      example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-83.5x83.5@2x.png
  93. 23 0
      example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/Contents.json
  94. BIN
      example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/LaunchImage.png
  95. BIN
      example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/LaunchImage@2x.png
  96. BIN
      example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/LaunchImage@3x.png
  97. 5 0
      example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/README.md
  98. 122 0
      example/ios/Runner/Assets.xcassets/prodAppIcon.appiconset/Contents.json
  99. BIN
      example/ios/Runner/Assets.xcassets/prodAppIcon.appiconset/Icon-App-1024x1024@1x.png
  100. BIN
      example/ios/Runner/Assets.xcassets/prodAppIcon.appiconset/Icon-App-20x20@1x.png

+ 20 - 0
.gitignore

@@ -0,0 +1,20 @@
+.DS_Store
+.dart_tool/
+
+.packages
+.pub/
+/.idea/vcs.xml
+
+build/
+*.iml
+Flutter/Generated.xcconfig
+Flutter/flutter_export_environment.sh
+.bundle/
+fastlane/
+
+.idea/*
+!.idea/codeStyles/
+!.idea/copyright/
+
+#Mac OS X
+.DS_Store

+ 10 - 0
.metadata

@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+  revision: 18116933e77adc82f80866c928266a5b4f1ed645
+  channel: stable
+
+project_type: plugin

+ 2 - 0
.pubignore

@@ -0,0 +1,2 @@
+demo/
+example/

+ 40 - 0
.vscode/launch.json

@@ -0,0 +1,40 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "demo",
+            "cwd": "demo",
+            "request": "launch",
+            "type": "dart"
+        },
+        {
+            "name": "demo-debug-dev",
+            "cwd": "demo",
+            "request": "launch",
+            "type": "dart",
+            "flutterMode": "debug",
+            "args": [
+                "-t",
+                "lib/main_dev.dart",
+                "--flavor",
+                "dev"
+            ]
+        },
+        {
+            "name": "demo-debug-prod",
+            "cwd": "demo",
+            "request": "launch",
+            "type": "dart",
+            "flutterMode": "debug",
+            "args": [
+                "-t",
+                "lib/main_prod.dart",
+                "--flavor",
+                "prod"
+            ]
+        }
+    ]
+}

+ 96 - 0
CHANGELOG.md

@@ -0,0 +1,96 @@
+> #### Before create pull request
+> - You must specify one of the versions in the field **NEXT_VERSION_TYPE**
+> - Also you need to indicate descriptions of changes between fields **NEXT_VERSION_DESCRIPTION_BEGIN** and **NEXT_VERSION_DESCRIPTION_END**
+### NEXT_VERSION_TYPE=MAJOR|MINOR|PATCH
+### NEXT_VERSION_DESCRIPTION_BEGIN
+### NEXT_VERSION_DESCRIPTION_END
+
+## [1.8.0] (01-04-2025)
+
+* Up android native version to 7.1.0
+* Up iOS to 7.4.0
+* Migrate to the Plugin DSL
+
+## [1.7.1] (13-01-2025)
+
+* Up android native version to 7.0.2
+* Update SberPay documentation
+
+## [1.7.0] (14-10-2024)
+
+* Update mSDK version
+* iOS to 7.2.0
+* Android to 7.0.1
+* Update Android compileSdkVersion to 34
+
+## [1.5.0] (23-05-2024)
+
+* Update dependencies;
+* Using AppMetrica reporters
+* Update NSPrivacyTrackingDomains value
+
+## [1.4.0] (27-04-2024)
+
+* Android changes: update dependencies - java 17, kotlin 1.9.22, AGP 8.2.2, min sdk version raised to 24, update native version MSDK to 6.11.0, documentation updates. iOS changes: min iOS version up to 14, update native version MSDK to 6.16.0 with privacy manifest
+
+## [1.3.1] (26-03-2024)
+
+* Added Jenkinsfile
+
+## [1.3.0] (22-12-2023)
+
+* Update payment method via Sber
+
+## [1.2.2] (29-09-2023)
+
+* Fix unnecessary_non_null_assertion warnings in test
+
+## [1.2.1] (28-09-2023)
+
+* Add parameters for deploying to pub.dev
+
+## [1.2.0] (27-09-2023)
+
+* Add CI/CD configuration files
+
+## [1.1.1]
+
+* Fix SBP implementation readme. Fix and improve UI
+
+## [1.1.0]
+
+* Support new payment method — SBP
+
+## [1.0.6]
+
+* Fix crash with 3DS confirmation for Android Platform
+
+## [1.0.5]
+
+* Fix bug with return confirmation result for iOS platform
+
+## [1.0.4]
+
+* Added processing of Mintsifra certificates in webView to keep banking services working
+* Moved the field for customizing the display of the YooKassa logo from TokenizationSettings to CustomizationSettings
+* Made UI changes and updated profiling
+
+## [1.0.3]
+
+* Fixed iOS confirmation flow. Refactored TokenizationResult, now it's have SuccessTokenizationResult, ErrorTokenizationResult and CanceledTokenizationResult versions. Not to get token from TokenizationResult you need to check it's type:
+var result = await YookassaPaymentsFlutter.tokenization(tokenizationModuleInputData);
+if (result is SuccessTokenizationResult) {
+    result.token
+}
+
+## [1.0.2]
+
+* Made applePayID and moneyAuthClientId fields optional.
+
+## [1.0.1]
+
+* Formatted code. Added homepage and repo urls.
+
+## [1.0.0]
+
+* Initial development release.

+ 10 - 0
Gemfile

@@ -0,0 +1,10 @@
+# A sample Gemfile
+source "https://rubygems.org"
+
+gem 'fastlane'
+gem "activesupport", "= 7.0.8"
+gem "concurrent-ruby", "= 1.3.4"
+gem "cocoapods"
+
+plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
+eval_gemfile(plugins_path) if File.exist?(plugins_path)

+ 277 - 0
Gemfile.lock

@@ -0,0 +1,277 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    CFPropertyList (3.0.7)
+      base64
+      nkf
+      rexml
+    activesupport (7.0.8)
+      concurrent-ruby (~> 1.0, >= 1.0.2)
+      i18n (>= 1.6, < 2)
+      minitest (>= 5.1)
+      tzinfo (~> 2.0)
+    addressable (2.8.7)
+      public_suffix (>= 2.0.2, < 7.0)
+    artifactory (3.0.17)
+    atomos (0.1.3)
+    aws-eventstream (1.3.2)
+    aws-partitions (1.1077.0)
+    aws-sdk-core (3.222.1)
+      aws-eventstream (~> 1, >= 1.3.0)
+      aws-partitions (~> 1, >= 1.992.0)
+      aws-sigv4 (~> 1.9)
+      base64
+      jmespath (~> 1, >= 1.6.1)
+      logger
+    aws-sdk-kms (1.99.0)
+      aws-sdk-core (~> 3, >= 3.216.0)
+      aws-sigv4 (~> 1.5)
+    aws-sdk-s3 (1.182.0)
+      aws-sdk-core (~> 3, >= 3.216.0)
+      aws-sdk-kms (~> 1)
+      aws-sigv4 (~> 1.5)
+    aws-sigv4 (1.11.0)
+      aws-eventstream (~> 1, >= 1.0.2)
+    babosa (1.0.4)
+    base64 (0.2.0)
+    claide (1.1.0)
+    cocoapods (1.0.1)
+      activesupport (>= 4.0.2)
+      claide (>= 1.0.0, < 2.0)
+      cocoapods-core (= 1.0.1)
+      cocoapods-deintegrate (>= 1.0.0, < 2.0)
+      cocoapods-downloader (>= 1.0.0, < 2.0)
+      cocoapods-plugins (>= 1.0.0, < 2.0)
+      cocoapods-search (>= 1.0.0, < 2.0)
+      cocoapods-stats (>= 1.0.0, < 2.0)
+      cocoapods-trunk (>= 1.0.0, < 2.0)
+      cocoapods-try (>= 1.0.0, < 2.0)
+      colored (~> 1.2)
+      escape (~> 0.0.4)
+      fourflusher (~> 0.3.0)
+      molinillo (~> 0.4.5)
+      nap (~> 1.0)
+      xcodeproj (>= 1.1.0, < 2.0)
+    cocoapods-core (1.0.1)
+      activesupport (>= 4.0.2)
+      fuzzy_match (~> 2.0.4)
+      nap (~> 1.0)
+    cocoapods-deintegrate (1.0.5)
+    cocoapods-downloader (1.6.3)
+    cocoapods-plugins (1.0.0)
+      nap
+    cocoapods-search (1.0.1)
+    cocoapods-stats (1.1.0)
+    cocoapods-trunk (1.6.0)
+      nap (>= 0.8, < 2.0)
+      netrc (~> 0.11)
+    cocoapods-try (1.2.0)
+    colored (1.2)
+    colored2 (3.1.2)
+    commander (4.6.0)
+      highline (~> 2.0.0)
+    concurrent-ruby (1.3.4)
+    declarative (0.0.20)
+    digest-crc (0.7.0)
+      rake (>= 12.0.0, < 14.0.0)
+    domain_name (0.6.20240107)
+    dotenv (2.8.1)
+    emoji_regex (3.2.3)
+    escape (0.0.4)
+    excon (0.112.0)
+    faraday (1.10.4)
+      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.1.0)
+      multipart-post (~> 2.0)
+    faraday-net_http (1.0.2)
+    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.1)
+      faraday (~> 1.0)
+    fastimage (2.4.0)
+    fastlane (2.227.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 (~> 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)
+      fastlane-sirp (>= 1.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.4.0)
+      xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
+    fastlane-sirp (1.0.0)
+      sysrandom (~> 1.0)
+    fourflusher (0.3.2)
+    fuzzy_match (2.0.4)
+    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.8.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.5.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.8)
+      domain_name (~> 0.5)
+    httpclient (2.9.0)
+      mutex_m
+    i18n (1.14.7)
+      concurrent-ruby (~> 1.0)
+    jmespath (1.6.2)
+    json (2.10.2)
+    jwt (2.10.1)
+      base64
+    logger (1.7.0)
+    mini_magick (4.13.2)
+    mini_mime (1.1.5)
+    minitest (5.25.5)
+    molinillo (0.4.5)
+    multi_json (1.15.0)
+    multipart-post (2.4.1)
+    mutex_m (0.3.0)
+    nanaimo (0.4.0)
+    nap (1.1.0)
+    naturally (2.2.1)
+    netrc (0.11.0)
+    nkf (0.2.0)
+    optparse (0.6.0)
+    os (1.1.4)
+    plist (3.7.2)
+    public_suffix (6.0.1)
+    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.4.1)
+    rouge (3.28.0)
+    ruby2_keywords (0.0.5)
+    rubyzip (2.4.1)
+    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
+    sysrandom (1.0.5)
+    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)
+    tzinfo (2.0.6)
+      concurrent-ruby (~> 1.0)
+    uber (0.1.0)
+    unicode-display_width (2.6.0)
+    word_wrap (1.0.0)
+    xcodeproj (1.27.0)
+      CFPropertyList (>= 2.3.3, < 4.0)
+      atomos (~> 0.1.3)
+      claide (>= 1.0.2, < 2.0)
+      colored2 (~> 3.1)
+      nanaimo (~> 0.4.0)
+      rexml (>= 3.3.6, < 4.0)
+    xcpretty (0.4.1)
+      rouge (~> 3.28.0)
+    xcpretty-travis-formatter (1.0.1)
+      xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+  arm64-darwin-23
+
+DEPENDENCIES
+  activesupport (= 7.0.8)
+  cocoapods
+  concurrent-ruby (= 1.3.4)
+  fastlane
+
+BUNDLED WITH
+   2.5.9

+ 18 - 0
LICENSE

@@ -0,0 +1,18 @@
+The MIT License (MIT)
+Copyright © 2022 NBCO YooMoney LLC
+
+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.

+ 763 - 0
README.md

@@ -0,0 +1,763 @@
+# YooKassa Payments SDK
+[![Version](https://img.shields.io/pub/v/yookassa_payments_flutter)](https://pub.dev/packages/yookassa_payments_flutter)
+![Version](https://img.shields.io/badge/minSdkVersion-24-blue)
+![Version](https://img.shields.io/badge/AGP-8.2.2-blue)
+![Version](https://img.shields.io/badge/Java-17-blue)
+![Version](https://img.shields.io/badge/Kotlin-1.9.22-blue)
+![Version](https://img.shields.io/badge/iOS-14.0-orange)
+
+Библиотека позволяет встроить прием платежей в мобильные приложения на Flutter и работает как дополнение к API ЮKassa.\
+В мобильный SDK входят готовые платежные интерфейсы (форма оплаты и всё, что с ней связано).\
+С помощью SDK можно получать токены для проведения оплаты с банковской карты, через Сбербанк Онлайн или из кошелька в ЮMoney.
+
+## Подключение зависимостей
+
+1. В файл `pubspec.yaml` добавьте зависимость и запустите `pub get`:
+
+```dart
+dependencies:
+  flutter:
+    sdk: flutter
+  yookassa_payments_flutter: ^version
+```
+
+или используйте команду `flutter pub add yookassa_payments_flutter`.
+
+2. В Podfile вашего приложения добавьте ссылки на репозитории с podspecs YooKassa:
+```ruby
+source 'https://github.com/CocoaPods/Specs.git'
+source 'https://git.yoomoney.ru/scm/sdk/cocoa-pod-specs.git'
+```
+
+3. Запустите `pod install --repo-update` в директории рядом с Runner.xcworkspace
+
+4. В Info.plist своего приложения добавьте поддержку url-схем для корректной работы mSDK с оплатой через Сбер и ЮMoney:
+```
+<key>CFBundleURLTypes</key>
+<array>
+    <dict>
+        <key>CFBundleTypeRole</key>
+        <string>Editor</string>
+        <key>CFBundleURLSchemes</key>
+        <array>
+            <string>yookassapaymentsflutter</string>
+        </array>
+    </dict>
+</array>
+
+<key>LSApplicationQueriesSchemes</key>
+<array>
+    <string>yoomoneyauth</string>
+    <string>sberpay</string>
+</array>
+```
+
+## Решение проблем подключения/сборки
+
+1. pod install` завершается с ошибкой
+
+* Попробуйте команду `pod update YooKassaPayments`
+
+* В некоторых сложных случаях рекомендуем сбросить кэш cocoapods. Это можно сделать несколькими способам.
+
+   Вариант 1: выполнить набор команд для сброса кэша для пода YooKassaPayments и его зависимостей:
+               ```bash
+               pod cache clean FunctionalSwift --all
+               pod cache clean MoneyAuth  --all
+               pod cache clean ThreatMetrixAdapter  --all
+               pod cache clean YooKassaPayments  --all
+               pod cache clean YooKassaPaymentsApi  --all
+               pod cache clean YooKassaWalletApi  --all
+               pod cache clean YooMoneyCoreApi  --all
+               pod cache clean TMXProfiling --all
+               pod cache clean TMXProfilingConnections --all
+               ``` 
+   Вариант 2: Удалить полностью кэш cocoapods командой `rm -rf ~/.cocoapods/repos`. Обращаем ваше внимание что после этого
+              cocoapods будет восстанавливать свой локальный каталог некоторое время.
+              
+   Далее рекомендуем выполнить `flutter clean`, `pod clean` и `pod deintegrate YOUR_PROJECT_NAME.xcodeproj`
+   для последущей чистой установки командой `pod install`
+   
+2. При сборке получили ошибку `xcode no such module '__ObjC'`
+
+* Откройте ios проект в Xcode, выберите target `Runner`, перейдите в найтройки Build Settings и выставьте флаг `Build Libraries for Distribution` в `NO`. Для project `Runner` проделайте тоже самое — Project Runner -> Build Settings -> установите Build Libraries for Distribution в NO.
+Далее в Xcode Product -> Clean build folder.., и также очистите содержимое DerivedData
+
+## Быстрая интеграция
+
+1. Создайте `TokenizationModuleInputData` (понадобится [ключ для клиентских приложений](https://yookassa.ru/my/tunes) из личного кабинета ЮKassa). В этой модели передаются параметры платежа (валюта и сумма) и параметры платежной формы, которые увидит пользователь при оплате (способы оплаты, название магазина и описание заказа).
+
+Пример создания `TokenizationModuleInputData`:
+
+```dart
+var clientApplicationKey = "<Ключ для клиентских приложений>";
+var amount = Amount(value: "999.9", currency: Currency.rub);
+var shopId = "<Идентификатор магазина в ЮKassa)>";
+var tokenizationModuleInputData =
+          TokenizationModuleInputData(clientApplicationKey: clientApplicationKey,
+                                      title: "Космические объекты",
+                                      subtitle: "Комета повышенной яркости, период обращения — 112 лет",
+                                      amount: amount,
+                                      shopId: shopId,
+                                      savePaymentMethod: SavePaymentMethod.on);
+```
+
+2. Запустите процесс токенизации с кейсом `.tokenization` и передайте `TokenizationModuleInputData`.
+
+```dart
+var result = await YookassaPaymentsFlutter.tokenization(tokenizationModuleInputData);
+```
+
+3. Получите token в `TokenizationResult`
+
+Пример:
+
+```dart
+var result = await YookassaPaymentsFlutter.tokenization(tokenizationModuleInputData);
+if (result is SuccessTokenizationResult) {
+    var token = result.token;
+    var paymentMethodType = result.paymentMethodType;
+}
+```
+
+4. Закройте модуль SDK и отправьте токен в вашу систему. Затем [создайте платеж](https://yookassa.ru/developers/api#create_payment) по API ЮKassa, в параметре `payment_token` передайте токен, полученный в SDK. Способ подтверждения при создании платежа зависит от способа оплаты, который выбрал пользователь. Он приходит вместе с токеном в `paymentMethodType`.
+
+5. Подтверждение платежа. При необходимости система может запросить процесс подтверждения платежа, при котором пользователь подтверждает транзакцию с помощью сторонних сервисов. Плагин поддерживает два типа подтверждения платежа - 3Dsecure (при оплате банковской картой) и App2App сценарий (при оплате через SberPay). Ссылку вы получаете от бекенда Кассы после проведения платежа на шаге 4.
+
+```dart
+var clientApplicationKey = "<Ключ для клиентских приложений>";
+var shopId = "<Идентификатор магазина в ЮKassa)>";
+
+await YookassaPaymentsFlutter.confirmation(confirmationUrl, PaymentMethod.sbp, clientApplicationKey, shopId);
+// обработайте результат подтверждения на следущей строке (после возврата управления)
+```
+Завершение процесса `YookassaPaymentsFlutter.confirmation` не несет информацию о том, что пользователь фактически подтвердил платеж (он мог его пропустить). После получения результата рекомендуем запросить статус платежа.
+
+## Доступные способы оплаты
+
+Сейчас в SDK доступны следующие способы оплаты:
+
+`.yooMoney` — ЮMoney (платежи из кошелька или привязанной картой)\
+`.bankCard` — банковская карта (карты можно сканировать)\
+`.sberbank` — SberPay (с подтверждением через приложение Сбербанк Онлайн, если оно установленно, иначе с подтверждением по смс)\
+`.sbp` - СБП\
+
+## Настройка способов оплаты
+
+У вас есть возможность сконфигурировать способы оплаты.\
+Для этого необходимо при создании `TokenizationModuleInputData` в параметре `tokenizationSettings` передать модель типа `TokenizationSettings`.
+
+> Для некоторых способов оплаты нужна дополнительная настройка (см. ниже).\
+> По умолчанию используются все доступные способы оплаты.
+
+```dart
+// Создайте пустой List<PaymentMethod>
+List<PaymentMethod> paymentMethodTypes = [];
+
+if (<Условие для банковской карты>) {
+    // Добавляем в paymentMethodTypes элемент `PaymentMethod.bankCard`
+    paymentMethodTypes.add(PaymentMethod.bankCard);
+}
+
+if (<Условие для Сбербанка Онлайн>) {
+    // Добавляем в paymentMethodTypes элемент `PaymentMethod.sberbank`
+    paymentMethodTypes.add(PaymentMethod.sberbank);
+}
+
+if (<Условие для ЮMoney>) {
+    // Добавляем в paymentMethodTypes элемент `PaymentMethod.yooMoney`
+    paymentMethodTypes.add(PaymentMethod.yooMoney);
+}
+
+if <Условие для СБП> {
+    // Добавляем в paymentMethodTypes элемент `.sbp`
+    paymentMethodTypes.insert(.sbp)
+}
+
+var settings = TokenizationSettings(PaymentMethodTypes(paymentMethodTypes));
+```
+
+Теперь используйте `tokenizationSettings` при инициализации `TokenizationModuleInputData`.
+
+### ЮMoney
+
+Для подключения способа оплаты `ЮMoney` необходимо:
+
+1. Получить `client id` центра авторизации системы `ЮMoney`.
+2. При создании `TokenizationModuleInputData` передать `client id` в параметре `moneyAuthClientId`
+3. В `TokenizationSettings` передайте значение `PaymentMethodTypes.yooMoney`.
+4. Получите токен.
+5. [Создайте платеж](https://yookassa.ru/developers/api#create_payment) с токеном по API ЮKassa.
+
+#### Как получить `client id` центра авторизации системы `ЮMoney`
+
+1. Авторизуйтесь на [yookassa.ru](https://yookassa.ru)
+2. Перейти на страницу регистрации клиентов СЦА - [yookassa.ru/oauth/v2/client](https://yookassa.ru/oauth/v2/client)
+3. Нажать [Зарегистрировать](https://yookassa.ru/oauth/v2/client/create)
+4. Заполнить поля:\
+   4.1. "Название" - `required` поле, отображается при выдаче прав и в списке приложений.\
+   4.2. "Описание" - `optional` поле, отображается у пользователя в списке приложений.\
+   4.3. "Ссылка на сайт приложения" - `optional` поле, отображается у пользователя в списке приложений.\
+   4.4. "Код подтверждения" - выбрать `Передавать в Callback URL`, можно указывать любое значение, например ссылку на сайт.
+5. Выбрать доступы:\
+   5.1. `Кошелёк ЮMoney` -> `Просмотр`\
+   5.2. `Профиль ЮMoney` -> `Просмотр`
+6. Нажать `Зарегистрировать`
+
+#### Передать `client id` в параметре `moneyAuthClientId`
+
+При создании `TokenizationModuleInputData` передать `client id` в параметре `moneyAuthClientId`
+
+```swift
+let moduleData = TokenizationModuleInputData(
+    ...
+    moneyAuthClientId: "client_id")
+```
+
+Чтобы провести платеж:
+
+1. При создании `TokenizationModuleInputData` передайте значение `.yooMoney` в `paymentMethodTypes.`
+2. Получите токен.
+3. [Создайте платеж](https://yookassa.ru/developers/api#create_payment) с токеном по API ЮKassa.
+
+#### Поддержка авторизации через мобильное приложение
+
+1. В `TokenizationModuleInputData` необходимо передавать `applicationScheme` – схема для возврата в приложение после успешной авторизации в `ЮMoney` через мобильное приложение.
+
+Пример `applicationScheme`:
+
+```swift
+let moduleData = TokenizationModuleInputData(
+    ...
+    applicationScheme: "examplescheme://"
+```
+
+2. В `AppDelegate` импортировать зависимость `YooKassaPayments`:
+
+   ```swift
+   import YooKassaPayments
+   ```
+
+3. Добавить обработку ссылок через `YKSdk` в `AppDelegate`:
+
+```swift
+func application(
+    _ application: UIApplication,
+    open url: URL,
+    sourceApplication: String?, 
+    annotation: Any
+) -> Bool {
+    return YKSdk.shared.handleOpen(
+        url: url,
+        sourceApplication: sourceApplication
+    )
+}
+
+4. В `Info.plist` добавьте следующие строки:
+
+```plistbase
+<key>LSApplicationQueriesSchemes</key>
+<array>
+    <string>yoomoneyauth</string>
+</array>
+<key>CFBundleURLTypes</key>
+<array>
+    <dict>
+        <key>CFBundleTypeRole</key>
+        <string>Editor</string>
+        <key>CFBundleURLName</key>
+        <string>${BUNDLE_ID}</string>
+        <key>CFBundleURLSchemes</key>
+        <array>
+            <string>examplescheme</string>
+        </array>
+    </dict>
+</array>
+```
+
+где `examplescheme` - схема для открытия вашего приложения, которую вы указали в `applicationScheme` при создании `TokenizationModuleInputData`. Через эту схему будет открываться ваше приложение после успешной авторизации в `ЮMoney` через мобильное приложение.
+
+### Банковская карта
+
+1. При создании `TokenizationModuleInputData` в `TokenizationSettings` передайте значение `PaymentMethodTypes.bankCard`.
+2. Получите токен.
+3. [Создайте платеж](https://yookassa.ru/developers/api#create_payment) с токеном по API ЮKassa.
+
+### SberPay (iOS)
+
+С помощью SDK можно провести и подтвердить платеж через актуальное приложение Сбера, если оно установленно.
+
+#### Обратите внимание
+Для работы SberPay требуется уникальная URL-scheme зарегистрированная в системе Сбера. Запросите такую схему у нашего менеджера поддержки по адресу b2b_support@yoomoney.ru.
+
+Полученную от поддержки схему нужно зарегистрировать в файле вашего проекта, как показано ниже:
+<img src="assets/images/sberpay-reg-url-scheme.png" width="70%">
+
+А также передайте ее в `TokenizationModuleInputData` в параметре `applicationScheme`.
+
+```dart
+var tokenizationModuleInputData = TokenizationModuleInputData(
+    ...
+    applicationScheme: "sdkvzcyfyexmpl://"
+```
+
+Чтобы провести платёж:
+
+1. При создании `TokenizationModuleInputData` передайте значение `.sberbank` в `paymentMethodTypes`.
+2. Получите токен.
+3. [Создайте платеж](https://yookassa.ru/developers/api#create_payment) с токеном по API ЮKassa.
+
+Для подтверждения платежа через приложение Сбербанка:
+
+1. В `AppDelegate` импортируйте зависимость `YooKassaPayments`:
+
+   ```swift
+   import YooKassaPayments
+   ```
+
+2. Добавьте обработку ссылок через `YKSdk` в `AppDelegate`:
+
+```swift
+func application(
+    _ application: UIApplication,
+    open url: URL,
+    sourceApplication: String?,
+    annotation: Any
+) -> Bool {
+    return YKSdk.shared.handleOpen(
+        url: url,
+        sourceApplication: sourceApplication
+    )
+}
+```
+
+3. В `Info.plist` добавьте следующие строки:
+
+```plistbase
+<key>CFBundleURLTypes</key>
+<array>
+    <dict>
+        <key>CFBundleTypeRole</key>
+        <string>Editor</string>
+        <key>CFBundleURLName</key>
+        <string>${BUNDLE_ID}</string>
+        <key>CFBundleURLSchemes</key>
+        <array>
+            <string>examplescheme</string>
+        </array>
+    </dict>
+</array>
+```
+
+где `examplescheme` - схема для открытия вашего приложения, которую вы указали в `applicationScheme` при создании `TokenizationModuleInputData`. Через эту схему будет открываться ваше приложение после успешной авторизации с помощью `SberPay`.
+
+4. Добавить в `Info.plist` расширенные настройки для https-соединений к сервисам Сбера
+
+```
+<key>NSAppTransportSecurity</key>
+<dict>
+    <key>NSExceptionDomains</key>
+    <dict>
+    <key>gate1.spaymentsplus.ru</key>
+    <dict>
+       <key>NSExceptionAllowsInsecureHTTPLoads</key>
+       <true/>
+    </dict>
+    <key>ift.gate2.spaymentsplus.ru</key>
+    <dict>
+       <key>NSExceptionAllowsInsecureHTTPLoads</key>
+       <true/>
+    </dict>
+    <key>cms-res.online.sberbank.ru</key>
+       <dict>
+           <key>NSExceptionAllowsInsecureHTTPLoads</key>
+           <true/>
+       </dict>
+    </dict>
+</dict>
+```
+
+также, возникает требование расширить доступ приложения к данным пользователя для обеспечения безопасности проведения платежей
+
+```
+<key>NSFaceIDUsageDescription</key>
+<string>Так вы подтвердите, что именно вы выполняете вход</string>
+<key>NSLocationWhenInUseUsageDescription</key>
+<string>Данные о местонахождении собираются и отправляются на сервер для безопасного проведения оплаты</string>
+```
+
+5. Обработайте результат выполнения `await YookassaPaymentsFlutter.confirmation`. Если в результате нет ошибки, значит процесс подтверждения будет пройден или пропущен пользователем. На следующем шаге для проверки статуса платежа (прошел ли пользователь подтверждение успешно или нет) используйте [YooKassa API](https://yookassa.ru/developers/api#get_payment)
+(см. [Настройка подтверждения платежа](#настройка-подтверждения-платежа)).
+
+### SberPay (Android)
+
+Для подтверждения платежа при оплате через SberPay необходимо:
+1. вызвать метод `await YookassaPaymentsFlutter.confirmation`;
+2. обработать полученный результат;
+
+Входные параметры для `await YookassaPaymentsFlutter.confirmation`:
+
+Обязательные параметры метода:
+- url (String) - URL для перехода на экран подтверждения платежа через SberPay;
+- paymentMethod (PaymentMethodType) - выбранный тип платежного метода (тот, что был получен в методе `createTokenizationResult()`, (см. [Получить результат токенизации](#получить-результат-токенизации)) .
+- clientApplicationKey - ключ для клиентских приложений из личного кабинета ЮKassa ([раздел Настройки — Ключи API](https://yookassa.ru/my/api-keys-settings))
+- shopId - идентификатор магазина ЮKassa ([раздел Организации](https://yookassa.ru/my/company/organization)
+
+Возможные типы результата проведения подтверждения через SberPay:
+
+- Activity.RESULT_OK - сообщает о том, что процесс подтверждения через SberPay завершён, но не несет информацию о том, что процесс завершился успешно. После получения результата рекомендуется запросить статус платежа;
+- Activity.RESULT_CANCELED - прохождение подтверждения через SberPay было отменено (например, пользователь нажал на кнопку "назад" во время процесса);
+- Checkout.RESULT_ERROR - не удалось пройти подтверждение через SberPay.
+
+**Запуск SberPay и получение результата**
+
+<details open>
+
+```dart
+var res = await YookassaPaymentsFlutter.confirmation(
+    controller.text,
+    result.paymentMethodType,
+    config.clientApplicationKey,
+    config.shopId
+);
+showDialog(
+    context: context,
+    builder: (context) => const AlertDialog(content: Text("Confirmation process is done"))
+);
+```
+**Запрос разрешений**
+
+Для работы SberPaySDK также запрашивает определенные разрешения, которые **не являются обязательными**, но повышают шанс успешной оплаты. Актуальный список разрешений [по ссылке](https://developers.sber.ru/docs/ru/sberpay-sdk/androidsdk/start-sdk#zapros-razresheniy)
+
+```xml
+<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+<uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES" />
+<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
+```
+
+### SBP
+
+С помощью SDK можно провести платеж через СБП — с подтверждением оплаты через приложение банка.
+
+В `TokenizationModuleInputData` необходимо передавать `applicationScheme` – схема для возврата в ваше приложение после успешного подтверждения платежа в приложении банка.
+
+Пример `applicationScheme`:
+
+```swift
+let moduleData = TokenizationModuleInputData(
+    ...
+    applicationScheme: "examplescheme://"
+```
+
+Чтобы провести платёж:
+
+1. При создании `TokenizationModuleInputData` в `TokenizationSettings` передайте значение `PaymentMethodTypes.sbp`.
+2. Получите токен.
+3. [Создайте платеж](https://yookassa.ru/developers/api#create_payment) с токеном по API ЮKassa.
+
+Для подтверждения платежа через выбранное пользователем банковское приложение:
+
+1. В `AppDelegate` импортируйте зависимость `YooKassaPayments`:
+
+   ```swift
+   import YooKassaPayments
+   ```
+
+2. Добавьте обработку ссылок через `YKSdk` в `AppDelegate`:
+
+```swift
+func application(
+    _ application: UIApplication,
+    open url: URL,
+    sourceApplication: String?, 
+    annotation: Any
+) -> Bool {
+    return YKSdk.shared.handleOpen(
+        url: url,
+        sourceApplication: sourceApplication
+    )
+}
+```
+
+3. В `Info.plist` добавьте следующие строки:
+
+```plistbase
+<key>CFBundleURLTypes</key>
+<array>
+    <dict>
+        <key>CFBundleTypeRole</key>
+        <string>Editor</string>
+        <key>CFBundleURLName</key>
+        <string>${BUNDLE_ID}</string>
+        <key>CFBundleURLSchemes</key>
+        <array>
+            <string>examplescheme</string>
+        </array>
+    </dict>
+</array>
+```
+
+где `examplescheme` - схема для открытия вашего приложения, которую вы указали в `applicationScheme` при создании `TokenizationModuleInputData`. Через эту схему будет открываться ваше приложение после успешной оплаты с помощью `SberPay`.
+
+4. Добавьте уникальную схему в `build.gradle`
+Для добавления уникальной схемы диплинка нужно добавить в ваш файл `build.gradle` в блок android.defaultConfig строку `resValue "string", "ym_app_scheme", "exampleapp"`
+```
+android {
+    defaultConfig {
+        resValue "string", "ym_app_scheme", "exampleapp"
+    }
+}
+```
+Или добавить в ваш strings.xml строку вида:
+```
+<resources>
+    <string name="ym_app_scheme" translatable="false">exampleapp</string>
+</resources>
+```
+Где `exampleapp` - это уникальная схема диплинка вашего приложения.
+
+5. Для подтверждения платежа при оплате через СБП необходимо запустить сценарий подтверждения:
+
+```dart
+var clientApplicationKey = "<Ключ для клиентских приложений>";
+var shopId = "<Идентификатор магазина в ЮKassa)>";
+
+await YookassaPaymentsFlutter.confirmation(confirmationUrl, PaymentMethod.sbp, clientApplicationKey, shopId);
+)
+```
+`confirmationUrl` вы получите в ответе от API ЮKassa при [создании платежа](https://yookassa.ru/developers/api#create_payment); он имеет вид   "https://qr.nspk.ru/id?type=&bank=&sum=&cur=&crc=&payment_id="
+
+6. После того, как пользователь пройдет процесс подтверждения платежа или пропустит его будет вызван метод протокола `TokenizationModuleOutput`. Обработайте в нем результат подтверждения:
+
+```swift
+func didFinishConfirmation(paymentMethodType: PaymentMethodType) {
+    guard let result = flutterResult else { return }
+    DispatchQueue.main.async { [weak self] in
+        if let controller = yoomoneyController {
+            controller.dismiss(animated: true)
+        }
+    }
+    result("{\"paymentMethodType\": \"\(paymentMethodType.rawValue)\"}")
+}
+```
+
+## Описание публичных параметров
+
+### TokenizationModuleInputData
+
+>Обязательные:
+
+| Параметр             | Тип    | Описание |
+| -------------------- | ------ | -------- |
+| clientApplicationKey | String            | Ключ для клиентских приложений из личного кабинета ЮKassa |
+| title                | String            | Название магазина в форме оплаты |
+| subtitle             | String            | Описание заказа в форме оплаты |
+| amount               | Amount            | Объект, содержащий сумму заказа и валюту |
+| shopId               | String            | Идентификатор магазина в ЮKassa ([раздел Организации](https://yookassa.ru/my/company/organization) - скопировать shopId у нужного магазина) |
+| savePaymentMethod    | SavePaymentMethod | Объект, описывающий логику того, будет ли платеж рекуррентным |
+
+>Необязательные:
+
+| Параметр                   | Тип                   | Описание                                                     |
+| -------------------------- | --------------------- | ------------------------------------------------------------ |
+| gatewayId                  | String                | По умолчанию `null`. Используется, если у вас несколько платежных шлюзов с разными идентификаторами. |
+| tokenizationSettings       | TokenizationSettings  | По умолчанию используется стандартный инициализатор со всеми способами оплаты. Параметр отвечает за настройку токенизации (способы оплаты и логотип ЮKassa). |
+| testModeSettings           | TestModeSettings      | По умолчанию `null`. Настройки тестового режима.              |
+| cardScanning               | CardScanning          | По умолчанию `null`. Возможность сканировать банковские карты. |
+| applePayMerchantIdentifier | String                | По умолчанию `null`. Apple Pay merchant ID (обязательно для платежей через Apple Pay). |
+| returnUrl                  | String                | По умолчанию `null`. URL страницы (поддерживается только `https`), на которую надо вернуться после прохождения 3-D Secure. Необходим только при кастомной реализации 3-D Secure. Если вы используете `startConfirmationProcess(confirmationUrl:paymentMethodType:)`, не задавайте этот параметр. |
+| isLoggingEnabled           | Bool                  | По умолчанию `false`. Включает логирование сетевых запросов. |
+| userPhoneNumber            | String                | По умолчанию `null`. Телефонный номер пользователя.           |
+| customizationSettings      | CustomizationSettings | По умолчанию используется цвет blueRibbon. Цвет основных элементов, кнопки, переключатели, поля ввода. |
+| moneyAuthClientId          | String                | По умолчанию `null`. Идентификатор для центра авторизации в системе YooMoney. |
+| applicationScheme          | String                | По умолчанию `null`. Схема для возврата в приложение после успешной оплаты с помощью `Sberpay` в приложении СберБанк Онлайн или после успешной авторизации в `YooMoney` через мобильное приложение. |
+| customerId                      | String                 | По умолчанию `null`. Уникальный идентификатор покупателя в вашей системе, например электронная почта или номер телефона. Не более 200 символов. Используется, если вы хотите запомнить банковскую карту и отобразить ее при повторном платеже в mSdk. Убедитесь, что customerId относится к пользователю, который хочет совершить покупку. Например, используйте двухфакторную аутентификацию. Если передать неверный идентификатор, пользователь сможет выбрать для оплаты чужие банковские карты.|
+| googlePayParameters        | GooglePayParameters   | По умолчанию поддерживает mastercard и visa. Настройки для платежей через Google Pay. |
+
+### SavedBankCardModuleInputData
+
+>Обязательные:
+
+| Параметр             | Тип    | Описание |
+| -------------------- | ------ | -------- |
+| clientApplicationKey | String | Ключ для клиентских приложений из личного кабинета ЮKassa |
+| title                | String | Название магазина в форме оплаты |
+| subtitle             | String | Описание заказа в форме оплаты |
+| paymentMethodId      | String | Идентификатор сохраненного способа оплаты |
+| amount               | Amount | Объект, содержащий сумму заказа и валюту |
+| shopId               | String            | Идентификатор магазина в ЮKassa ([раздел Организации](https://yookassa.ru/my/company/organization) - скопировать shopId у нужного магазина) |
+| savePaymentMethod    | SavePaymentMethod | Объект, описывающий логику того, будет ли платеж рекуррентным |
+
+>Необязательные:
+
+| Параметр              | Тип                   | Описание                                                     |
+| --------------------- | --------------------- | ------------------------------------------------------------ |
+| gatewayId             | String                | По умолчанию `null`. Используется, если у вас несколько платежных шлюзов с разными идентификаторами. |
+| testModeSettings      | TestModeSettings      | По умолчанию `null`. Настройки тестового режима.              |
+| returnUrl             | String                | По умолчанию `null`. URL страницы (поддерживается только `https`), на которую надо вернуться после прохождения 3-D Secure. Необходим только при кастомной реализации 3-D Secure. Если вы используете `startConfirmationProcess(confirmationUrl:paymentMethodType:)`, не задавайте этот параметр. |
+| isLoggingEnabled      | Bool                  | По умолчанию `false`. Включает логирование сетевых запросов. |
+| customizationSettings | CustomizationSettings | По умолчанию используется цвет Color.fromARGB(255, 0, 112, 240). Цвет основных элементов, кнопки, переключатели, поля ввода. |
+
+### TokenizationSettings
+
+Можно настроить список способов оплаты и отображение логотипа ЮKassa в приложении.
+
+| Параметр               | Тип                | Описание |
+| ---------------------- | ------------------ | -------- |
+| paymentMethodTypes     | PaymentMethodTypes | По умолчанию `PaymentMethodTypes.all`. [Способы оплаты](#настройка-способов-оплаты), доступные пользователю в приложении. |
+| showYooKassaLogo       | Bool               | По умолчанию `true`. Отвечает за отображение логотипа ЮKassa. По умолчанию логотип отображается. |
+
+### TestModeSettings
+
+| Параметр                   | Тип    | Описание |
+| -------------------------- | ------ | -------- |
+| paymentAuthorizationPassed | Bool   | Определяет, пройдена ли платежная авторизация при оплате ЮMoney. |
+| cardsCount                 | Int    | Количество привязанные карт к кошельку в ЮMoney. |
+| charge                     | Amount | Сумма и валюта платежа. |
+| enablePaymentError         | Bool   | Определяет, будет ли платеж завершен с ошибкой. |
+
+### Amount
+
+| Параметр | Тип      | Описание |
+| -------- |----------| -------- |
+| value    | String   | Сумма платежа |
+| currency | Currency | Валюта платежа |
+
+### Currency
+
+| Параметр            | Тип      | Описание |
+| --------            | -------- | -------- |
+| Currency.rub        | String   | ₽ - Российский рубль |
+| Currency.usd        | String   | $ - Американский доллар |
+| Currency.eur        | String   | € - Евро |
+| Currency(“custom”)  | String   | Будет отображаться значение, которое передали |
+
+### CustomizationSettings
+
+| Параметр   | Тип     | Описание |
+| ---------- | ------- | -------- |
+| mainScheme | Color | По умолчанию используется цвет Color.fromARGB(255, 0, 112, 240). Цвет основных элементов, кнопки, переключатели, поля ввода. |
+
+### SavePaymentMethod
+
+| Параметр                      | Тип               | Описание |
+| -----------                   | ----------------- | -------- |
+| SavePaymentMethod.on          | SavePaymentMethod | Сохранить платёжный метод для проведения рекуррентных платежей. Пользователю будут доступны только способы оплаты, поддерживающие сохранение. На экране контракта будет отображено сообщение о том, что платёжный метод будет сохранён. |
+| SavePaymentMethod.off         | SavePaymentMethod | Не дает пользователю выбрать, сохранять способ оплаты или нет. |
+| SavePaymentMethod.userSelects | SavePaymentMethod | Пользователь выбирает, сохранять платёжный метод или нет. Если метод можно сохранить, на экране контракта появится переключатель. |
+
+## Настройка подтверждения платежа
+
+Если вы хотите использовать нашу реализацию подтверждения платежа, не закрывайте модуль SDK после получения токена.\
+Отправьте токен на ваш сервер и после успешной оплаты закройте модуль.\
+Если ваш сервер сообщил о необходимости подтверждения платежа (т.е. платёж пришёл со статусом `pending`), вызовите метод `confirmation(confirmationUrl, paymentMethodType, clientApplicationKey, shopId)`.
+
+Пример кода:
+
+```dart
+var clientApplicationKey = "<Ключ для клиентских приложений>";
+var shopId = "<Идентификатор магазина в ЮKassa)>";
+
+await YookassaPaymentsFlutter.confirmation(confirmationUrl, PaymentMethod.sbp, clientApplicationKey, shopId);
+)
+```
+
+Если тип платежа - СБП необходимо также передать clientApplicationKey - Ключ для клиентских приложений из личного кабинета ЮKassa
+
+Пример кода:
+
+```dart
+
+var clientApplicationKey = "<Ключ для клиентских приложений>";
+var shopId = "<Идентификатор магазина в ЮKassa)>";
+
+await YookassaPaymentsFlutter.confirmation(confirmationUrl, result.paymentMethodType, clientApplicationKey, shopId);
+)
+```
+`confirmationUrl` вы получите в ответе от API ЮKassa при [создании платежа](https://yookassa.ru/developers/api#create_payment); он имеет вид   "https://qr.nspk.ru/id?type=&bank=&sum=&cur=&crc=&payment_id="
+
+После того, как пользователь пройдет процесс подтверждения платежа или пропустит его будет вызван метод протокола `TokenizationModuleOutput`. Обработайте в нем результат подтверждения:
+
+```swift
+func didFinishConfirmation(paymentMethodType: PaymentMethodType) {
+    guard let result = flutterResult else { return }
+    DispatchQueue.main.async { [weak self] in
+        if let controller = yoomoneyController {
+            controller.dismiss(animated: true)
+        }
+    }
+    result("{\"paymentMethodType\": \"\(paymentMethodType.rawValue)\"}")
+}
+```
+
+## Логирование
+
+У вас есть возможность включить логирование всех сетевых запросов.\
+Для этого необходимо при создании `TokenizationModuleInputData` передать `isLoggingEnabled: true`
+
+## Тестовый режим
+
+У вас есть возможность запустить мобильный SDK в тестовом режиме.\
+Тестовый режим не выполняет никаких сетевых запросов и имитирует ответ от сервера.
+
+Если вы хотите запустить SDK в тестовом режиме, необходимо:
+
+1. Сконфигурировать объект с типом `TestModeSettings(paymentAuthorizationPassed, cardsCount, charge, enablePaymentError)`.
+
+```dart
+var testModeSettings = TestModeSettings(true, 5, Amount(value: "999", currency: Currency.rub), false);
+```
+
+2. Передать его в `TokenizationModuleInputData` в параметре `testModeSettings:`
+
+```dart
+var tokenizationModuleInputData = TokenizationModuleInputData(
+    ...
+    testModeSettings: testModeSettings);
+```
+
+## Кастомизация интерфейса
+
+По умолчанию используется цвет Color.fromARGB(255, 0, 112, 240). Цвет основных элементов, кнопки, переключатели, поля ввода.
+
+1. Сконфигурировать объект `CustomizationSettings` и передать его в параметр `customizationSettings` объекта `TokenizationModuleInputData`.
+
+```dart
+var tokenizationModuleInputData = TokenizationModuleInputData(
+    ...
+   customizationSettings: const CustomizationSettings(Colors.black));
+```
+
+## Платёж привязанной к магазину картой с дозапросом CVC/CVV
+
+1. Создайте `SavedBankCardModuleInputData`.
+
+```dart
+var savedBankCardModuleInputData = SavedBankCardModuleInputData(
+    clientApplicationKey: clientApplicationKey,
+    title: "Космические объекты",
+    subtitle: "Комета повышенной яркости, период обращения — 112 лет",
+    amount: amount,
+    savePaymentMethod: SavePaymentMethod.on,
+    shopId: shopId,
+    paymentMethodId: paymentMethodId
+);
+```
+
+2. Запустите процесс с кейсом `.bankCardRepeat` и передайте `SavedBankCardModuleInputData`.
+
+```dart
+var result = await YookassaPaymentsFlutter.bankCardRepeat(savedBankCardModuleInputData);
+```
+
+3. Получите token в `TokenizationResult`
+
+## FAQ
+
+1. В iOS в виджете  для ввода реквизитов банковской карты часть полей отображается на русском, а часть на английском языке. Есть какая-то возможность настроить работу виджета так, чтобы надписи отображались на установленном в iOS языке?
+
+Да. Настройте правильно ключи локализации для флаттер проекта. Например en и ru_RU. Подробнее описано здесь https://localizely.com/i18n-questions/flutter/why-flutter-localization-does-not-work-on-ios-platform/
+
+## Лицензия
+
+YooKassa Payments SDK доступна под лицензией MIT. Смотрите [LICENSE](https://git.yoomoney.ru/projects/SDK/repos/yookassa-payments-swift/browse/LICENSE) файл для получения дополнительной информации.

+ 4 - 0
analysis_options.yaml

@@ -0,0 +1,4 @@
+include: package:flutter_lints/flutter.yaml
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options

+ 8 - 0
android/.gitignore

@@ -0,0 +1,8 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures

+ 49 - 0
android/build.gradle

@@ -0,0 +1,49 @@
+plugins {
+    id "com.android.library"
+    id "kotlin-android"
+}
+
+group 'ru.yoomoney.sdk.kassa.payments.flutter'
+
+rootProject.allprojects {
+    repositories {
+        google()
+        mavenCentral()
+    }
+}
+
+android {
+    namespace "ru.yoomoney.sdk.kassa.payments.flutter"
+    compileSdkVersion 34
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_17
+        targetCompatibility JavaVersion.VERSION_17
+    }
+
+    kotlinOptions {
+        jvmTarget = '17'
+    }
+
+    sourceSets {
+        main.java.srcDirs += 'src/main/kotlin'
+    }
+
+    defaultConfig {
+        minSdkVersion 24
+    }
+
+    buildTypes {
+        release {
+            signingConfig signingConfigs.debug
+        }
+    }
+}
+
+dependencies {
+    implementation 'ru.yoomoney.sdk.kassa.payments:yookassa-android-sdk:7.1.0'
+}
+
+configurations.implementation {
+    exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
+}

+ 3 - 0
android/gradle.properties

@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx4096M
+android.useAndroidX=true
+android.enableJetifier=true

+ 5 - 0
android/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://nexus.yooteam.ru/content/repositories/http-proxy-services.gradle.org/distributions/gradle-8.5-all.zip

+ 6 - 0
android/settings.gradle

@@ -0,0 +1,6 @@
+plugins {
+    id "com.android.library" version "8.2.2" apply false
+    id "org.jetbrains.kotlin.android" version "1.9.22" apply false
+}
+
+rootProject.name = 'yookassa_payments_flutter'

+ 8 - 0
android/src/main/AndroidManifest.xml

@@ -0,0 +1,8 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <queries>
+        <package android:name="ru.sberbankmobile_alpha" />
+        <package android:name="ru.yoo.money.debug" />
+    </queries>
+
+</manifest>

+ 19 - 0
android/src/main/kotlin/ru/yoomoney/sdk/kassa/payments/flutter/TokenizationResultExtensions.kt

@@ -0,0 +1,19 @@
+package ru.yoomoney.sdk.kassa.payments.flutter
+
+import ru.yoomoney.sdk.kassa.payments.TokenizationResult
+import org.json.JSONObject
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.PaymentMethodType
+
+fun TokenizationResult.toJson(): String {
+    val json = JSONObject()
+    json.put("status", "success")
+    json.put("paymentToken", paymentToken)
+    json.put("paymentMethodType", when(paymentMethodType) {
+        PaymentMethodType.YOO_MONEY -> "yoo_money"
+        PaymentMethodType.BANK_CARD -> "bank_card"
+        PaymentMethodType.SBERBANK -> "sberbank"
+        PaymentMethodType.GOOGLE_PAY -> "google_pay"
+        PaymentMethodType.SBP -> "sbp"
+    })
+    return json.toString()
+}

+ 314 - 0
android/src/main/kotlin/ru/yoomoney/sdk/kassa/payments/flutter/YookassaPaymentsFlutterPlugin.kt

@@ -0,0 +1,314 @@
+package ru.yoomoney.sdk.kassa.payments.flutter
+
+import android.graphics.Color;
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Toast
+import androidx.annotation.NonNull
+import io.flutter.embedding.android.FlutterActivity
+import io.flutter.embedding.engine.FlutterEngine
+import io.flutter.embedding.engine.plugins.FlutterPlugin
+import io.flutter.plugin.common.MethodCall
+import io.flutter.plugin.common.MethodChannel
+import io.flutter.plugin.common.MethodChannel.MethodCallHandler
+import io.flutter.plugin.common.MethodChannel.Result
+import io.flutter.plugin.common.PluginRegistry
+import io.flutter.plugin.common.PluginRegistry.Registrar
+import io.flutter.embedding.engine.plugins.activity.ActivityAware
+import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
+import java.io.StringReader
+import java.math.BigDecimal
+import java.util.Currency
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.Amount
+import ru.yoomoney.sdk.kassa.payments.Checkout
+import ru.yoomoney.sdk.kassa.payments.ui.color.ColorScheme
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.HostParameters;
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.GooglePayParameters
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.GooglePayCardNetwork
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.MockConfiguration
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.PaymentMethodType
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.SavePaymentMethod
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.PaymentParameters
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.SavedBankCardPaymentParameters
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.TestParameters
+import ru.yoomoney.sdk.kassa.payments.TokenizationResult
+import ru.yoomoney.sdk.kassa.payments.checkoutParameters.UiParameters
+
+private const val CANCELED_RESULT = "{\"status\":\"canceled\"}"
+private const val ERROR_RESULT = "{\"status\":\"error\"}"
+
+class YookassaPaymentsFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware, PluginRegistry.ActivityResultListener  {
+
+  private lateinit var flutterResult: Result
+  private lateinit var channel : MethodChannel
+  private lateinit var context: Context
+  private lateinit var activity: Activity
+  private var binding: ActivityPluginBinding? = null
+
+  private val REQUEST_CODE_TOKENIZE = 33
+  private val REQUEST_CODE_CONFIRMATION = 44
+
+  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
+    channel = MethodChannel(flutterPluginBinding.binaryMessenger, "ru.yoomoney.yookassa_payments_flutter/yoomoney")
+    channel.setMethodCallHandler(this)
+    context = flutterPluginBinding.applicationContext
+  }
+
+  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
+    flutterResult = result
+
+    val data: HashMap<String, Object> = call.arguments as HashMap<String, Object>
+
+    when (call.method) {
+      "tokenization" -> tokenization(data)
+      "confirmation" -> confirmation(data)
+      "repeat" -> repeat(data)
+    }
+  }
+
+  fun confirmation(data: HashMap<String, Object>) {
+    val paymentMethod = when (data["paymentMethod"] as String) {
+      "bankCard" -> PaymentMethodType.BANK_CARD
+      "yooMoney" -> PaymentMethodType.YOO_MONEY
+      "sberbank" -> PaymentMethodType.SBERBANK
+      "googlePay" -> PaymentMethodType.GOOGLE_PAY
+      "sbp" -> PaymentMethodType.SBP
+      else -> PaymentMethodType.BANK_CARD
+    }
+
+    val url = data["url"] as String
+    val clientApplicationKey = data["clientApplicationKey"] as String
+    val shopId = data["shopId"] as String
+
+    val intent: Intent = Checkout.createConfirmationIntent(
+      context = context,
+      confirmationUrl = url,
+      clientApplicationKey = clientApplicationKey,
+      paymentMethodType = paymentMethod,
+      shopId = shopId
+    )
+
+    activity.startActivityForResult(intent, REQUEST_CODE_CONFIRMATION)
+  }
+
+  fun repeat(data: HashMap<String, Object>) {
+    val showLogs = data["isLoggingEnabled"] as Boolean
+    val mockConfiguration: MockConfiguration? = MockConfiguration(data)
+    val uiParameters = UiParameters(data)
+    var hostParameters = HostParameters(data)
+    val testParameters = TestParameters(
+      showLogs = showLogs,
+      mockConfiguration = mockConfiguration,
+      hostParameters = hostParameters
+    )
+
+    val parameters = SavedBankCardPaymentParameters(data)
+
+    val intent = Checkout.createSavedCardTokenizeIntent(context, parameters, testParameters)
+    activity.startActivityForResult(intent, REQUEST_CODE_TOKENIZE)
+  }
+
+  fun tokenization(data: HashMap<String, Object>) {
+    val showLogs = data["isLoggingEnabled"] as Boolean
+    val mockConfiguration: MockConfiguration? = MockConfiguration(data)
+    val uiParameters = UiParameters(data)
+    var hostParameters = HostParameters(data)
+    val googlePayTestEnvironment = data["googlePayTestEnvironment"] as Boolean
+    val testParameters = TestParameters(
+      showLogs = showLogs,
+      googlePayTestEnvironment = googlePayTestEnvironment,
+      mockConfiguration = mockConfiguration,
+      hostParameters = hostParameters
+    )
+
+    val paymentParameters = PaymentParameters(data)
+
+    val intent = Checkout.createTokenizeIntent(context, paymentParameters, testParameters, uiParameters)
+    activity.startActivityForResult(intent, REQUEST_CODE_TOKENIZE)
+  }
+
+  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean {
+    if (requestCode == REQUEST_CODE_TOKENIZE) {
+      if (resultCode == Activity.RESULT_CANCELED) {
+        flutterResult.success(CANCELED_RESULT)
+      } else if (resultCode == Activity.RESULT_OK && data != null) {
+        val result: TokenizationResult = Checkout.createTokenizationResult(data);
+        flutterResult.success(result.toJson())
+      } else {
+        flutterResult.success(ERROR_RESULT)
+      }
+    } else if (requestCode == REQUEST_CODE_CONFIRMATION) {
+      flutterResult.success(resultCode)
+    }
+
+    return false
+  }
+
+  override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
+    channel.setMethodCallHandler(null)
+  }
+
+  override fun onAttachedToActivity(binding: ActivityPluginBinding) {
+    activity = binding.activity
+    binding.addActivityResultListener(this)
+    this.binding = binding
+  }
+
+  override fun onDetachedFromActivity() {
+    binding?.removeActivityResultListener(this)
+    binding = null
+  }
+
+  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
+    this.binding?.removeActivityResultListener(this)
+    this.binding = binding
+    binding.addActivityResultListener(this)
+  }
+
+  override fun onDetachedFromActivityForConfigChanges() {
+    binding?.removeActivityResultListener(this)
+    binding = null
+  }
+}
+
+private fun PaymentParameters(data: Map<String, Object>): PaymentParameters {
+  val amountMap: HashMap<String, Object> = data["amount"] as HashMap<String, Object>
+  val amount = Amount(BigDecimal(amountMap["value"] as String), Currency.getInstance(amountMap["currency"] as String))
+
+  val clientApplicationKey = data["clientApplicationKey"] as String
+  val title = data["title"] as String
+  val subtitle = data["subtitle"] as String
+  val shopId = data["shopId"] as String
+  val authCenterClientId = data["moneyAuthClientId"] as? String
+  val gatewayId = data["gatewayId"] as? String
+  val userPhoneNumber = data["userPhoneNumber"] as? String
+  val customReturnUrl = data["returnUrl"] as? String
+  val applicationScheme = data["applicationScheme"] as? String
+  val customerId = data["customerId"] as? String
+  val savePaymentMethod: SavePaymentMethod = SavePaymentMethod(data)
+  val paymentMethodTypes = PaymentMethodType(data)
+  val googlePayParameters = GooglePayParameters(data)
+
+  return PaymentParameters(
+    amount = amount,
+    title = title,
+    subtitle = subtitle,
+    clientApplicationKey = clientApplicationKey,
+    shopId = shopId,
+    customerId = customerId,
+    savePaymentMethod = savePaymentMethod,
+    authCenterClientId = authCenterClientId,
+    gatewayId = gatewayId,
+    userPhoneNumber = userPhoneNumber,
+    customReturnUrl = customReturnUrl,
+    paymentMethodTypes = paymentMethodTypes,
+    googlePayParameters = googlePayParameters
+  )
+}
+
+private fun PaymentMethodType(data: Map<String, Object>): Set<PaymentMethodType> {
+  val flutterPaymentMethodTypes = (data["tokenizationSettings"] as HashMap<String, Object>)["paymentMethodTypes"] as ArrayList<String>
+  val paymentMethodTypes: MutableSet<PaymentMethodType> = mutableSetOf()
+
+  for(type in flutterPaymentMethodTypes){
+    when (type) {
+      "PaymentMethod.bankCard" -> paymentMethodTypes.add(PaymentMethodType.BANK_CARD)
+      "PaymentMethod.yooMoney" -> paymentMethodTypes.add(PaymentMethodType.YOO_MONEY)
+      "PaymentMethod.sberbank" -> paymentMethodTypes.add(PaymentMethodType.SBERBANK)
+      "PaymentMethod.googlePay" -> paymentMethodTypes.add(PaymentMethodType.GOOGLE_PAY)
+      "PaymentMethod.sbp" -> paymentMethodTypes.add(PaymentMethodType.SBP)
+    }
+  }
+  return paymentMethodTypes
+}
+
+private fun GooglePayParameters(data: Map<String, Object>): GooglePayParameters {
+  val flutterGooglePayParameters = data["googlePayParameters"] as ArrayList<String>
+  val googlePayParameters: MutableSet<GooglePayCardNetwork> = mutableSetOf()
+
+  for(type in flutterGooglePayParameters){
+    when (type) {
+      "GooglePayCardNetwork.AMEX" -> googlePayParameters.add(GooglePayCardNetwork.AMEX)
+      "GooglePayCardNetwork.DISCOVER" -> googlePayParameters.add(GooglePayCardNetwork.DISCOVER)
+      "GooglePayCardNetwork.JCB" -> googlePayParameters.add(GooglePayCardNetwork.JCB)
+      "GooglePayCardNetwork.MASTERCARD" -> googlePayParameters.add(GooglePayCardNetwork.MASTERCARD)
+      "GooglePayCardNetwork.VISA" -> googlePayParameters.add(GooglePayCardNetwork.VISA)
+      "GooglePayCardNetwork.INTERAC" -> googlePayParameters.add(GooglePayCardNetwork.INTERAC)
+      "GooglePayCardNetwork.OTHER" -> googlePayParameters.add(GooglePayCardNetwork.OTHER)
+    }
+  }
+  return GooglePayParameters(googlePayParameters)
+}
+
+private fun SavedBankCardPaymentParameters(data: Map<String, Object>): SavedBankCardPaymentParameters {
+  val amountMap: HashMap<String, Object> = data["amount"] as HashMap<String, Object>
+  val amount = Amount(BigDecimal(amountMap["value"] as String), Currency.getInstance(amountMap["currency"] as String))
+  val title = data["title"] as String
+  val subtitle = data["subtitle"] as String
+  val clientApplicationKey = data["clientApplicationKey"] as String
+  val shopId = data["shopId"] as String
+  val paymentId = data["paymentMethodId"] as String
+  val savePaymentMethod: SavePaymentMethod = SavePaymentMethod(data)
+
+  return SavedBankCardPaymentParameters(
+    amount = amount,
+    title = title,
+    subtitle = subtitle,
+    clientApplicationKey = clientApplicationKey,
+    shopId = shopId,
+    paymentMethodId = paymentId,
+    savePaymentMethod = savePaymentMethod
+  )
+}
+
+private fun SavePaymentMethod(data: Map<String, Object>): SavePaymentMethod {
+  return when (data["savePaymentMethod"] as String) {
+    "SavePaymentMethod.on" -> SavePaymentMethod.ON
+    "SavePaymentMethod.off" -> SavePaymentMethod.OFF
+    else -> {
+      SavePaymentMethod.USER_SELECTS
+    }
+  }
+}
+
+private fun HostParameters(data: Map<String, Object>): HostParameters {
+  val hostParametersData = data["hostParameters"] as? HashMap<String, Object>
+  return if (hostParametersData != null) {
+    HostParameters(
+      hostParametersData["apiHost"] as String,
+      hostParametersData["paymentAuthApiHost"] as String,
+      hostParametersData["authApiHost"] as String,
+      hostParametersData["configHost"] as String,
+    )
+  } else {
+    HostParameters()
+  }
+}
+
+private fun UiParameters(data: Map<String, Object>): UiParameters {
+  val customizationSettings = data["customizationSettings"] as HashMap<String, Object>
+  val showLogo = customizationSettings["showYooKassaLogo"] as Boolean
+  val dataColor = customizationSettings["mainScheme"] as HashMap<String, Object>
+
+  val alpha = dataColor["alpha"] as Int
+  val red = dataColor["red"] as Int
+  val blue = dataColor["blue"] as Int
+  val green = dataColor["green"] as Int
+
+  return UiParameters(showLogo, ColorScheme(Color.argb(alpha, red, green, blue)))
+}
+
+private fun MockConfiguration(data: Map<String, Object>): MockConfiguration? {
+  val testModeSettings = data["testModeSettings"] as? HashMap<String, Object>
+  if (testModeSettings == null) return null
+
+  val paymentAuthPassed = testModeSettings["paymentAuthorizationPassed"] as Boolean
+  val completeWithError = testModeSettings["enablePaymentError"] as Boolean
+  val linkedCardsCount = testModeSettings["cardsCount"] as Int
+  val serviceFeeMap: HashMap<String, Object> = testModeSettings["charge"] as HashMap<String, Object>
+  val serviceFee = Amount(BigDecimal(serviceFeeMap["value"] as String), Currency.getInstance(serviceFeeMap["currency"] as String))
+
+  return MockConfiguration(completeWithError, paymentAuthPassed, linkedCardsCount, serviceFee)
+}

BIN
assets/images/sberpay-reg-url-scheme.png


+ 46 - 0
example/.gitignore

@@ -0,0 +1,46 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release

+ 10 - 0
example/.metadata

@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+  revision: 18116933e77adc82f80866c928266a5b4f1ed645
+  channel: stable
+
+project_type: app

+ 3 - 0
example/README.md

@@ -0,0 +1,3 @@
+# yookassa_payments_flutter_example
+
+Demonstrates how to use the yookassa_payments_flutter plugin.

+ 29 - 0
example/analysis_options.yaml

@@ -0,0 +1,29 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+  # The lint rules applied to this project can be customized in the
+  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+  # included above or to enable additional rules. A list of all available lints
+  # and their documentation is published at
+  # https://dart-lang.github.io/linter/lints/index.html.
+  #
+  # Instead of disabling a lint rule for the entire project in the
+  # section below, it can also be suppressed for a single line of code
+  # or a specific dart file by using the `// ignore: name_of_lint` and
+  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+  # producing the lint.
+  rules:
+    # avoid_print: false  # Uncomment to disable the `avoid_print` rule
+    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options

+ 13 - 0
example/android/.gitignore

@@ -0,0 +1,13 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
+**/*.keystore
+**/*.jks

+ 64 - 0
example/android/app/build.gradle

@@ -0,0 +1,64 @@
+plugins {
+    id "com.android.application"
+    id "kotlin-android"
+    id "dev.flutter.flutter-gradle-plugin"
+}
+
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+    localPropertiesFile.withReader('UTF-8') { reader ->
+        localProperties.load(reader)
+    }
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+    flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+    flutterVersionName = '1.0'
+}
+
+android {
+    namespace "ru.yoomoney.yookassa_payments_flutter_example"
+    compileSdkVersion 34
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_17
+        targetCompatibility JavaVersion.VERSION_17
+    }
+
+    kotlinOptions {
+        jvmTarget = '17'
+    }
+
+    sourceSets {
+        main.java.srcDirs += 'src/main/kotlin'
+    }
+
+    defaultConfig {
+        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+        applicationId "ru.yoomoney.yookassa_payments_flutter_example"
+        minSdkVersion 24
+        targetSdkVersion 34
+        versionCode flutterVersionCode.toInteger()
+        versionName flutterVersionName
+
+        resValue "string", "ym_app_scheme", "yookassapaymentsexample"
+    }
+
+    buildTypes {
+        release {
+            // TODO: Add your own signing config for the release build.
+            // Signing with the debug keys for now, so `flutter run --release` works.
+            signingConfig signingConfigs.debug
+        }
+    }
+}
+
+flutter {
+    source '../..'
+}

+ 47 - 0
example/android/app/src/main/AndroidManifest.xml

@@ -0,0 +1,47 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <uses-permission android:name="android.permission.INTERNET" />
+
+    <application
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:networkSecurityConfig="@xml/ym_network_security_config">
+        <activity
+            android:name=".MainActivity"
+            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
+            android:exported="true"
+            android:hardwareAccelerated="true"
+            android:launchMode="singleTop"
+            android:theme="@style/LaunchTheme"
+            android:windowSoftInputMode="adjustResize">
+            <!-- Specifies an Android theme to apply to this Activity as soon as
+                             the Android process has started. This theme is visible to the user
+                             while the Flutter UI initializes. After that, this theme continues
+                             to determine the Window background behind the Flutter UI. -->
+            <meta-data
+                android:name="io.flutter.embedding.android.NormalTheme"
+                android:resource="@style/NormalTheme" />
+            <!-- Displays an Android View that continues showing the launch screen
+                             Drawable until Flutter paints its first frame, then this splash
+                             screen fades out. A splash screen is useful to avoid any visual
+                             gap between the end of Android's launch screen and the painting of
+                             Flutter's first frame. -->
+            <meta-data
+                android:name="io.flutter.embedding.android.SplashScreenDrawable"
+                android:resource="@drawable/launch_background" />
+            <meta-data
+                android:name="com.google.android.gms.wallet.api.enabled"
+                android:value="true" />
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <!-- Don't delete the meta-data below.
+                     This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
+        <meta-data
+            android:name="flutterEmbedding"
+            android:value="2" />
+    </application>
+</manifest>

+ 6 - 0
example/android/app/src/main/kotlin/ru/yoomoney/yookassa_payments_flutter_example/MainActivity.kt

@@ -0,0 +1,6 @@
+package ru.yoomoney.yookassa_payments_flutter_example
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}

+ 12 - 0
example/android/app/src/main/res/drawable-v21/launch_background.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Modify this file to customize your launch splash screen -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="?android:colorBackground" />
+
+    <!-- You can insert your own image assets here -->
+    <!-- <item>
+        <bitmap
+            android:gravity="center"
+            android:src="@mipmap/launch_image" />
+    </item> -->
+</layer-list>

+ 12 - 0
example/android/app/src/main/res/drawable/launch_background.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Modify this file to customize your launch splash screen -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@android:color/white" />
+
+    <!-- You can insert your own image assets here -->
+    <!-- <item>
+        <bitmap
+            android:gravity="center"
+            android:src="@mipmap/launch_image" />
+    </item> -->
+</layer-list>

BIN
example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


+ 18 - 0
example/android/app/src/main/res/values-night/styles.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
+    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
+        <!-- Show a splash screen on the activity. Automatically removed when
+             Flutter draws its first frame -->
+        <item name="android:windowBackground">@drawable/launch_background</item>
+    </style>
+    <!-- Theme applied to the Android Window as soon as the process has started.
+         This theme determines the color of the Android Window while your
+         Flutter UI initializes, as well as behind your Flutter UI while its
+         running.
+         
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
+    <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
+        <item name="android:windowBackground">?android:colorBackground</item>
+    </style>
+</resources>

+ 18 - 0
example/android/app/src/main/res/values/styles.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
+    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <!-- Show a splash screen on the activity. Automatically removed when
+             Flutter draws its first frame -->
+        <item name="android:windowBackground">@drawable/launch_background</item>
+    </style>
+    <!-- Theme applied to the Android Window as soon as the process has started.
+         This theme determines the color of the Android Window while your
+         Flutter UI initializes, as well as behind your Flutter UI while its
+         running.
+         
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
+    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <item name="android:windowBackground">?android:colorBackground</item>
+    </style>
+</resources>

+ 17 - 0
example/android/build.gradle

@@ -0,0 +1,17 @@
+allprojects {
+    repositories {
+        google()
+        mavenCentral()
+        maven { url 'https://developer.huawei.com/repo/'}
+    }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+    project.buildDir = "${rootProject.buildDir}/${project.name}"
+    project.evaluationDependsOn(':app')
+}
+
+tasks.register("clean", Delete) {
+    delete rootProject.buildDir
+}

+ 3 - 0
example/android/gradle.properties

@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx4096M
+android.useAndroidX=true
+android.enableJetifier=true

+ 6 - 0
example/android/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,6 @@
+#Fri Jun 23 08:50:38 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://nexus.yooteam.ru/content/repositories/http-proxy-services.gradle.org/distributions/gradle-8.5-all.zip

+ 25 - 0
example/android/settings.gradle

@@ -0,0 +1,25 @@
+pluginManagement {
+    def flutterSdkPath = {
+        def properties = new Properties()
+        file("local.properties").withInputStream { properties.load(it) }
+        def flutterSdkPath = properties.getProperty("flutter.sdk")
+        assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+        return flutterSdkPath
+    }()
+
+    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+    repositories {
+        google()
+        mavenCentral()
+        gradlePluginPortal()
+    }
+}
+
+plugins {
+    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
+    id "com.android.application" version "8.2.2" apply false
+    id "org.jetbrains.kotlin.android" version "1.9.22" apply false
+}
+
+include ':app'

+ 35 - 0
example/ios/.gitignore

@@ -0,0 +1,35 @@
+**/dgph
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Pods/**
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3

+ 26 - 0
example/ios/Flutter/AppFrameworkInfo.plist

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>en</string>
+  <key>CFBundleExecutable</key>
+  <string>App</string>
+  <key>CFBundleIdentifier</key>
+  <string>io.flutter.flutter.app</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>App</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1.0</string>
+  <key>MinimumOSVersion</key>
+  <string>9.0</string>
+</dict>
+</plist>

+ 2 - 0
example/ios/Flutter/Debug.xcconfig

@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Flutter/Generated.xcconfig"

+ 2 - 0
example/ios/Flutter/Release.xcconfig

@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"

+ 48 - 0
example/ios/Podfile

@@ -0,0 +1,48 @@
+platform :ios, '14.0'
+
+source 'https://github.com/CocoaPods/Specs.git'
+source 'https://git.yoomoney.ru/scm/sdk/cocoa-pod-specs.git'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+  'Debug' => :debug,
+  'Profile' => :release,
+  'Release' => :release,
+}
+
+def flutter_root
+  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+  unless File.exist?(generated_xcode_build_settings_path)
+    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+  end
+
+  File.foreach(generated_xcode_build_settings_path) do |line|
+    matches = line.match(/FLUTTER_ROOT\=(.*)/)
+    return matches[1].strip if matches
+  end
+  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+  use_frameworks!
+  use_modular_headers!
+
+  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+  installer.pods_project.targets.each do |target|
+    flutter_additional_ios_build_settings(target)
+
+    target.build_configurations.each do |config|
+        config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
+        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
+    end
+  end
+end

+ 227 - 0
example/ios/Podfile.lock

@@ -0,0 +1,227 @@
+PODS:
+  - AppMetricaAdSupport (5.9.0):
+    - AppMetricaCore (= 5.9.0)
+    - AppMetricaCoreExtension (= 5.9.0)
+  - AppMetricaAnalytics (5.9.0):
+    - AppMetricaAdSupport (= 5.9.0)
+    - AppMetricaCore (= 5.9.0)
+    - AppMetricaCrashes (= 5.9.0)
+    - AppMetricaWebKit (= 5.9.0)
+  - AppMetricaCore (5.9.0):
+    - AppMetricaCoreUtils (= 5.9.0)
+    - AppMetricaEncodingUtils (= 5.9.0)
+    - AppMetricaFMDB (= 5.9.0)
+    - AppMetricaHostState (= 5.9.0)
+    - AppMetricaIdentifiers (= 5.9.0)
+    - AppMetricaKeychain (= 5.9.0)
+    - AppMetricaLog (= 5.9.0)
+    - AppMetricaNetwork (= 5.9.0)
+    - AppMetricaPlatform (= 5.9.0)
+    - AppMetricaProtobuf (= 5.9.0)
+    - AppMetricaProtobufUtils (= 5.9.0)
+    - AppMetricaStorageUtils (= 5.9.0)
+  - AppMetricaCoreExtension (5.9.0):
+    - AppMetricaCore (= 5.9.0)
+    - AppMetricaStorageUtils (= 5.9.0)
+  - AppMetricaCoreUtils (5.9.0):
+    - AppMetricaLog (= 5.9.0)
+  - AppMetricaCrashes (5.9.0):
+    - AppMetricaCore (= 5.9.0)
+    - AppMetricaCoreExtension (= 5.9.0)
+    - AppMetricaCoreUtils (= 5.9.0)
+    - AppMetricaEncodingUtils (= 5.9.0)
+    - AppMetricaHostState (= 5.9.0)
+    - AppMetricaLog (= 5.9.0)
+    - AppMetricaPlatform (= 5.9.0)
+    - AppMetricaProtobufUtils (= 5.9.0)
+    - AppMetricaStorageUtils (= 5.9.0)
+    - KSCrash/Recording (< 2.1.0, >= 2.0.0-rc.1)
+  - AppMetricaEncodingUtils (5.9.0):
+    - AppMetricaCoreUtils (= 5.9.0)
+    - AppMetricaLog (= 5.9.0)
+    - AppMetricaPlatform (= 5.9.0)
+  - AppMetricaFMDB (5.9.0)
+  - AppMetricaHostState (5.9.0):
+    - AppMetricaCoreUtils (= 5.9.0)
+    - AppMetricaLog (= 5.9.0)
+  - AppMetricaIdentifiers (5.9.0):
+    - AppMetricaKeychain (= 5.9.0)
+    - AppMetricaLogSwift (= 5.9.0)
+    - AppMetricaPlatform (= 5.9.0)
+    - AppMetricaStorageUtils (= 5.9.0)
+    - AppMetricaSynchronization (= 5.9.0)
+  - AppMetricaKeychain (5.9.0):
+    - AppMetricaCoreUtils (= 5.9.0)
+    - AppMetricaLog (= 5.9.0)
+    - AppMetricaStorageUtils (= 5.9.0)
+  - AppMetricaLog (5.9.0)
+  - AppMetricaLogSwift (5.9.0):
+    - AppMetricaLog (= 5.9.0)
+  - AppMetricaNetwork (5.9.0):
+    - AppMetricaCoreUtils (= 5.9.0)
+    - AppMetricaLog (= 5.9.0)
+    - AppMetricaPlatform (= 5.9.0)
+  - AppMetricaPlatform (5.9.0):
+    - AppMetricaCoreUtils (= 5.9.0)
+    - AppMetricaLog (= 5.9.0)
+  - AppMetricaProtobuf (5.9.0)
+  - AppMetricaProtobufUtils (5.9.0):
+    - AppMetricaProtobuf (= 5.9.0)
+  - AppMetricaStorageUtils (5.9.0):
+    - AppMetricaCoreUtils (= 5.9.0)
+    - AppMetricaLog (= 5.9.0)
+  - AppMetricaSynchronization (5.9.0):
+    - AppMetricaLogSwift (= 5.9.0)
+  - AppMetricaWebKit (5.9.0):
+    - AppMetricaCore (= 5.9.0)
+    - AppMetricaCoreUtils (= 5.9.0)
+    - AppMetricaLog (= 5.9.0)
+  - ClickstreamSDK (1.5.0)
+  - Flutter (1.0.0)
+  - FMobileSdk (2.0.0-1231)
+  - FunctionalSwift (2.3.3)
+  - KSCrash/Core (2.0.0)
+  - KSCrash/Recording (2.0.0):
+    - KSCrash/RecordingCore
+  - KSCrash/RecordingCore (2.0.0):
+    - KSCrash/Core
+  - MoneyAuth (12.1.5):
+    - TwoFA (~> 1.4)
+    - YooMoneySessionProfiler
+    - YooMoneyUserAuthCenterApi
+  - OpenSSL-Universal (3.3.3000)
+  - SPaySDK (2.6.2):
+    - ClickstreamSDK (~> 1.5.0)
+  - TwoFA (1.4.2):
+    - YooMoneyAuthenticatorApi (~> 2.0)
+    - YooMoneyCoreApi (~> 3.0)
+    - YooMoneyUI (~> 7.7)
+  - yookassa_payments_flutter (1.6.0):
+    - Flutter
+    - YooKassaPayments (= 7.4.0)
+  - YooKassaPayments (7.4.0):
+    - AppMetricaAnalytics (~> 5.8)
+    - FMobileSdk (~> 2.0.0-1231)
+    - MoneyAuth (~> 12.1)
+    - SPaySDK (~> 2.5)
+    - YooKassaPaymentsApi (~> 2.25)
+    - YooKassaWalletApi (~> 2.7)
+    - YooMoneyPinning
+  - YooKassaPaymentsApi (2.25.0):
+    - FunctionalSwift
+    - YooMoneyCoreApi (~> 3.1.1)
+  - YooKassaWalletApi (2.7.2):
+    - FunctionalSwift
+    - YooMoneyCoreApi
+  - YooMoneyAuthenticatorApi (2.0.2):
+    - FunctionalSwift (~> 2.0)
+    - YooMoneyCoreApi (~> 3.0)
+  - YooMoneyCoreApi (3.1.1):
+    - FunctionalSwift (~> 2.0)
+  - YooMoneyPinning (2.3.1):
+    - FunctionalSwift (~> 2.0)
+    - OpenSSL-Universal
+    - YooMoneyCoreApi (~> 3.0)
+  - YooMoneySessionProfiler (5.3.4):
+    - FMobileSdk
+  - YooMoneyUI (7.13.5):
+    - FunctionalSwift
+  - YooMoneyUserAuthCenterApi (10.4.4):
+    - FunctionalSwift (~> 2.0)
+    - YooMoneyCoreApi (~> 3.0)
+
+DEPENDENCIES:
+  - Flutter (from `Flutter`)
+  - yookassa_payments_flutter (from `.symlinks/plugins/yookassa_payments_flutter/ios`)
+
+SPEC REPOS:
+  https://git.yoomoney.ru/scm/sdk/cocoa-pod-specs.git:
+    - FMobileSdk
+    - FunctionalSwift
+    - MoneyAuth
+    - TwoFA
+    - YooKassaPayments
+    - YooKassaPaymentsApi
+    - YooKassaWalletApi
+    - YooMoneyAuthenticatorApi
+    - YooMoneyCoreApi
+    - YooMoneyPinning
+    - YooMoneySessionProfiler
+    - YooMoneyUI
+    - YooMoneyUserAuthCenterApi
+  https://github.com/CocoaPods/Specs.git:
+    - AppMetricaAdSupport
+    - AppMetricaAnalytics
+    - AppMetricaCore
+    - AppMetricaCoreExtension
+    - AppMetricaCoreUtils
+    - AppMetricaCrashes
+    - AppMetricaEncodingUtils
+    - AppMetricaFMDB
+    - AppMetricaHostState
+    - AppMetricaIdentifiers
+    - AppMetricaKeychain
+    - AppMetricaLog
+    - AppMetricaLogSwift
+    - AppMetricaNetwork
+    - AppMetricaPlatform
+    - AppMetricaProtobuf
+    - AppMetricaProtobufUtils
+    - AppMetricaStorageUtils
+    - AppMetricaSynchronization
+    - AppMetricaWebKit
+    - ClickstreamSDK
+    - KSCrash
+    - OpenSSL-Universal
+    - SPaySDK
+
+EXTERNAL SOURCES:
+  Flutter:
+    :path: Flutter
+  yookassa_payments_flutter:
+    :path: ".symlinks/plugins/yookassa_payments_flutter/ios"
+
+SPEC CHECKSUMS:
+  AppMetricaAdSupport: 030ecf754defdf915849ed5b2c0a9f2a2f44658d
+  AppMetricaAnalytics: 9c05ad0993395f88e68ba9a28ab1212fb68376c6
+  AppMetricaCore: cdad94c505967ebac86f81da48841df3136ef696
+  AppMetricaCoreExtension: b9c8695bac86ec7f4ef90f905131f7b9d31d8295
+  AppMetricaCoreUtils: 3c7aa8a78895f98f557f1bc88bce4eb80a6bcd2a
+  AppMetricaCrashes: 7641b5c23c581693e6c8ae253948635f8f3ff071
+  AppMetricaEncodingUtils: 61f9fd1c510e517e2b4981b940bc510f9498e1bc
+  AppMetricaFMDB: 743a9d6833380eebfa0ca0f1db2883bb05b41c16
+  AppMetricaHostState: 5c9196539244397f7fb8a4db44bddc1bbc67b93b
+  AppMetricaIdentifiers: b870d30d6a5acd9cc9df9e30a37e4bf8a0e03a25
+  AppMetricaKeychain: 767acc62243599c034bab686093640b3e86d3893
+  AppMetricaLog: 9fdc87723f6a1b497866f6827143117d7ff667c4
+  AppMetricaLogSwift: 9d67b9ce5097cfed6ff56a6a4ec7770f2ce2df07
+  AppMetricaNetwork: 81342ff33cd3786bcdbe06c5b580179aec7c95c2
+  AppMetricaPlatform: cb4699122820183ce3dc29fc386bada3afde99d5
+  AppMetricaProtobuf: 8d9ad65007f56af94b324dbc31096ee8be04d412
+  AppMetricaProtobufUtils: 33f29ccee2f898b537eece0c4fe04e14e1bdab9a
+  AppMetricaStorageUtils: 42c3f8163226516aec3e183db4f3e1a29fac1c41
+  AppMetricaSynchronization: ed4196effc6997921fab53503e79c6505dbae707
+  AppMetricaWebKit: 568f2057ae462b792b0b04eeeaffdd3b2af1f2b3
+  ClickstreamSDK: 591cbf0c2f96bcaba6a36365a94a19f4463a1ae5
+  Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+  FMobileSdk: a7b555198f03785af1a6064db57545c49694c1cf
+  FunctionalSwift: bc40a208dd4f29100767aba35602cc231e8d355a
+  KSCrash: ad271a7799f0a2841be0fb7d6bd105444c440832
+  MoneyAuth: 6ace1456b74758435a4092ff9cffef053fb471d8
+  OpenSSL-Universal: d776ce24dab24323e6995dfb17c64d598885d05c
+  SPaySDK: 4cffeefdd962b820bc8ecd3501e7e5b7ed39ac90
+  TwoFA: 295a51b9cdce323d9dc7d37a283985eed326e2f8
+  yookassa_payments_flutter: 370706fa12594e8af6bdf55fa0b86732aea66991
+  YooKassaPayments: 9615cea820bb2798ee300f512e32ef80c61425f0
+  YooKassaPaymentsApi: 63a1fb836f6543e306891ae9a58a55928b2df842
+  YooKassaWalletApi: f7162cf7dd44a261ab1be83e66c6c67d50f90122
+  YooMoneyAuthenticatorApi: 473077a60a5db1c8e1f0310f8437cab34b8e021e
+  YooMoneyCoreApi: f53a22898878aab2f07449351a8a08f4918a6100
+  YooMoneyPinning: 017733bf2c38491ee93a4d22e25c0b28051b4c6d
+  YooMoneySessionProfiler: 27f7eaa9b282a9cbb68cec977242b06ac2c06c2f
+  YooMoneyUI: 5a3df6ce998e03f58f213b15ce23d28b0a1b7dcf
+  YooMoneyUserAuthCenterApi: e19361858e23ef4072ffacc5b3aa1d0925714f22
+
+PODFILE CHECKSUM: d83a67078f664dc9b52d32635e3e488dc83a611b
+
+COCOAPODS: 1.16.2

+ 471 - 0
example/ios/Runner.xcodeproj/project.pbxproj

@@ -0,0 +1,471 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 54;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+		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 */; };
+		BAEDD6C9220D1ABA0429DC05 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08BAA017D1C1DD8F2E26E61B /* Pods_Runner.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		08BAA017D1C1DD8F2E26E61B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		0F432271E158C4356E30E297 /* 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 = "<group>"; };
+		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
+		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
+		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
+		6AF9C6944A49F0D9AC28EF18 /* 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 = "<group>"; };
+		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
+		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
+		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
+		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
+		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
+		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		A95B0811275AB8E600BAE8AB /* TMXProfilingConnections.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = TMXProfilingConnections.xcframework; path = Frameworks/TMXProfilingConnections.xcframework; sourceTree = "<group>"; };
+		A95B0815275AB8F400BAE8AB /* TMXProfiling.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = TMXProfiling.xcframework; path = Frameworks/TMXProfiling.xcframework; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		97C146EB1CF9000F007C117D /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				BAEDD6C9220D1ABA0429DC05 /* Pods_Runner.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		0A9E0AECE28BA26A565C74FA /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				6AF9C6944A49F0D9AC28EF18 /* Pods-Runner.debug.xcconfig */,
+				0F432271E158C4356E30E297 /* Pods-Runner.release.xcconfig */,
+			);
+			path = Pods;
+			sourceTree = "<group>";
+		};
+		2B777917365CBF507928ADBB /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				A95B0815275AB8F400BAE8AB /* TMXProfiling.xcframework */,
+				A95B0811275AB8E600BAE8AB /* TMXProfilingConnections.xcframework */,
+				08BAA017D1C1DD8F2E26E61B /* Pods_Runner.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		9740EEB11CF90186004384FC /* Flutter */ = {
+			isa = PBXGroup;
+			children = (
+				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+				9740EEB21CF90195004384FC /* Debug.xcconfig */,
+				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+				9740EEB31CF90195004384FC /* Generated.xcconfig */,
+			);
+			name = Flutter;
+			sourceTree = "<group>";
+		};
+		97C146E51CF9000F007C117D = {
+			isa = PBXGroup;
+			children = (
+				9740EEB11CF90186004384FC /* Flutter */,
+				97C146F01CF9000F007C117D /* Runner */,
+				97C146EF1CF9000F007C117D /* Products */,
+				0A9E0AECE28BA26A565C74FA /* Pods */,
+				2B777917365CBF507928ADBB /* Frameworks */,
+			);
+			sourceTree = "<group>";
+		};
+		97C146EF1CF9000F007C117D /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				97C146EE1CF9000F007C117D /* Runner.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		97C146F01CF9000F007C117D /* Runner */ = {
+			isa = PBXGroup;
+			children = (
+				97C146FA1CF9000F007C117D /* Main.storyboard */,
+				97C146FD1CF9000F007C117D /* Assets.xcassets */,
+				97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+				97C147021CF9000F007C117D /* Info.plist */,
+				1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+				1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+				74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+				74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+			);
+			path = Runner;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		97C146ED1CF9000F007C117D /* Runner */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+			buildPhases = (
+				73C3CA7DD996445733801D0C /* [CP] Check Pods Manifest.lock */,
+				9740EEB61CF901F6004384FC /* Run Script */,
+				97C146EA1CF9000F007C117D /* Sources */,
+				97C146EB1CF9000F007C117D /* Frameworks */,
+				97C146EC1CF9000F007C117D /* Resources */,
+				3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+				5A51D23740C73B8FBFF86A21 /* [CP] Embed Pods Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = Runner;
+			productName = Runner;
+			productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		97C146E61CF9000F007C117D /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 1300;
+				ORGANIZATIONNAME = "";
+				TargetAttributes = {
+					97C146ED1CF9000F007C117D = {
+						CreatedOnToolsVersion = 7.3.1;
+						LastSwiftMigration = 1100;
+					};
+				};
+			};
+			buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 97C146E51CF9000F007C117D;
+			productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				97C146ED1CF9000F007C117D /* Runner */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		97C146EC1CF9000F007C117D /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "Thin Binary";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+		};
+		5A51D23740C73B8FBFF86A21 /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+		73C3CA7DD996445733801D0C /* [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-Runner-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;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			name = "Run Script";
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		97C146EA1CF9000F007C117D /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+		97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				97C146FB1CF9000F007C117D /* Base */,
+			);
+			name = Main.storyboard;
+			sourceTree = "<group>";
+		};
+		97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				97C147001CF9000F007C117D /* Base */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		97C147031CF9000F007C117D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				PRODUCT_BUNDLE_IDENTIFIER = ru.yoomoney.yookassa_payments_flutter_example;
+				SDKROOT = iphoneos;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		97C147041CF9000F007C117D /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu99;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				PRODUCT_BUNDLE_IDENTIFIER = ru.yoomoney.yookassa_payments_flutter_example;
+				SDKROOT = iphoneos;
+				SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		97C147061CF9000F007C117D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+				CLANG_ENABLE_MODULES = YES;
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				ENABLE_BITCODE = NO;
+				INFOPLIST_FILE = Runner/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = "ru.yoomoney.yookassa-payments-flutter-exampe";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				SWIFT_VERSION = 5.0;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Debug;
+		};
+		97C147071CF9000F007C117D /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+				CLANG_ENABLE_MODULES = YES;
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+				ENABLE_BITCODE = NO;
+				INFOPLIST_FILE = Runner/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = "ru.yoomoney.yookassa-payments-flutter-exampe";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+				SWIFT_VERSION = 5.0;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				97C147031CF9000F007C117D /* Debug */,
+				97C147041CF9000F007C117D /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				97C147061CF9000F007C117D /* Debug */,
+				97C147071CF9000F007C117D /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}

+ 7 - 0
example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:">
+   </FileRef>
+</Workspace>

+ 8 - 0
example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

+ 8 - 0
example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>PreviewsEnabled</key>
+	<false/>
+</dict>
+</plist>

+ 87 - 0
example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1300"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+               BuildableName = "Runner.app"
+               BlueprintName = "Runner"
+               ReferencedContainer = "container:Runner.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+            BuildableName = "Runner.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+      <Testables>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+            BuildableName = "Runner.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Profile"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+            BuildableName = "Runner.app"
+            BlueprintName = "Runner"
+            ReferencedContainer = "container:Runner.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 10 - 0
example/ios/Runner.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Runner.xcodeproj">
+   </FileRef>
+   <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+   </FileRef>
+</Workspace>

+ 8 - 0
example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

+ 8 - 0
example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>PreviewsEnabled</key>
+	<false/>
+</dict>
+</plist>

+ 40 - 0
example/ios/Runner/AppDelegate.swift

@@ -0,0 +1,40 @@
+import UIKit
+import Flutter
+import YooKassaPayments
+
+var result: FlutterResult?
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+    override func application(
+        _ application: UIApplication,
+        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+    ) -> Bool {
+        GeneratedPluginRegistrant.register(with: self)
+        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+    }
+    
+    override func application(
+        _ application: UIApplication,
+        open url: URL,
+        sourceApplication: String?,
+        annotation: Any
+    ) -> Bool {
+        return YKSdk.shared.handleOpen(
+            url: url,
+            sourceApplication: sourceApplication
+        )
+    }
+    
+    @available(iOS 9.0, *)
+    override func application(
+        _ app: UIApplication,
+        open url: URL,
+        options: [UIApplication.OpenURLOptionsKey: Any] = [:]
+    ) -> Bool {
+        return YKSdk.shared.handleOpen(
+            url: url,
+            sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String
+        )
+    }
+}

+ 122 - 0
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,122 @@
+{
+  "images" : [
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "83.5x83.5",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-83.5x83.5@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "1024x1024",
+      "idiom" : "ios-marketing",
+      "filename" : "Icon-App-1024x1024@1x.png",
+      "scale" : "1x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png


BIN
example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png


+ 23 - 0
example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png


BIN
example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png


BIN
example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png


+ 5 - 0
example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md

@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

+ 122 - 0
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Contents.json

@@ -0,0 +1,122 @@
+{
+  "images" : [
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "83.5x83.5",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-83.5x83.5@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "1024x1024",
+      "idiom" : "ios-marketing",
+      "filename" : "Icon-App-1024x1024@1x.png",
+      "scale" : "1x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-1024x1024@1x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-20x20@1x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-20x20@2x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-20x20@3x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-29x29@1x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-29x29@2x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-29x29@3x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-40x40@1x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-40x40@2x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-40x40@3x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-60x60@2x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-60x60@3x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-76x76@1x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-76x76@2x.png


BIN
example/ios/Runner/Assets.xcassets/devAppIcon.appiconset/Icon-App-83.5x83.5@2x.png


+ 23 - 0
example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "LaunchImage@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/LaunchImage.png


BIN
example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/LaunchImage@2x.png


BIN
example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/LaunchImage@3x.png


+ 5 - 0
example/ios/Runner/Assets.xcassets/devLaunchImage.imageset/README.md

@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

+ 122 - 0
example/ios/Runner/Assets.xcassets/prodAppIcon.appiconset/Contents.json

@@ -0,0 +1,122 @@
+{
+  "images" : [
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-20x20@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-29x29@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-40x40@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "60x60",
+      "idiom" : "iphone",
+      "filename" : "Icon-App-60x60@3x.png",
+      "scale" : "3x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "20x20",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-20x20@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "29x29",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-29x29@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "40x40",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-40x40@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "size" : "76x76",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-76x76@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "83.5x83.5",
+      "idiom" : "ipad",
+      "filename" : "Icon-App-83.5x83.5@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "size" : "1024x1024",
+      "idiom" : "ios-marketing",
+      "filename" : "Icon-App-1024x1024@1x.png",
+      "scale" : "1x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
example/ios/Runner/Assets.xcassets/prodAppIcon.appiconset/Icon-App-1024x1024@1x.png


BIN
example/ios/Runner/Assets.xcassets/prodAppIcon.appiconset/Icon-App-20x20@1x.png


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels