From a15c5d945860456dc9a9c181ad664094164c07bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jan 2022 14:14:38 +0300 Subject: [PATCH 01/16] bundler: bump fastlane from 2.199.0 to 2.200.0 (#1094) * bundler: bump fastlane from 2.199.0 to 2.200.0 Bumps [fastlane](https://github.com/fastlane/fastlane) from 2.199.0 to 2.200.0. - [Release notes](https://github.com/fastlane/fastlane/releases) - [Commits](https://github.com/fastlane/fastlane/compare/fastlane/2.199.0...fastlane/2.200.0) --- updated-dependencies: - dependency-name: fastlane dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update minimum fastlane version * Run bundle update Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ivan Magda --- Gemfile | 2 +- Gemfile.lock | 52 +++++++++++++++++++++++++---------------------- fastlane/Fastfile | 2 +- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/Gemfile b/Gemfile index 7350f4c9dd..9736471749 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source "https://rubygems.org" ruby "2.6.5" -gem "fastlane", "2.199.0" +gem "fastlane", "2.200.0" gem "cocoapods", "1.11.2" gem "generamba", "1.5.0" diff --git a/Gemfile.lock b/Gemfile.lock index ee95324ccc..93f3455dc6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,7 +3,7 @@ GEM specs: CFPropertyList (3.0.5) rexml - activesupport (6.1.4.3) + activesupport (6.1.4.4) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -17,23 +17,23 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.541.0) - aws-sdk-core (3.124.0) + aws-partitions (1.547.0) + aws-sdk-core (3.125.3) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.525.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.52.0) - aws-sdk-core (~> 3, >= 3.122.0) + aws-sdk-kms (1.53.0) + aws-sdk-core (~> 3, >= 3.125.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.109.0) - aws-sdk-core (~> 3, >= 3.122.0) + aws-sdk-s3 (1.111.1) + aws-sdk-core (~> 3, >= 3.125.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) aws-sigv4 (1.4.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) - claide (1.0.3) + claide (1.1.0) cocoapods (1.11.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) @@ -86,17 +86,18 @@ GEM escape (0.0.4) ethon (0.15.0) ffi (>= 1.15.0) - excon (0.89.0) - faraday (1.8.0) + excon (0.90.0) + faraday (1.9.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) - faraday-httpclient (~> 1.0.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.1) + faraday-net_http_persistent (~> 1.0) faraday-patron (~> 1.0) faraday-rack (~> 1.0) - multipart-post (>= 1.2, < 3) + faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) faraday-cookie_jar (0.0.7) faraday (>= 0.8.0) @@ -105,14 +106,17 @@ GEM faraday-em_synchrony (1.0.0) faraday-excon (1.1.0) faraday-httpclient (1.0.1) + faraday-multipart (1.0.3) + multipart-post (>= 1.2, < 3) faraday-net_http (1.0.1) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) + faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.5) - fastlane (2.199.0) + fastimage (2.2.6) + fastlane (2.200.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -152,7 +156,7 @@ GEM xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) fastlane-plugin-firebase_app_distribution (0.3.2) - ffi (1.15.4) + ffi (1.15.5) fourflusher (2.3.1) fuzzy_match (2.0.4) generamba (1.5.0) @@ -164,7 +168,7 @@ GEM xcodeproj (>= 1.5.0, < 2.0.0) gh_inspector (1.1.3) git (1.2.9.1) - google-apis-androidpublisher_v3 (0.14.0) + google-apis-androidpublisher_v3 (0.15.0) google-apis-core (>= 0.4, < 2.a) google-apis-core (0.4.1) addressable (~> 2.5, >= 2.5.1) @@ -175,11 +179,11 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.9.0) + google-apis-iamcredentials_v1 (0.10.0) google-apis-core (>= 0.4, < 2.a) - google-apis-playcustomapp_v1 (0.6.0) + google-apis-playcustomapp_v1 (0.7.0) google-apis-core (>= 0.4, < 2.a) - google-apis-storage_v1 (0.10.0) + google-apis-storage_v1 (0.11.0) google-apis-core (>= 0.4, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) @@ -187,7 +191,7 @@ GEM google-cloud-env (1.5.0) faraday (>= 0.17.3, < 2.0) google-cloud-errors (1.2.0) - google-cloud-storage (1.35.0) + google-cloud-storage (1.36.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) @@ -208,7 +212,7 @@ GEM httpclient (2.8.3) i18n (1.8.11) concurrent-ruby (~> 1.0) - jmespath (1.4.0) + jmespath (1.5.0) json (2.6.1) jwt (2.3.0) liquid (4.0.0) @@ -276,14 +280,14 @@ GEM rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) - zeitwerk (2.5.1) + zeitwerk (2.5.3) PLATFORMS ruby DEPENDENCIES cocoapods (= 1.11.2) - fastlane (= 2.199.0) + fastlane (= 2.200.0) fastlane-plugin-firebase_app_distribution generamba (= 1.5.0) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index a70caa7c9a..cf990bf0b7 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,4 +1,4 @@ -fastlane_version "2.175.0" +fastlane_version "2.200.0" default_platform :ios From 7a412307cb3cdc27dbf074faacb2c2ed6af56ac9 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Thu, 13 Jan 2022 15:58:01 +0300 Subject: [PATCH 02/16] Update dependencies 1.206 (#1095) * Bump SDWebImage from 5.12.1 to 5.12.2 Bumps [SDWebImage](https://github.com/SDWebImage/SDWebImage) from 5.12.1 to 5.12.2 - [Release notes](https://github.com/SDWebImage/SDWebImage/releases/tag/5.12.2) - [Commits](https://github.com/SDWebImage/SDWebImage/compare/5.12.1...5.12.2) * Bump Amplitude from 8.5.0 to 8.7.1 Bumps [Amplitude](https://github.com/amplitude/Amplitude-iOS) from 8.5.0 to 8.7.1 - [Release notes](https://github.com/amplitude/Amplitude-iOS/releases/tag/v8.7.1) - [Commits](https://github.com/amplitude/Amplitude-iOS/compare/v8.5.0...v8.7.1) * Bump GoogleSignIn from 5.0.2 to 6.1.0 Bumps [GoogleSignIn](https://github.com/google/GoogleSignIn-iOS) from 5.0.2 to 6.1.0 - [Release notes](https://github.com/google/GoogleSignIn-iOS/releases/tag/6.1.0) - [Commits](https://github.com/google/GoogleSignIn-iOS/compare/6.0.0...6.1.0) * Migrate to new GoogleSignIn * Bump lottie-ios from 3.2.3 to 3.3.0 Bumps [lottie-ios](https://github.com/airbnb/lottie-ios) from 3.2.3 to 3.3.0 - [Release notes](https://github.com/airbnb/lottie-ios/releases/tag/3.3.0) - [Commits](https://github.com/airbnb/lottie-ios/compare/3.2.3...3.3.0) * Bump Alamofire from 5.4.4 to 5.5.0 Bumps [Alamofire](https://github.com/Alamofire/Alamofire) from 5.4.4 to 5.5.0 - [Release notes](https://github.com/Alamofire/Alamofire/releases/tag/5.5.0) - [Commits](https://github.com/Alamofire/Alamofire/compare/5.4.4...5.5.0) * Bump Nuke from 9.5.0 to 10.6.1 Bumps [Nuke](https://github.com/kean/Nuke) from 9.5.0 to 10.6.1 - [Release notes](https://github.com/kean/Nuke/releases/tag/10.6.1) - [Commits](https://github.com/kean/Nuke/compare/9.5.0...10.6.1) * Bump Firebase from 8.9.1 to 8.10.0 Bumps [Firebase](https://github.com/firebase/firebase-ios-sdk) from 8.9.1 to 8.10.0 - [Release notes](https://github.com/firebase/firebase-ios-sdk/releases/tag/8.10.0) - [Commits](https://github.com/firebase/firebase-ios-sdk/compare/8.9.1...8.10.0) * Bump SwiftLint from 0.45.0 to 0.45.1 Bumps [SwiftLint](https://github.com/realm/SwiftLint) from 0.45.0 to 0.45.1 - [Release notes](https://github.com/realm/SwiftLint/releases/tag/0.45.1) - [Commits](https://github.com/realm/SwiftLint/compare/0.45.0...0.45.1) * Fix NukeImageDataProvider * Run pod update * Clean up --- Podfile | 24 +-- Podfile.lock | 164 +++++++++--------- Stepic.xcodeproj/project.pbxproj | 42 +---- Stepic/Legacy/AppDelegate.swift | 2 +- .../GoogleIDSocialSDKProvider.swift | 57 +++--- Stepic/Sources/Common/ImageDataProvider.swift | 2 +- 6 files changed, 127 insertions(+), 164 deletions(-) diff --git a/Podfile b/Podfile index 15d6c7eba2..67417e4b45 100644 --- a/Podfile +++ b/Podfile @@ -13,14 +13,14 @@ project 'Stepic', 'Develop Release' => :release def shared_pods - pod 'Alamofire', '5.4.4' + pod 'Alamofire', '5.5.0' pod 'Atributika', '4.10.1' pod 'SwiftyJSON', '5.0.0' - pod 'SDWebImage', '5.12.1' + pod 'SDWebImage', '5.12.2' pod 'SVGKit', :git => 'https://github.com/SVGKit/SVGKit.git', :branch => '2.x' pod 'DeviceKit', '4.5.2' pod 'PromiseKit', :git => 'https://github.com/mxcl/PromiseKit.git', :tag => '6.16.2' - pod 'SwiftLint', '0.45.0' + pod 'SwiftLint', '0.45.1' if ENV['FASTLANE_BETA_PROFILE'] == 'true' pod 'FLEX', @@ -43,14 +43,14 @@ def all_pods pod 'SnapKit', '5.0.1' # Firebase - pod 'Firebase/Core', '8.9.1' - pod 'Firebase/Messaging', '8.9.1' - pod 'Firebase/Analytics', '8.9.1' - pod 'Firebase/Crashlytics', '8.9.1' - pod 'Firebase/RemoteConfig', '8.9.1' + pod 'Firebase/Core', '8.10.0' + pod 'Firebase/Messaging', '8.10.0' + pod 'Firebase/Analytics', '8.10.0' + pod 'Firebase/Crashlytics', '8.10.0' + pod 'Firebase/RemoteConfig', '8.10.0' pod 'YandexMobileMetrica/Dynamic', '3.17.0' - pod 'Amplitude', '8.5.0' + pod 'Amplitude', '8.7.1' pod 'Branch', '1.40.2' pod 'BEMCheckBox', '1.4.1' @@ -64,7 +64,7 @@ def all_pods pod 'VK-ios-sdk', '1.6.2' pod 'FBSDKCoreKit', '8.2.0' pod 'FBSDKLoginKit', '8.2.0' - pod 'GoogleSignIn', '5.0.2' + pod 'GoogleSignIn', '6.1.0' pod 'Presentr', :git => 'https://github.com/ivan-magda/Presentr.git', :tag => 'v1.9.1' pod 'PanModal', :git => 'https://github.com/ivan-magda/PanModal.git', :branch => 'remove-presenting-appearance-transitions' @@ -72,12 +72,12 @@ def all_pods pod 'Agrume', '5.6.13' pod 'Highlightr', :git => 'https://github.com/ivan-magda/Highlightr.git', :tag => 'v2.1.3' pod 'TTTAttributedLabel', '2.0.0' - pod 'lottie-ios', '3.2.3' + pod 'lottie-ios', '3.3.0' pod 'Koloda', '5.0.1' pod 'Charts', '3.6.0' pod 'EasyTipView', '2.1.0' pod 'ActionSheetPicker-3.0', '2.7.1' - pod 'Nuke', '9.5.0' + pod 'Nuke', '10.6.1' pod 'STRegex', '2.1.1' pod 'Tabman', '2.10.0' pod 'SwiftDate', '6.3.1' diff --git a/Podfile.lock b/Podfile.lock index 8fb5c5c655..e5cd83f719 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -2,8 +2,8 @@ PODS: - ActionSheetPicker-3.0 (2.7.1) - Agrume (5.6.13): - SwiftyGif - - Alamofire (5.4.4) - - Amplitude (8.5.0) + - Alamofire (5.5.0) + - Amplitude (8.7.1) - AppAuth (1.4.0): - AppAuth/Core (= 1.4.0) - AppAuth/ExternalUserAgent (= 1.4.0) @@ -15,9 +15,9 @@ PODS: - Charts (3.6.0): - Charts/Core (= 3.6.0) - Charts/Core (3.6.0) - - CocoaLumberjack (3.7.2): - - CocoaLumberjack/Core (= 3.7.2) - - CocoaLumberjack/Core (3.7.2) + - CocoaLumberjack (3.7.4): + - CocoaLumberjack/Core (= 3.7.4) + - CocoaLumberjack/Core (3.7.4) - DeviceKit (4.5.2) - DownloadButton (0.1.0) - EasyTipView (2.1.0) @@ -31,26 +31,26 @@ PODS: - FBSDKLoginKit/Login (= 8.2.0) - FBSDKLoginKit/Login (8.2.0): - FBSDKCoreKit (~> 8.2.0) - - Firebase/Analytics (8.9.1): + - Firebase/Analytics (8.10.0): - Firebase/Core - - Firebase/Core (8.9.1): + - Firebase/Core (8.10.0): - Firebase/CoreOnly - - FirebaseAnalytics (~> 8.9.1) - - Firebase/CoreOnly (8.9.1): - - FirebaseCore (= 8.9.1) - - Firebase/Crashlytics (8.9.1): + - FirebaseAnalytics (~> 8.10.0) + - Firebase/CoreOnly (8.10.0): + - FirebaseCore (= 8.10.0) + - Firebase/Crashlytics (8.10.0): - Firebase/CoreOnly - - FirebaseCrashlytics (~> 8.9.0) - - Firebase/Messaging (8.9.1): + - FirebaseCrashlytics (~> 8.10.0) + - Firebase/Messaging (8.10.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 8.9.0) - - Firebase/RemoteConfig (8.9.1): + - FirebaseMessaging (~> 8.10.0) + - Firebase/RemoteConfig (8.10.0): - Firebase/CoreOnly - - FirebaseRemoteConfig (~> 8.9.0) - - FirebaseABTesting (8.9.0): + - FirebaseRemoteConfig (~> 8.10.0) + - FirebaseABTesting (8.10.0): - FirebaseCore (~> 8.0) - - FirebaseAnalytics (8.9.1): - - FirebaseAnalytics/AdIdSupport (= 8.9.1) + - FirebaseAnalytics (8.10.0): + - FirebaseAnalytics/AdIdSupport (= 8.10.0) - FirebaseCore (~> 8.0) - FirebaseInstallations (~> 8.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.6) @@ -58,37 +58,37 @@ PODS: - GoogleUtilities/Network (~> 7.6) - "GoogleUtilities/NSData+zlib (~> 7.6)" - nanopb (~> 2.30908.0) - - FirebaseAnalytics/AdIdSupport (8.9.1): + - FirebaseAnalytics/AdIdSupport (8.10.0): - FirebaseCore (~> 8.0) - FirebaseInstallations (~> 8.0) - - GoogleAppMeasurement (= 8.9.1) + - GoogleAppMeasurement (= 8.10.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.6) - GoogleUtilities/MethodSwizzler (~> 7.6) - GoogleUtilities/Network (~> 7.6) - "GoogleUtilities/NSData+zlib (~> 7.6)" - nanopb (~> 2.30908.0) - - FirebaseCore (8.9.1): + - FirebaseCore (8.10.0): - FirebaseCoreDiagnostics (~> 8.0) - GoogleUtilities/Environment (~> 7.6) - GoogleUtilities/Logger (~> 7.6) - - FirebaseCoreDiagnostics (8.9.0): + - FirebaseCoreDiagnostics (8.10.0): - GoogleDataTransport (~> 9.1) - GoogleUtilities/Environment (~> 7.6) - GoogleUtilities/Logger (~> 7.6) - nanopb (~> 2.30908.0) - - FirebaseCrashlytics (8.9.0): + - FirebaseCrashlytics (8.10.0): - FirebaseCore (~> 8.0) - FirebaseInstallations (~> 8.0) - GoogleDataTransport (~> 9.1) - GoogleUtilities/Environment (~> 7.6) - nanopb (~> 2.30908.0) - PromisesObjC (< 3.0, >= 1.2) - - FirebaseInstallations (8.9.0): + - FirebaseInstallations (8.10.0): - FirebaseCore (~> 8.0) - GoogleUtilities/Environment (~> 7.6) - GoogleUtilities/UserDefaults (~> 7.6) - PromisesObjC (< 3.0, >= 1.2) - - FirebaseMessaging (8.9.0): + - FirebaseMessaging (8.10.0): - FirebaseCore (~> 8.0) - FirebaseInstallations (~> 8.0) - GoogleDataTransport (~> 9.1) @@ -97,28 +97,28 @@ PODS: - GoogleUtilities/Reachability (~> 7.6) - GoogleUtilities/UserDefaults (~> 7.6) - nanopb (~> 2.30908.0) - - FirebaseRemoteConfig (8.9.0): + - FirebaseRemoteConfig (8.10.0): - FirebaseABTesting (~> 8.0) - FirebaseCore (~> 8.0) - FirebaseInstallations (~> 8.0) - GoogleUtilities/Environment (~> 7.6) - "GoogleUtilities/NSData+zlib (~> 7.6)" - FLEX (4.4.1) - - GoogleAppMeasurement (8.9.1): - - GoogleAppMeasurement/AdIdSupport (= 8.9.1) + - GoogleAppMeasurement (8.10.0): + - GoogleAppMeasurement/AdIdSupport (= 8.10.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.6) - GoogleUtilities/MethodSwizzler (~> 7.6) - GoogleUtilities/Network (~> 7.6) - "GoogleUtilities/NSData+zlib (~> 7.6)" - nanopb (~> 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (8.9.1): - - GoogleAppMeasurement/WithoutAdIdSupport (= 8.9.1) + - GoogleAppMeasurement/AdIdSupport (8.10.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 8.10.0) - GoogleUtilities/AppDelegateSwizzler (~> 7.6) - GoogleUtilities/MethodSwizzler (~> 7.6) - GoogleUtilities/Network (~> 7.6) - "GoogleUtilities/NSData+zlib (~> 7.6)" - nanopb (~> 2.30908.0) - - GoogleAppMeasurement/WithoutAdIdSupport (8.9.1): + - GoogleAppMeasurement/WithoutAdIdSupport (8.10.0): - GoogleUtilities/AppDelegateSwizzler (~> 7.6) - GoogleUtilities/MethodSwizzler (~> 7.6) - GoogleUtilities/Network (~> 7.6) @@ -128,28 +128,28 @@ PODS: - GoogleUtilities/Environment (~> 7.2) - nanopb (~> 2.30908.0) - PromisesObjC (< 3.0, >= 1.2) - - GoogleSignIn (5.0.2): - - AppAuth (~> 1.2) + - GoogleSignIn (6.1.0): + - AppAuth (~> 1.4) - GTMAppAuth (~> 1.0) - GTMSessionFetcher/Core (~> 1.1) - - GoogleUtilities/AppDelegateSwizzler (7.6.0): + - GoogleUtilities/AppDelegateSwizzler (7.7.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.6.0): + - GoogleUtilities/Environment (7.7.0): - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.6.0): + - GoogleUtilities/Logger (7.7.0): - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.6.0): + - GoogleUtilities/MethodSwizzler (7.7.0): - GoogleUtilities/Logger - - GoogleUtilities/Network (7.6.0): + - GoogleUtilities/Network (7.7.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.6.0)" - - GoogleUtilities/Reachability (7.6.0): + - "GoogleUtilities/NSData+zlib (7.7.0)" + - GoogleUtilities/Reachability (7.7.0): - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.6.0): + - GoogleUtilities/UserDefaults (7.7.0): - GoogleUtilities/Logger - GTMAppAuth (1.2.2): - AppAuth/Core (~> 1.4) @@ -160,7 +160,7 @@ PODS: - Kanna (5.2.7) - Koloda (5.0.1): - pop (~> 1.0) - - lottie-ios (3.2.3) + - lottie-ios (3.3.0) - Mockingjay (3.0.0-alpha.1): - Mockingjay/Core (= 3.0.0-alpha.1) - Mockingjay/XCTest (= 3.0.0-alpha.1) @@ -174,7 +174,7 @@ PODS: - nanopb/decode (2.30908.0) - nanopb/encode (2.30908.0) - Nimble (9.2.1) - - Nuke (9.5.0) + - Nuke (10.6.1) - Pageboy (3.6.2) - PanModal (1.2.7) - pop (1.0.12) @@ -190,17 +190,17 @@ PODS: - PromiseKit/CorePromise - PromisesObjC (2.0.0) - Quick (4.0.0) - - SDWebImage (5.12.1): - - SDWebImage/Core (= 5.12.1) - - SDWebImage/Core (5.12.1) + - SDWebImage (5.12.2): + - SDWebImage/Core (= 5.12.2) + - SDWebImage/Core (5.12.2) - SnapKit (5.0.1) - STRegex (2.1.1) - SVGKit (2.1.0): - CocoaLumberjack (~> 3.0) - SVProgressHUD (2.2.5) - SwiftDate (6.3.1) - - SwiftLint (0.45.0) - - SwiftyGif (5.4.0) + - SwiftLint (0.45.1) + - SwiftyGif (5.4.2) - SwiftyJSON (5.0.0) - Tabman (2.10.0): - Pageboy (~> 3.6.0) @@ -218,8 +218,8 @@ PODS: DEPENDENCIES: - ActionSheetPicker-3.0 (= 2.7.1) - Agrume (= 5.6.13) - - Alamofire (= 5.4.4) - - Amplitude (= 8.5.0) + - Alamofire (= 5.5.0) + - Amplitude (= 8.7.1) - Atributika (= 4.10.1) - BEMCheckBox (= 1.4.1) - Branch (= 1.40.2) @@ -229,32 +229,32 @@ DEPENDENCIES: - EasyTipView (= 2.1.0) - FBSDKCoreKit (= 8.2.0) - FBSDKLoginKit (= 8.2.0) - - Firebase/Analytics (= 8.9.1) - - Firebase/Core (= 8.9.1) - - Firebase/Crashlytics (= 8.9.1) - - Firebase/Messaging (= 8.9.1) - - Firebase/RemoteConfig (= 8.9.1) + - Firebase/Analytics (= 8.10.0) + - Firebase/Core (= 8.10.0) + - Firebase/Crashlytics (= 8.10.0) + - Firebase/Messaging (= 8.10.0) + - Firebase/RemoteConfig (= 8.10.0) - FLEX (from `https://github.com/ivan-magda/FLEX.git`, branch `master`) - - GoogleSignIn (= 5.0.2) + - GoogleSignIn (= 6.1.0) - Highlightr (from `https://github.com/ivan-magda/Highlightr.git`, tag `v2.1.3`) - IQKeyboardManagerSwift (= 6.5.6) - Kanna (= 5.2.7) - Koloda (= 5.0.1) - - lottie-ios (= 3.2.3) + - lottie-ios (= 3.3.0) - Mockingjay (from `https://github.com/kylef/Mockingjay.git`, branch `master`) - Nimble (= 9.2.1) - - Nuke (= 9.5.0) + - Nuke (= 10.6.1) - PanModal (from `https://github.com/ivan-magda/PanModal.git`, branch `remove-presenting-appearance-transitions`) - Presentr (from `https://github.com/ivan-magda/Presentr.git`, tag `v1.9.1`) - PromiseKit (from `https://github.com/mxcl/PromiseKit.git`, tag `6.16.2`) - Quick (= 4.0.0) - - SDWebImage (= 5.12.1) + - SDWebImage (= 5.12.2) - SnapKit (= 5.0.1) - STRegex (= 2.1.1) - SVGKit (from `https://github.com/SVGKit/SVGKit.git`, branch `2.x`) - SVProgressHUD (= 2.2.5) - SwiftDate (= 6.3.1) - - SwiftLint (= 0.45.0) + - SwiftLint (= 0.45.1) - SwiftyJSON (= 5.0.0) - Tabman (= 2.10.0) - TTTAttributedLabel (= 2.0.0) @@ -369,44 +369,44 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: ActionSheetPicker-3.0: 36da254b97a09ff89679ecb8b8510bd3e5bdc773 Agrume: 21b96a1138abc0f890211bfcb12f8b1e3464b4c1 - Alamofire: f3b09a368f1582ab751b3fff5460276e0d2cf5c9 - Amplitude: ef9ed339ddd33c9183edf63fa4bbaa86cf873321 + Alamofire: 1c4fb5369c3fe93d2857c780d8bbe09f06f97e7c + Amplitude: 834c7332dfb9640a751e21c13efb22a07c0c12d4 AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 Atributika: 47e778507cfb3cd2c996278b0285221a62e97d71 BEMCheckBox: 5ba6e37ade3d3657b36caecc35c8b75c6c2b1a4e Branch: c1b244bf1170b0ea5c5eefa897648de8d14ff0d2 Charts: b1e3a1f5a1c9ba5394438ca3b91bd8c9076310af - CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da + CocoaLumberjack: 543c79c114dadc3b1aba95641d8738b06b05b646 DeviceKit: c622fc19f795f3e0b4d75d6d11b26604338cdab3 DownloadButton: 49a21a89e0d7d1b42d9134f79aaa40e727cd57c3 EasyTipView: a92b6edc377b81c5ac18e9fd35d5ee78e9409488 FBSDKCoreKit: 4afd6ff53d8133a433dbcda44451c9498f8c6ce4 FBSDKLoginKit: 7181765f2524d7ebf82d9629066c8e6caafc99d0 - Firebase: fb5114cd2bf96e2ff7bcb01d0d9a156cf5fd2f07 - FirebaseABTesting: 9de50b34bf9eb4a07d4edb7af82c14152fd905aa - FirebaseAnalytics: 4ab446ce08a3fe52e8a4303dd997cf26276bf968 - FirebaseCore: c5aab092d9c4b8efea894946166b04c9d9ef0e68 - FirebaseCoreDiagnostics: 5daa63f1c1409d981a2d5007daa100b36eac6a34 - FirebaseCrashlytics: 40efbd81157dae307ec95612fa1328347284d2c2 - FirebaseInstallations: caa7c8e0d3e2345b8829d2fa9ca1b4dfbf2fcc85 - FirebaseMessaging: 82c4a48638f53f7b184f3cc9f6cd2cbe533ab316 - FirebaseRemoteConfig: a75c1bd44ebd3ed4ad3fa1ff09414a8b133be405 + Firebase: 44213362f1dcc52555b935dc925ed35ac55f1b20 + FirebaseABTesting: fc7255f7e96d3cf7a1131fd68636c47e312cef76 + FirebaseAnalytics: 319c9b3b1bdd400d60e2f415dff0c5f6959e6760 + FirebaseCore: 04186597c095da37d90ff9fd3e53bc61a1ff2440 + FirebaseCoreDiagnostics: 56fb7216d87e0e6ec2feddefa9d8a392fe8b2c18 + FirebaseCrashlytics: 3b7f17cdf5bf1ae6ad5956696a6c26edeb39cca7 + FirebaseInstallations: 830327b45345ffc859eaa9c17bcd5ae893fd5425 + FirebaseMessaging: b0aeba17332ee1ee610662b4d1e02a86db82f08f + FirebaseRemoteConfig: 84d3397887d95587f0ee7a0a3989b2756dc2bbf9 FLEX: 75ca95cff4bd57592c6e75adee7651ace29f9c25 - GoogleAppMeasurement: 837649ad3987936c232f6717c5680216f6243d24 + GoogleAppMeasurement: a3311dbcf3ea651e5a070fe8559b57c174ada081 GoogleDataTransport: 629c20a4d363167143f30ea78320d5a7eb8bd940 - GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 - GoogleUtilities: 684ee790a24f73ebb2d1d966e9711c203f2a4237 + GoogleSignIn: c90b5bec45e780f54c6a8e1e3c182a86e3dda69d + GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1 GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89 GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91 Highlightr: 9fbc57afd1921d274d5df911caabf91eaf25f0f3 IQKeyboardManagerSwift: c7df9d2deb356c04522f5c4b7b6e4ce4d8ed94fe Kanna: 01cfbddc127f5ff0963692f285fcbc8a9d62d234 Koloda: d07b9199a383abc5898b62aa945a599f5e7c0c4b - lottie-ios: c058aeafa76daa4cf64d773554bccc8385d0150e + lottie-ios: 6ac74dcc09904798f59b18cb3075c089d76be9ae Mockingjay: 97656c6f59879923976a0a52ef09da45756cca82 nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 Nimble: e7e615c0335ee4bf5b0d786685451e62746117d5 - Nuke: 6f400a4ea957e09149ec335a3c6acdcc814d89e4 + Nuke: 3ca210aee6d90756605c5125cbe40569fd9c06f7 Pageboy: cf121b9dd48c63f3f281b2a9ec93d02e0f23879b PanModal: 3e16ead1a907fb06f4df3f13492fd00149fa4974 pop: d582054913807fd11fd50bfe6a539d91c7e1a55a @@ -414,14 +414,14 @@ SPEC CHECKSUMS: PromiseKit: ad27b174e5d8587cf799888f5e738f88e17055d8 PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 Quick: 6473349e43b9271a8d43839d9ba1c442ed1b7ac4 - SDWebImage: 4dc3e42d9ec0c1028b960a33ac6b637bb432207b + SDWebImage: 240e5c12b592fb1268c1d03b8c90d90e8c2ffe82 SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb STRegex: d49e88d0fe58538d3175fdd989bc1243b9be2a07 SVGKit: 8a2fc74258bdb2abb54d3b65f3dd68b0277a9c4d SVProgressHUD: 1428aafac632c1f86f62aa4243ec12008d7a51d6 SwiftDate: 72d28954e8e1c6c1c0f917ccc8005e4f83c7d4b2 - SwiftLint: e5c7f1fba68eccfc51509d5b2ce1699f5502e0c7 - SwiftyGif: 5d4af95df24caf1c570dbbcb32a3b8a0763bc6d7 + SwiftLint: 06ac37e4d38c7068e0935bb30cda95f093bec761 + SwiftyGif: dec758a9dd3d278e5a855dbf279bf062c923c387 SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7 Tabman: d8d6ab0b483c7db375a71ac227d3ef791b56a049 TTTAttributedLabel: 8cffe8e127e4e82ff3af1e5386d4cd0ad000b656 @@ -430,6 +430,6 @@ SPEC CHECKSUMS: VK-ios-sdk: 5bcf00a2014a7323f98db9328b603d4f96635caa YandexMobileMetrica: 9e713c16bb6aca0ba63b84c8d7b8b86d32f4ecc4 -PODFILE CHECKSUM: 91c5501d3a27c4d1d80ff880978ef3b8111e3b6d +PODFILE CHECKSUM: d51c5eda751b737dd114fd295ab09fd1b7306085 COCOAPODS: 1.11.2 diff --git a/Stepic.xcodeproj/project.pbxproj b/Stepic.xcodeproj/project.pbxproj index d3cf686349..ad900a4199 100644 --- a/Stepic.xcodeproj/project.pbxproj +++ b/Stepic.xcodeproj/project.pbxproj @@ -10242,7 +10242,6 @@ 085D5CD61D007F2100092060 /* Frameworks */, 085D5CD71D007F2100092060 /* Resources */, C79C1B724717A179569871E5 /* [CP] Embed Pods Frameworks */, - 6280D7646D0AACF80BFE3C4F /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -10282,7 +10281,6 @@ 086538401EB02716003A8415 /* Embed App Extensions */, D25EB23E484464AD999FE2C5 /* [CP] Embed Pods Frameworks */, 08343B1A1BF5EC7F00370FC1 /* FirebaseCrashlytics Script */, - BD6CCF7C920494D46494C55D /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -10692,42 +10690,6 @@ 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; }; - 6280D7646D0AACF80BFE3C4F /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-StepicTests/Pods-StepicTests-resources.sh", - "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-StepicTests/Pods-StepicTests-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - BD6CCF7C920494D46494C55D /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Stepic/Pods-Stepic-resources.sh", - "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Stepic/Pods-Stepic-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; C79C1B724717A179569871E5 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -10761,6 +10723,7 @@ "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework", + "${BUILT_PRODUCTS_DIR}/GoogleSignIn/GoogleSignIn.framework", "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", "${BUILT_PRODUCTS_DIR}/Highlightr/Highlightr.framework", "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework", @@ -10822,6 +10785,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleSignIn.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Highlightr.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework", @@ -10893,6 +10857,7 @@ "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", "${BUILT_PRODUCTS_DIR}/GoogleDataTransport/GoogleDataTransport.framework", + "${BUILT_PRODUCTS_DIR}/GoogleSignIn/GoogleSignIn.framework", "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", "${BUILT_PRODUCTS_DIR}/Highlightr/Highlightr.framework", "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework", @@ -10950,6 +10915,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleDataTransport.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleSignIn.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Highlightr.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework", diff --git a/Stepic/Legacy/AppDelegate.swift b/Stepic/Legacy/AppDelegate.swift index e0a2e7dc2b..65967dfe24 100644 --- a/Stepic/Legacy/AppDelegate.swift +++ b/Stepic/Legacy/AppDelegate.swift @@ -306,7 +306,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { if ApplicationDelegate.shared.application(app, open: url, options: options) { return true } - if GIDSignIn.sharedInstance().handle(url) { + if GIDSignIn.sharedInstance.handle(url) { return true } if url.scheme == "vk\(StepikApplicationsInfo.SocialInfo.AppIds.vk)" diff --git a/Stepic/Legacy/Model/Network/SocialSDKProviders/GoogleIDSocialSDKProvider.swift b/Stepic/Legacy/Model/Network/SocialSDKProviders/GoogleIDSocialSDKProvider.swift index 0d939e9f9f..3088f45a7e 100644 --- a/Stepic/Legacy/Model/Network/SocialSDKProviders/GoogleIDSocialSDKProvider.swift +++ b/Stepic/Legacy/Model/Network/SocialSDKProviders/GoogleIDSocialSDKProvider.swift @@ -13,16 +13,13 @@ final class GoogleIDSocialSDKProvider: NSObject, SocialSDKProvider { let name = "google" - private var sdkInstance: GIDSignIn - - private var successHandler: ((SocialSDKCredential) -> Void)? - private var errorHandler: ((SocialSDKError) -> Void)? + private let sdkInstance: GIDSignIn + private let signInConfig: GIDConfiguration override private init() { - self.sdkInstance = GIDSignIn.sharedInstance() + self.sdkInstance = GIDSignIn.sharedInstance + self.signInConfig = GIDConfiguration(clientID: StepikApplicationsInfo.SocialInfo.AppIds.google) super.init() - self.sdkInstance.clientID = StepikApplicationsInfo.SocialInfo.AppIds.google - self.sdkInstance.delegate = self } func getAccessInfo() -> Promise { @@ -42,35 +39,35 @@ final class GoogleIDSocialSDKProvider: NSObject, SocialSDKProvider { success successHandler: @escaping (SocialSDKCredential) -> Void, error errorHandler: @escaping (SocialSDKError) -> Void ) { - self.successHandler = successHandler - self.errorHandler = errorHandler - - self.sdkInstance.presentingViewController = self.delegate?.googleSignInPresentingViewController + guard let presentingViewController = self.delegate?.googleSignInPresentingViewController else { + return errorHandler(.connectionError) + } if self.sdkInstance.hasPreviousSignIn() { self.sdkInstance.signOut() } - self.sdkInstance.signIn() - } -} - -extension GoogleIDSocialSDKProvider: GIDSignInDelegate { - func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { - if let error = error { - print("GoogleIDSocialSDKProvider :: error=\(error.localizedDescription)") - self.errorHandler?(SocialSDKError.connectionError) - } else if let authentication = user.authentication, - let accessToken = authentication.accessToken { - var email: String? - if let profile = user.profile, - let profileEmail = profile.email { - email = profileEmail + self.sdkInstance.signIn(with: self.signInConfig, presenting: presentingViewController) { user, error in + if let error = error { + print("GoogleIDSocialSDKProvider :: error = \(error.localizedDescription)") + errorHandler(.connectionError) + } else if let user = user { + let email = user.profile?.email + user.authentication.do { authentication, error in + if let error = error { + print("GoogleIDSocialSDKProvider :: error = \(error.localizedDescription)") + errorHandler(.connectionError) + } else if let authentication = authentication { + successHandler(SocialSDKCredential(token: authentication.accessToken, email: email)) + } else { + print("GoogleIDSocialSDKProvider :: error missing accessToken") + errorHandler(.accessDenied) + } + } + } else { + print("GoogleIDSocialSDKProvider :: error missing accessToken") + errorHandler(.accessDenied) } - self.successHandler?(SocialSDKCredential(token: accessToken, email: email)) - } else { - print("GoogleIDSocialSDKProvider :: error missing accessToken") - self.errorHandler?(SocialSDKError.accessDenied) } } } diff --git a/Stepic/Sources/Common/ImageDataProvider.swift b/Stepic/Sources/Common/ImageDataProvider.swift index c7310538a9..f082ed379e 100644 --- a/Stepic/Sources/Common/ImageDataProvider.swift +++ b/Stepic/Sources/Common/ImageDataProvider.swift @@ -112,5 +112,5 @@ final class NukeImageDataProvider: ImageDataProvider { return imageContainer.image.jpegData(compressionQuality: self.compressionQuality) } - var contentURL: URL? { self.imageRequest.urlRequest.url } + var contentURL: URL? { self.imageRequest.urlRequest?.url } } From 40d0355309fd71270accc7283889e0259b5f1c43 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Mon, 17 Jan 2022 09:51:27 +0300 Subject: [PATCH 03/16] Update buy course failure analytics events parameters --- .../Events/AmplitudeAnalyticsEvents.swift | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift b/Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift index 779d0cd802..ee631cb2de 100644 --- a/Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift +++ b/Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift @@ -1,4 +1,5 @@ import Foundation +import Alamofire extension AnalyticsEvent { // MARK: - Launch - @@ -232,14 +233,16 @@ extension AnalyticsEvent { errorType: String, errorDescription: String? ) -> AmplitudeAnalyticsEvent { - AmplitudeAnalyticsEvent( - name: "Buy course IAP flow failure", - parameters: [ - "course": id, - "type": errorType, - "message": errorDescription as Any - ] - ) + var parameters: [String : Any] = [ + "course": id, + "type": errorType + ] + + if let errorDescription = errorDescription { + parameters["message"] = errorDescription + } + + return AmplitudeAnalyticsEvent(name: "Buy course IAP flow failure", parameters: parameters) } static func courseBuyCourseVerificationSuccess( @@ -264,14 +267,16 @@ extension AnalyticsEvent { errorType: String, errorDescription: String? ) -> AmplitudeAnalyticsEvent { - AmplitudeAnalyticsEvent( - name: "Buy course verification failure", - parameters: [ - "course": id, - "type": errorType, - "message": errorDescription as Any - ] - ) + var parameters: [String : Any] = [ + "course": id, + "type": errorType + ] + + if let errorDescription = errorDescription { + parameters["message"] = errorDescription + } + + return AmplitudeAnalyticsEvent(name: "Buy course verification failure", parameters: parameters) } static func courseRestoreCoursePurchasePressed( From cc1b8b6d2d229ab256cf069b35838e83cd461614 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Mon, 17 Jan 2022 09:52:54 +0300 Subject: [PATCH 04/16] Add onFailure block for YMMYandexMetrica.reportEvent --- .../Frameworks/Analytics/AnalyticsEngine.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Stepic/Sources/Frameworks/Analytics/AnalyticsEngine.swift b/Stepic/Sources/Frameworks/Analytics/AnalyticsEngine.swift index 19e1e3ef41..ec6771075e 100644 --- a/Stepic/Sources/Frameworks/Analytics/AnalyticsEngine.swift +++ b/Stepic/Sources/Frameworks/Analytics/AnalyticsEngine.swift @@ -74,7 +74,16 @@ final class AppMetricaAnalyticsEngine: AnalyticsEngine { init() {} func sendAnalyticsEvent(named name: String, parameters: [String: Any]?, forceSend: Bool) { - YMMYandexMetrica.reportEvent(name, parameters: parameters) + YMMYandexMetrica.reportEvent(name, parameters: parameters) { error in + if LaunchArguments.analyticsDebugEnabled { + print( + """ + ERROR Logging AppMetrica event: \(name), parameters: \(String(describing: parameters)), \ + error = \(error) + """ + ) + } + } if LaunchArguments.analyticsDebugEnabled { print("Logging AppMetrica event: \(name), parameters: \(String(describing: parameters))") From 6eff0aa507b7fac13ac45854fe2628df7d950fd0 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Mon, 17 Jan 2022 09:54:30 +0300 Subject: [PATCH 05/16] Remove Alamofire import from AmplitudeAnalyticsEvents --- Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift b/Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift index ee631cb2de..0b4552dfa5 100644 --- a/Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift +++ b/Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift @@ -1,5 +1,4 @@ import Foundation -import Alamofire extension AnalyticsEvent { // MARK: - Launch - From 30e2148b951bf194ae01aa5b89a89b1f34451a67 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Mon, 17 Jan 2022 19:02:36 +0300 Subject: [PATCH 06/16] IAP forward original errors (#1096) * Forward original payment errors * Report to analytics * Clean up IAPReceiptValidationService --- .../InAppPurchases/IAPPaymentsService.swift | 38 ++++++--- .../IAPReceiptValidationService.swift | 24 +++++- .../InAppPurchases/IAPService.swift | 81 ++++++++++++++++--- .../CourseInfoPurchaseModalInteractor.swift | 10 +-- .../CourseInfoPurchaseModalPresenter.swift | 15 +++- .../CoursePaymentsNetworkService.swift | 8 +- 6 files changed, 140 insertions(+), 36 deletions(-) diff --git a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift index 684077ba5d..92fcf73be9 100644 --- a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift +++ b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift @@ -98,23 +98,25 @@ final class IAPPaymentsService: NSObject, IAPPaymentsServiceProtocol { } func retryValidateReceipt(courseID: Course.IdType, productIdentifier: IAPProductIdentifier) { - func reportRetryValidateReceiptFailed() { + func reportRetryValidateReceiptFailed(error: Swift.Error) { self.delegate?.iapPaymentsService( self, didFailPurchaseCourse: courseID, - withError: Error.paymentReceiptValidationFailed + withError: Error.paymentReceiptValidationFailed(originalError: error) ) } guard let transaction = self.paymentQueue.transactions.first( where: { $0.payment.productIdentifier == productIdentifier } ), transaction.transactionState == .purchased else { - return reportRetryValidateReceiptFailed() + return reportRetryValidateReceiptFailed(error: Error.paymentNotFoundTransactionForRetryValidateReceipt) } guard let payload = self.paymentsCache.getCoursePayment(for: transaction), payload.courseID == courseID else { - return reportRetryValidateReceiptFailed() + return reportRetryValidateReceiptFailed( + error: Error.paymentNotFoundTransactionPayloadForRetryValidateReceipt + ) } self.validateReceipt(transaction: transaction, payload: payload, forceRefreshReceipt: true) @@ -146,10 +148,12 @@ final class IAPPaymentsService: NSObject, IAPPaymentsServiceProtocol { enum Error: Swift.Error { case paymentNotAllowed - case paymentCancelled - case paymentFailed + case paymentCancelled(originalError: Swift.Error) + case paymentFailed(originalError: Swift.Error?) case paymentUserChanged - case paymentReceiptValidationFailed + case paymentReceiptValidationFailed(originalError: Swift.Error) + case paymentNotFoundTransactionForRetryValidateReceipt + case paymentNotFoundTransactionPayloadForRetryValidateReceipt } } @@ -206,13 +210,13 @@ extension IAPPaymentsService: SKPaymentTransactionObserver { self.delegate?.iapPaymentsService( self, didFailPurchaseCourse: payload.courseID, - withError: Error.paymentFailed + withError: Error.paymentFailed(originalError: skError) ) } else { self.delegate?.iapPaymentsService( self, didFailPurchaseCourse: payload.courseID, - withError: Error.paymentCancelled + withError: Error.paymentCancelled(originalError: skError) ) } print("IAPPaymentsService :: payment failed with error: \(skError)") @@ -221,7 +225,7 @@ extension IAPPaymentsService: SKPaymentTransactionObserver { self.delegate?.iapPaymentsService( self, didFailPurchaseCourse: payload.courseID, - withError: Error.paymentFailed + withError: Error.paymentFailed(originalError: transaction.error) ) } @@ -277,10 +281,22 @@ extension IAPPaymentsService: SKPaymentTransactionObserver { } else { self.$mutableState.write { $0.courseIDByValidateReceiptWithRefresh[courseID] = false } + let originalError: Swift.Error = { + if let receiptValidationServiceError = error as? IAPReceiptValidationService.Error { + switch receiptValidationServiceError { + case .noAppStoreReceiptPresent, .invalidPaymentData, .invalidFinalStatus: + return receiptValidationServiceError + case .requestFailed(let originalError): + return originalError + } + } + return error + }() + self.delegate?.iapPaymentsService( self, didFailPurchaseCourse: courseID, - withError: Error.paymentReceiptValidationFailed + withError: Error.paymentReceiptValidationFailed(originalError: originalError) ) } } diff --git a/Stepic/Sources/Frameworks/InAppPurchases/IAPReceiptValidationService.swift b/Stepic/Sources/Frameworks/InAppPurchases/IAPReceiptValidationService.swift index 47b2b66b34..590af8397b 100644 --- a/Stepic/Sources/Frameworks/InAppPurchases/IAPReceiptValidationService.swift +++ b/Stepic/Sources/Frameworks/InAppPurchases/IAPReceiptValidationService.swift @@ -74,12 +74,30 @@ final class IAPReceiptValidationService: IAPReceiptValidationServiceProtocol { print("IAPReceiptValidationService :: successfully verified course payment for course: \(courseID)") seal.fulfill(coursePayment) } else { - print("IAPReceiptValidationService :: failed verify course payment with status: \(coursePayment.statusStringValue)") + print( + """ + IAPReceiptValidationService :: failed verify course payment with \ + status: \(coursePayment.statusStringValue) + """ + ) seal.reject(Error.invalidFinalStatus) } }.catch { error in print("IAPReceiptValidationService :: failed create course payment with error: \(error)") - seal.reject(Error.requestFailed) + + let originalError: Swift.Error = { + if let coursePaymentsNetworkServiceError = error as? CoursePaymentsNetworkService.Error { + switch coursePaymentsNetworkServiceError { + case .fetchFailed: + return coursePaymentsNetworkServiceError + case .createFailed(let originalErrorOrNil): + return originalErrorOrNil ?? coursePaymentsNetworkServiceError + } + } + return error + }() + + seal.reject(Error.requestFailed(originalError: originalError)) } } } @@ -121,7 +139,7 @@ final class IAPReceiptValidationService: IAPReceiptValidationServiceProtocol { case noAppStoreReceiptPresent case invalidPaymentData case invalidFinalStatus - case requestFailed + case requestFailed(originalError: Swift.Error) } } diff --git a/Stepic/Sources/Frameworks/InAppPurchases/IAPService.swift b/Stepic/Sources/Frameworks/InAppPurchases/IAPService.swift index 3d0d2e4a27..ab924e84c6 100644 --- a/Stepic/Sources/Frameworks/InAppPurchases/IAPService.swift +++ b/Stepic/Sources/Frameworks/InAppPurchases/IAPService.swift @@ -386,15 +386,28 @@ final class IAPService: IAPServiceProtocol { /// The app cannot request App Store about available IAP products for some reason. case productsRequestFailed /// The user cancelled an initialized purchase process. - case paymentWasCancelled + case paymentWasCancelled(originalError: Swift.Error) /// Indicates that the course payment failed. - case paymentFailed + case paymentFailed(originalError: Swift.Error?) /// The IAP is not allowed on this device. case paymentNotAllowed /// Indicates that the current user changed during payment. case paymentUserChanged /// The receipt validation failed - case paymentReceiptValidationFailed + case paymentReceiptValidationFailed(originalError: Swift.Error) + + var originalError: Swift.Error? { + switch self { + case .paymentWasCancelled(let originalError): + return originalError + case .paymentFailed(let originalError): + return originalError + case .paymentReceiptValidationFailed(let originalError): + return originalError + default: + return nil + } + } } } @@ -445,23 +458,42 @@ extension IAPService: IAPPaymentsServiceDelegate { if let paymentsServiceError = error as? IAPPaymentsService.Error { switch paymentsServiceError { - case .paymentFailed: - requestDelegate.iapService(self, didFailPurchaseCourse: courseID, withError: Error.paymentFailed) + case .paymentFailed(let originalError): + requestDelegate.iapService( + self, + didFailPurchaseCourse: courseID, + withError: Error.paymentFailed(originalError: originalError) + ) case .paymentNotAllowed: requestDelegate.iapService(self, didFailPurchaseCourse: courseID, withError: Error.paymentNotAllowed) case .paymentUserChanged: requestDelegate.iapService(self, didFailPurchaseCourse: courseID, withError: Error.paymentUserChanged) - case .paymentCancelled: - requestDelegate.iapService(self, didFailPurchaseCourse: courseID, withError: Error.paymentWasCancelled) - case .paymentReceiptValidationFailed: + case .paymentCancelled(let originalError): requestDelegate.iapService( self, didFailPurchaseCourse: courseID, - withError: Error.paymentReceiptValidationFailed + withError: Error.paymentWasCancelled(originalError: originalError) + ) + case .paymentReceiptValidationFailed(let originalError): + requestDelegate.iapService( + self, + didFailPurchaseCourse: courseID, + withError: Error.paymentReceiptValidationFailed(originalError: originalError) + ) + case .paymentNotFoundTransactionForRetryValidateReceipt, + .paymentNotFoundTransactionPayloadForRetryValidateReceipt: + requestDelegate.iapService( + self, + didFailPurchaseCourse: courseID, + withError: Error.paymentReceiptValidationFailed(originalError: paymentsServiceError) ) } } else { - requestDelegate.iapService(self, didFailPurchaseCourse: courseID, withError: Error.paymentFailed) + requestDelegate.iapService( + self, + didFailPurchaseCourse: courseID, + withError: Error.paymentFailed(originalError: error) + ) } self.coursePaymentRequests.remove(CoursePaymentRequest(courseID: courseID, delegate: nil)) @@ -494,3 +526,32 @@ extension IAPService.Error: LocalizedError { } } } + +// MARK: - IAPService.Error (Analytics) - + +extension IAPService.Error { + var analyticsErrorType: String { + switch self { + case .paymentWasCancelled: + return "paymentWasCancelled" + case .paymentFailed: + return "paymentFailed" + case .paymentReceiptValidationFailed: + return "paymentReceiptValidationFailed" + default: + return String(describing: self) + } + } + + var analyticsErrorDescription: String? { + let result = [ + self.errorDescription, + self.originalError != nil ? "originalError = \(self.originalError?.localizedDescription ?? "")" : nil + ] + .compactMap { $0 } + .joined(separator: ", ") + .trimmed() + + return result.isEmpty ? nil : result + } +} diff --git a/Stepic/Sources/Modules/CourseInfoSubmodules/CourseInfoPurchaseModal/CourseInfoPurchaseModalInteractor.swift b/Stepic/Sources/Modules/CourseInfoSubmodules/CourseInfoPurchaseModal/CourseInfoPurchaseModalInteractor.swift index b61b9b5983..4eacf26b04 100644 --- a/Stepic/Sources/Modules/CourseInfoSubmodules/CourseInfoPurchaseModal/CourseInfoPurchaseModalInteractor.swift +++ b/Stepic/Sources/Modules/CourseInfoSubmodules/CourseInfoPurchaseModal/CourseInfoPurchaseModalInteractor.swift @@ -344,20 +344,20 @@ extension CourseInfoPurchaseModalInteractor: IAPServiceDelegate { print("CourseInfoPurchaseModalInteractor :: \(#function), courseID = \(courseID), error = \(error)") if let iapServiceError = error as? IAPService.Error { - if iapServiceError == .paymentReceiptValidationFailed { + if case .paymentReceiptValidationFailed = iapServiceError { self.analytics.send( .courseBuyCourseVerificationFailure( id: self.courseID, - errorType: String(describing: iapServiceError), - errorDescription: iapServiceError.errorDescription + errorType: iapServiceError.analyticsErrorType, + errorDescription: iapServiceError.analyticsErrorDescription ) ) } else { self.analytics.send( .courseBuyCourseIAPFlowFailure( id: self.courseID, - errorType: String(describing: iapServiceError), - errorDescription: iapServiceError.errorDescription + errorType: iapServiceError.analyticsErrorType, + errorDescription: iapServiceError.analyticsErrorDescription ) ) } diff --git a/Stepic/Sources/Modules/CourseInfoSubmodules/CourseInfoPurchaseModal/CourseInfoPurchaseModalPresenter.swift b/Stepic/Sources/Modules/CourseInfoSubmodules/CourseInfoPurchaseModal/CourseInfoPurchaseModalPresenter.swift index 8ab5e649b0..31c0a5f18d 100644 --- a/Stepic/Sources/Modules/CourseInfoSubmodules/CourseInfoPurchaseModal/CourseInfoPurchaseModalPresenter.swift +++ b/Stepic/Sources/Modules/CourseInfoSubmodules/CourseInfoPurchaseModal/CourseInfoPurchaseModalPresenter.swift @@ -82,7 +82,8 @@ final class CourseInfoPurchaseModalPresenter: CourseInfoPurchaseModalPresenterPr } }() - if iapError == .paymentReceiptValidationFailed { + + if case .paymentReceiptValidationFailed = iapError { viewController.displayPurchaseCourseResult(viewModel: .init(state: .purchaseErrorStepik)) } else { let modalViewModel = self.makeModalViewModel( @@ -99,7 +100,7 @@ final class CourseInfoPurchaseModalPresenter: CourseInfoPurchaseModalPresenterPr ) ) - if iapError == .paymentUserChanged { + if case .paymentUserChanged = iapError { DispatchQueue.main.async { viewController.displayPurchaseCourseResult(viewModel: .init(state: .purchaseErrorStepik)) } @@ -115,7 +116,9 @@ final class CourseInfoPurchaseModalPresenter: CourseInfoPurchaseModalPresenterPr case .inProgress: self.viewController?.displayRestorePurchaseResult(viewModel: .init(state: .restorePurchaseInProgress)) case .error: - let errorDescription = IAPService.Error.paymentReceiptValidationFailed.errorDescription + let errorDescription = IAPService.Error + .paymentReceiptValidationFailed(originalError: Error.dummy) + .errorDescription self.viewController?.displayRestorePurchaseResult( viewModel: .init(state: .restorePurchaseError(errorDescription: errorDescription)) ) @@ -175,4 +178,10 @@ final class CourseInfoPurchaseModalPresenter: CourseInfoPurchaseModalPresenterPr isLoading: isLoading ) } + + // MARK: Inner Types + + private enum Error: Swift.Error { + case dummy + } } diff --git a/Stepic/Sources/Services/Models/Network/CoursePaymentsNetworkService.swift b/Stepic/Sources/Services/Models/Network/CoursePaymentsNetworkService.swift index 256361c87b..3e502759f1 100644 --- a/Stepic/Sources/Services/Models/Network/CoursePaymentsNetworkService.swift +++ b/Stepic/Sources/Services/Models/Network/CoursePaymentsNetworkService.swift @@ -25,20 +25,20 @@ final class CoursePaymentsNetworkService: CoursePaymentsNetworkServiceProtocol { func create(coursePayment: CoursePayment) -> Promise { if coursePayment.data == nil || coursePayment.courseID == -1 { - return Promise(error: Error.createFailed) + return Promise(error: Error.createFailed(originalError: nil)) } return Promise { seal in self.coursePaymentsAPI.create(coursePayment).done { coursePayment in seal.fulfill(coursePayment) - }.catch { _ in - seal.reject(Error.createFailed) + }.catch { error in + seal.reject(Error.createFailed(originalError: error)) } } } enum Error: Swift.Error { case fetchFailed - case createFailed + case createFailed(originalError: Swift.Error?) } } From fcbc9cb8b713f020cf2cd33323b1d2f2916071f6 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Tue, 18 Jan 2022 11:25:13 +0300 Subject: [PATCH 07/16] Do not remove course payment cache for failed transaction APPS-3574 --- .../Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift index 92fcf73be9..7bbda68136 100644 --- a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift +++ b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift @@ -229,7 +229,6 @@ extension IAPPaymentsService: SKPaymentTransactionObserver { ) } - self.paymentsCache.removeCoursePayment(for: transaction) self.paymentQueue.finishTransaction(transaction) case .purchasing, .deferred, .restored: break From 8296d2d4328ad6adf9f221cfa16bcc8cd5f74369 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Tue, 18 Jan 2022 16:57:53 +0300 Subject: [PATCH 08/16] Course info restore purchase (#1097) * Restore purchase * Add presenter & viewController actions --- .../InAppPurchases/IAPPaymentsCache.swift | Bin 3510 -> 4194 bytes .../InAppPurchases/IAPPaymentsService.swift | 4 + .../CourseInfo/CourseInfoAssembly.swift | 1 + .../CourseInfo/CourseInfoDataFlow.swift | 26 ++++ .../CourseInfoHeaderViewModel.swift | 1 + .../CourseInfo/CourseInfoInteractor.swift | 112 +++++++++++++++++- .../CourseInfo/CourseInfoPresenter.swift | 30 ++++- .../CourseInfo/CourseInfoViewController.swift | 46 +++++++ Stepic/en.lproj/Localizable.strings | 7 ++ Stepic/ru.lproj/Localizable.strings | 7 ++ 10 files changed, 229 insertions(+), 5 deletions(-) diff --git a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsCache.swift b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsCache.swift index 4219e185ceddd62f6bf607ff103f75974d204282..f85969e37dd2eb74cefa656b6cb3f9c54560b132 100644 GIT binary patch literal 4194 zcmV-o5S{M;M@dveQdv+`08eOJ)XM0U@#!A-I^Ar{Cz@u#O1O?BF8EnBoumd1oSO;F zIPNOZEo(ff$;KNRqm+z6u5~-oJ118kp@}byw4E-~Mwf44IIKvl^nVraDfo{6)1?@! z5UdI&G1m88Ec4^NPV-XL3rCm_`{&{9%1}R;YVxv9B5pw3yj6CHL`t}M*@3MK9zUA9 zPdjWuXNCQaca;I$I||SJ&SclnCk0BL392F=WRyMQ%F9pLj}Rlu-{EYFNQaPihPIdE zATsFxt6^%;7rt4-qdaKbYqS~phoTP9&82wQ1W#o(ZRXCtyG;#o^975E(J%R$sH`UL zyFpwMm*+7uEKlmJ+5I4(aKJGmK~E?wwAhZ9>6P58<4J_trFEloqLss)2SJ1jW0DlJ zxXI1Sw*PsTB>@M)#Xca~<;5Z`P4c_1j#jv-qOtJ}Q(zmt>SF7~>lUW9_ZDaDyf)#2 zVz=cIFP_DP&)L9U0M*J~ zge3E(b;6x1Xh+54@KHJM7nd#u^)YHECJKpWB*44biY7cT!b4Ev0Xy7730TB_-?^5v zN-bmYJ7q+Nh1>m$7@r{xJD0@56yenwf*>#T`4M{WDNB~xY&<_~vcwtmzEJ*cJ2zZq zz@IUTPU0Tw_wbJE&%~1NbHET^sj_}Z)ki5r_;AJdO>{Y3?C(D^zSn1m9X6&CM35C- zD9Xe{92?`V4b)F73!~Xlb{eX+0NmXhBH5GL(}{GZ-fz+Y_(&X#j-*OdYKq!1vZQl2 z!w@VNKW+NO^`55`l-SZD1Gwe+gkNC1^Q$*GH<=Bod;#;+v+KAf3JTmoYVIwizJ_ z`?fL*P)2iV+;Yus{_iPOl z^XeUUnr0!IWytEW>uGqDId;PbGg7~8N3lK@C|$X@sgY--B8mK@o$fY-|NHe{)Ns9l z45s0b3L##A$?JtmFDI6hHb4oJ4XExLowoF6t8}7c9PwWs@p! z!)HGWFp$Z??*s!=d%xry%UmQ$C$ zyD`Sb7JVnPQ%){`fD&8#pxszwhQ8+x(e&9mhZA2UxXPP33F!1bcrB*}o|QyLYk49eU1t>M(mBs{h%&O^D?MP9$2>V_v61_o(}TyrMKZb{ z+oD5it05nQ87-ay%*Cm z)^vT=wvP5VdG6UIe6xK1 zap{~Ydpcje!035WTyyp9!KKH~?^|fMgzFQIC$0;4B9FiX;;U^6#PVvE7qTp_cM$D3 z$v>P<5Tek zqOxY3A;|9&f**x{l&@|tIpB@}qxxO2aduSQwMf+GtQ`*IobRM(;RgDk81G3kKeTfzLL`xkBB=7h{Y zX@VsUhd?gS<*DAR7r+|xgt(Xzfg?oGwox}DYk1YzPCxHX_*Hs}(a`3&eacEbHgh(n z=OoQEyzFLc<(=S~A>Pu#zj+zbNUCFuk9kEv*poF!+%7vdQ1aa2>yM7Ya+eoK(Z_qi z+g(#H=y9mGWR2R-U@2?}2E;Pf(hEZ#NWeZwqNKPa_c|~dZ^S3*ZZ*D^QgrP{S!d;hE5HoSI9@y(j`%sUZu-w2jyoUqhi>y z8s`8e(#PO;G$pvQt#g=R9{v>=8m$_2@Mown%m$k-dpX;hMTm%TK*JBc#v1J)(Uanp zyv56C$f2lY$fx2Kj0Dc)_gr4($t;vjA97da8RVmolu*asyNhu5%k$A_VG0BxLs}MZFkLS_Lz2^z< zE+?Q}QQzg)HA|lu1@=kGih~LKCf%g`;!z&~_1m0MZprd{fWz5Q|atv^1%`5i{0d3mTvGGNFc^#SoQeufX&o|T& ziieH2*#BCcv$I0iQ$wJxtV@NzFs%NE2zJ?rD6yUwGLSGU1Ib zFG8!*VS#LWblywpe@FDfB+%lNFJR*EvB6v@L<#@6i7@RKAf|H#t}0n-xo{~K6WOTs zrTQO9aRaexHY{yC#f)`Rnx3&@4hTIf3yr$5$Iit1u2ct`+QF;)+`nEK+HnHJ-&KL^ zFhJF;<2=B5cMs*fL~d(7in34Sn4gE637J}uIwzxI3wfAIdMkt;4KnA7DrM8hk<`te^Xbbe!x7{2<9(*Aa|~D{t_8QH33I zn+G_Bk(&{8L%YT0pwT*>|NPm^${)*NPWAcPf!qdNR7lSGQ8ST~p{obh-zpuhv9Z$x)H*_d2&$udSgY3;yFLzoiGJ|$~1Jqe8 zrmkH#OQzi#^3)-2X=WcDiXQ6z7^f~_pXnRpqS$YBAoDZgYR}fo$V3gEC336yhb;m^ zjri+aDk@Rribjf`qCiy6Gdt2|pG~|Wz=($9sgkCo9Im*0@zj|mjPtAu3D4`Vn7VlR zIeAem?wgE`;X)duT7pU0bTA;)Ki6GY<7ub&>pxqY_>+$UceLT3s`t45pSExP(wJ zn=@=h;$DG(Q3~(xTPE%vhYs0kZGUi&OM|$qk(`*2FL~tQ2!m53Ci6iBA*j~D$SrXt zkG2Sm(@O{LtbFYa~M!NxpP>^l`2(>*Rv?vCVcVV!CF@Wa{ubHr>{v`xbsVjyFhv?GN&& zhc~2`GUFeP{eSE8bFlBz&D1D^oGwYfGoVKOIU0nC;*QfrC$+sID3(*(S2D1P#_7`f zKFJ@JU0?DY^iE<{9o@f_2NHJd47laM)R66IXB*4g4ktYC**lz=|Ic8lI!adjJ$KD~ zzWq+9%9K6pdHeb0M-OSN7Q`^TuUgRwla=%Y1R}R5`${4(3C||>)psReWVih=Kh8j! zXT70v627lQ@9KLi_`@2Q*h}*43@f7BQ6Un&E+Vp{UF`t}-@xC>vO=Z3AZT%WcLaaD z)fd8bE@HRcU^DD3Tq7{MYH-okw4`H~EZpKc#`UY2WV6wr^r=89Q*&=>T4_DXdQUr9 zK1R+s8d$>TTVPC{=J^n?T>OIY4cA&o?Hs;lm~i58@gDJusOV|GP3V`IN7|H5=FjTQ z#PlUG*a=bZ&Bint^8^I4a!s(1J)j{&8>rI%#}E74vl~bjvEo>WiNSdRSrl4>b~qQE z^3Bbi>yzTGAjG3^b z%mmKcemRb80Ch_6p|mx=r{HefEMl<1Ra=^}=_4tOhR?B!7e^3v-`Q()kyK*rV`Z*FXY!l7}L8gjM&K)=5HQ$#W262*Az8Rh($ literal 3510 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 diff --git a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift index 7bbda68136..bb2311b8dd 100644 --- a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift +++ b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift @@ -119,6 +119,10 @@ final class IAPPaymentsService: NSObject, IAPPaymentsServiceProtocol { ) } + guard payload.userID == self.userAccountService.currentUserID else { + return reportRetryValidateReceiptFailed(error: Error.paymentUserChanged) + } + self.validateReceipt(transaction: transaction, payload: payload, forceRefreshReceipt: true) } diff --git a/Stepic/Sources/Modules/CourseInfo/CourseInfoAssembly.swift b/Stepic/Sources/Modules/CourseInfo/CourseInfoAssembly.swift index 2b0d1ef418..90cf182a75 100644 --- a/Stepic/Sources/Modules/CourseInfo/CourseInfoAssembly.swift +++ b/Stepic/Sources/Modules/CourseInfo/CourseInfoAssembly.swift @@ -76,6 +76,7 @@ final class CourseInfoAssembly: Assembly { urlFactory: StepikURLFactory(), dataBackUpdateService: dataBackUpdateService, iapService: IAPService.shared, + iapPaymentsCache: IAPPaymentsCache(userAccountService: UserAccountService()), analytics: StepikAnalytics.shared, remoteConfig: RemoteConfig.shared, courseViewSource: self.courseViewSource diff --git a/Stepic/Sources/Modules/CourseInfo/CourseInfoDataFlow.swift b/Stepic/Sources/Modules/CourseInfo/CourseInfoDataFlow.swift index 6517243f1e..e592829b76 100644 --- a/Stepic/Sources/Modules/CourseInfo/CourseInfoDataFlow.swift +++ b/Stepic/Sources/Modules/CourseInfo/CourseInfoDataFlow.swift @@ -49,6 +49,7 @@ enum CourseInfo { let mobileTier: MobileTierPlainObject? let shouldCheckIAPPurchaseSupport: Bool let isSupportedIAPPurchase: Bool + let isRestorePurchaseAvailable: Bool } var result: StepikResult @@ -338,6 +339,31 @@ enum CourseInfo { } } + /// Try to restore course purchase + enum PaidCourseRestorePurchase { + struct Request {} + + struct Response { + let state: State + + enum State { + case inProgress + case error(Error) + case success + } + } + + struct ViewModel { + let state: State + + enum State { + case inProgress + case error(title: String, message: String) + case success(message: String) + } + } + } + /// Update remind purchase course notification enum PurchaseNotificationUpdate { struct Request {} diff --git a/Stepic/Sources/Modules/CourseInfo/CourseInfoHeaderViewModel.swift b/Stepic/Sources/Modules/CourseInfo/CourseInfoHeaderViewModel.swift index 3e9fea72b6..c06aaa8f13 100644 --- a/Stepic/Sources/Modules/CourseInfo/CourseInfoHeaderViewModel.swift +++ b/Stepic/Sources/Modules/CourseInfo/CourseInfoHeaderViewModel.swift @@ -20,6 +20,7 @@ struct CourseInfoHeaderViewModel { let isWishlistAvailable: Bool let isTryForFreeAvailable: Bool let isRevenueAvailable: Bool + let isRestorePurchaseAvailable: Bool let unsupportedIAPPurchaseText: String? let buttonDescription: ButtonDescription diff --git a/Stepic/Sources/Modules/CourseInfo/CourseInfoInteractor.swift b/Stepic/Sources/Modules/CourseInfo/CourseInfoInteractor.swift index ee7ef49d44..24d258b7cb 100644 --- a/Stepic/Sources/Modules/CourseInfo/CourseInfoInteractor.swift +++ b/Stepic/Sources/Modules/CourseInfo/CourseInfoInteractor.swift @@ -1,5 +1,6 @@ import Foundation import PromiseKit +import StoreKit // swiftlint:disable file_length protocol CourseInfoInteractorProtocol { @@ -18,6 +19,7 @@ protocol CourseInfoInteractorProtocol { func doSubmoduleControllerAppearanceUpdate(request: CourseInfo.SubmoduleAppearanceUpdate.Request) func doSubmodulesRegistration(request: CourseInfo.SubmoduleRegistration.Request) func doIAPReceiptValidationRetry(request: CourseInfo.IAPReceiptValidationRetry.Request) + func doRestorePurchase(request: CourseInfo.PaidCourseRestorePurchase.Request) func doPurchaseCourseNotificationUpdate(request: CourseInfo.PurchaseNotificationUpdate.Request) } @@ -38,6 +40,7 @@ final class CourseInfoInteractor: CourseInfoInteractorProtocol { private let courseViewSource: AnalyticsEvent.CourseViewSource private let iapService: IAPServiceProtocol + private let iapPaymentsCache: IAPPaymentsCacheProtocol private let dataBackUpdateService: DataBackUpdateServiceProtocol @@ -59,6 +62,7 @@ final class CourseInfoInteractor: CourseInfoInteractorProtocol { private var currentPromoCode: PromoCode? private var currentMobileTier: MobileTierPlainObject? + private var isRestorePurchaseInProgress = false private var shouldCheckIAPPurchaseSupport: Bool { (self.currentCourse?.isPaid ?? false) && self.remoteConfig.coursePurchaseFlow == .iap @@ -118,6 +122,7 @@ final class CourseInfoInteractor: CourseInfoInteractorProtocol { urlFactory: StepikURLFactory, dataBackUpdateService: DataBackUpdateServiceProtocol, iapService: IAPServiceProtocol, + iapPaymentsCache: IAPPaymentsCacheProtocol, analytics: Analytics, remoteConfig: RemoteConfig, courseViewSource: AnalyticsEvent.CourseViewSource @@ -136,6 +141,7 @@ final class CourseInfoInteractor: CourseInfoInteractorProtocol { self.urlFactory = urlFactory self.dataBackUpdateService = dataBackUpdateService self.iapService = iapService + self.iapPaymentsCache = iapPaymentsCache self.analytics = analytics self.remoteConfig = remoteConfig @@ -413,6 +419,65 @@ final class CourseInfoInteractor: CourseInfoInteractorProtocol { } } + func doRestorePurchase(request: CourseInfo.PaidCourseRestorePurchase.Request) { + if self.isRestorePurchaseInProgress { + return + } + self.isRestorePurchaseInProgress = true + + self.presenter.presentPaidCourseRestorePurchaseResult(response: .init(state: .inProgress)) + self.analytics.send(.courseRestoreCoursePurchasePressed(id: self.courseID, source: .courseScreen)) + + firstly { () -> Guarantee in + if let currentMobileTier = self.currentMobileTier { + return .value(currentMobileTier) + } else if let course = self.currentCourse { + return self.fetchMobileTier( + course: course, + dataSourceType: .remote + ).then { mobileTierOrNil -> Guarantee in + if let mobileTier = mobileTierOrNil { + self.currentMobileTier = mobileTier + } + return .value(mobileTierOrNil) + } + } + return .value(nil) + } + .compactMap { $0?.promoTier ?? $0?.priceTier } + .done { purchaseMobileTier in + if self.iapPaymentsCache.getCoursePayment(for: self.courseID) == nil { + self.iapService + .fetchProduct(for: purchaseMobileTier) + .compactMap { $0 } + .done { product in + self.iapPaymentsCache.insertCoursePayment( + courseID: self.courseID, + promoCode: self.currentMobileTier?.promoCodeName, + product: product + ) + self.iapService.retryValidateReceipt( + courseID: self.courseID, + mobileTier: purchaseMobileTier, + delegate: self + ) + } + .catch { error in + self.iapService(self.iapService, didFailPurchaseCourse: self.courseID, withError: error) + } + } else { + self.iapService.retryValidateReceipt( + courseID: self.courseID, + mobileTier: purchaseMobileTier, + delegate: self + ) + } + } + .catch { error in + self.iapService(self.iapService, didFailPurchaseCourse: self.courseID, withError: error) + } + } + func doPurchaseCourseNotificationUpdate(request: CourseInfo.PurchaseNotificationUpdate.Request) { self.coursePurchaseReminder.updatePurchaseNotification(for: self.courseID) } @@ -437,7 +502,11 @@ final class CourseInfoInteractor: CourseInfoInteractorProtocol { promoCode: self.currentPromoCode, mobileTier: self.currentMobileTier, shouldCheckIAPPurchaseSupport: self.shouldCheckIAPPurchaseSupport, - isSupportedIAPPurchase: self.isSupportedIAPPurchase + isSupportedIAPPurchase: self.isSupportedIAPPurchase, + isRestorePurchaseAvailable: self.userAccountService.isAuthorized + && self.remoteConfig.coursePurchaseFlow == .iap + && self.currentCourse.require().isPaid + && !self.currentCourse.require().isPurchased ) } @@ -710,11 +779,33 @@ extension CourseInfoInteractor: IAPServiceDelegate { ) { self.presenter.presentWaitingState(response: .init(shouldDismiss: true)) - guard let course = self.currentCourse else { + guard let course = self.currentCourse, course.id == courseID else { return } - if let iapServiceError = error as? IAPService.Error { + if self.isRestorePurchaseInProgress { + self.isRestorePurchaseInProgress = false + + if let iapServiceError = error as? IAPService.Error { + self.analytics.send( + .courseBuyCourseVerificationFailure( + id: courseID, + errorType: iapServiceError.analyticsErrorType, + errorDescription: iapServiceError.analyticsErrorDescription + ) + ) + } else { + self.analytics.send( + .courseBuyCourseVerificationFailure( + id: courseID, + errorType: String(describing: error), + errorDescription: error.localizedDescription + ) + ) + } + + self.presenter.presentPaidCourseRestorePurchaseResult(response: .init(state: .error(error))) + } else if let iapServiceError = error as? IAPService.Error { switch iapServiceError { case .unsupportedCourse, .noProductIDsFound, .noProductsFound, .productsRequestFailed: self.presenter.presentPaidCourseBuying( @@ -749,6 +840,21 @@ extension CourseInfoInteractor: IAPServiceDelegate { if self.currentCourse?.isInWishlist ?? false { self.provider.deleteCourseFromWishlist().cauterize() } + + if self.isRestorePurchaseInProgress { + self.isRestorePurchaseInProgress = false + + self.analytics.send( + .courseBuyCourseVerificationSuccess( + id: self.courseID, + source: .courseScreen, + isWishlisted: self.currentCourse?.isInWishlist ?? false, + promoCode: self.currentMobileTier?.promoTier != nil ? self.currentMobileTier?.promoCodeName : nil + ) + ) + + self.presenter.presentPaidCourseRestorePurchaseResult(response: .init(state: .success)) + } } } diff --git a/Stepic/Sources/Modules/CourseInfo/CourseInfoPresenter.swift b/Stepic/Sources/Modules/CourseInfo/CourseInfoPresenter.swift index 63e7787a1b..65ccd13a49 100644 --- a/Stepic/Sources/Modules/CourseInfo/CourseInfoPresenter.swift +++ b/Stepic/Sources/Modules/CourseInfo/CourseInfoPresenter.swift @@ -16,6 +16,7 @@ protocol CourseInfoPresenterProtocol { func presentAuthorization(response: CourseInfo.AuthorizationPresentation.Response) func presentPaidCourseBuying(response: CourseInfo.PaidCourseBuyingPresentation.Response) func presentPaidCoursePurchaseModal(response: CourseInfo.PaidCoursePurchaseModalPresentation.Response) + func presentPaidCourseRestorePurchaseResult(response: CourseInfo.PaidCourseRestorePurchase.Response) func presentIAPNotAllowed(response: CourseInfo.IAPNotAllowedPresentation.Response) func presentIAPReceiptValidationFailed(response: CourseInfo.IAPReceiptValidationFailedPresentation.Response) func presentIAPPaymentFailed(response: CourseInfo.IAPPaymentFailedPresentation.Response) @@ -45,7 +46,8 @@ final class CourseInfoPresenter: CourseInfoPresenterProtocol { promoCode: data.promoCode, mobileTier: data.mobileTier, shouldCheckIAPPurchaseSupport: data.shouldCheckIAPPurchaseSupport, - isSupportedIAPPurchase: data.isSupportedIAPPurchase + isSupportedIAPPurchase: data.isSupportedIAPPurchase, + isRestorePurchaseAvailable: data.isRestorePurchaseAvailable ) self.viewController?.displayCourse(viewModel: .init(state: .result(data: headerViewModel))) case .failure: @@ -157,6 +159,28 @@ final class CourseInfoPresenter: CourseInfoPresenterProtocol { ) } + func presentPaidCourseRestorePurchaseResult(response: CourseInfo.PaidCourseRestorePurchase.Response) { + switch response.state { + case .inProgress: + self.viewController?.displayPaidCourseRestorePurchaseResult(viewModel: .init(state: .inProgress)) + case .error(let error): + let title = NSLocalizedString("CourseInfoRestorePurchaseErrorTitle", comment: "") + let message = String( + format: NSLocalizedString("CourseInfoRestorePurchaseErrorMessage", comment: ""), + arguments: [error.localizedDescription] + ) + + self.viewController?.displayPaidCourseRestorePurchaseResult( + viewModel: .init(state: .error(title: title, message: message)) + ) + case .success: + let message = NSLocalizedString("CourseInfoRestorePurchaseSuccessMessage", comment: "") + self.viewController?.displayPaidCourseRestorePurchaseResult( + viewModel: .init(state: .success(message: message)) + ) + } + } + func presentIAPNotAllowed(response: CourseInfo.IAPNotAllowedPresentation.Response) { if let payForCourseURL = self.urlFactory.makePayForCourse(id: response.course.id) { self.viewController?.displayIAPNotAllowed( @@ -291,7 +315,8 @@ final class CourseInfoPresenter: CourseInfoPresenterProtocol { promoCode: PromoCode?, mobileTier: MobileTierPlainObject?, shouldCheckIAPPurchaseSupport: Bool, - isSupportedIAPPurchase: Bool + isSupportedIAPPurchase: Bool, + isRestorePurchaseAvailable: Bool ) -> CourseInfoHeaderViewModel { let rating = course.reviewSummary?.rating ?? 0 @@ -323,6 +348,7 @@ final class CourseInfoPresenter: CourseInfoPresenterProtocol { isWishlistAvailable: isWishlistAvailable, isTryForFreeAvailable: isTryForFreeAvailable, isRevenueAvailable: isCourseRevenueAvailable && course.canViewRevenue, + isRestorePurchaseAvailable: isRestorePurchaseAvailable, unsupportedIAPPurchaseText: unsupportedIAPPurchaseText, buttonDescription: self.makeButtonDescription( course: course, diff --git a/Stepic/Sources/Modules/CourseInfo/CourseInfoViewController.swift b/Stepic/Sources/Modules/CourseInfo/CourseInfoViewController.swift index f227d10ae9..a30708dab1 100644 --- a/Stepic/Sources/Modules/CourseInfo/CourseInfoViewController.swift +++ b/Stepic/Sources/Modules/CourseInfo/CourseInfoViewController.swift @@ -20,6 +20,7 @@ protocol CourseInfoViewControllerProtocol: AnyObject { func displayAuthorization(viewModel: CourseInfo.AuthorizationPresentation.ViewModel) func displayPaidCourseBuying(viewModel: CourseInfo.PaidCourseBuyingPresentation.ViewModel) func displayPaidCoursePurchaseModal(viewModel: CourseInfo.PaidCoursePurchaseModalPresentation.ViewModel) + func displayPaidCourseRestorePurchaseResult(viewModel: CourseInfo.PaidCourseRestorePurchase.ViewModel) func displayIAPNotAllowed(viewModel: CourseInfo.IAPNotAllowedPresentation.ViewModel) func displayIAPReceiptValidationFailed(viewModel: CourseInfo.IAPReceiptValidationFailedPresentation.ViewModel) func displayIAPPaymentFailed(viewModel: CourseInfo.IAPPaymentFailedPresentation.ViewModel) @@ -65,6 +66,11 @@ final class CourseInfoViewController: UIViewController { action: #selector(self.actionButtonClicked) ) + private lazy var restorePurchaseErrorContactSupportController = ContactSupportController( + subject: NSLocalizedString("CourseInfoPurchaseModalPurchaseErrorContactSupportSubject", comment: ""), + presentationController: self + ) + // Element is nil when view controller was not initialized yet private var submodulesControllers: [UIViewController?] = [] private var submodulesInputs: [CourseInfoSubmoduleProtocol?] = [] @@ -285,6 +291,19 @@ final class CourseInfoViewController: UIViewController { @objc private func actionButtonClicked() { let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) + + if self.storedViewModel?.isRestorePurchaseAvailable ?? false { + alert.addAction( + UIAlertAction( + title: NSLocalizedString("CourseInfoRestorePurchaseTitle", comment: ""), + style: .default, + handler: { [weak self] _ in + self?.interactor.doRestorePurchase(request: .init()) + } + ) + ) + } + alert.addAction( UIAlertAction( title: NSLocalizedString("Share", comment: ""), @@ -717,6 +736,33 @@ extension CourseInfoViewController: CourseInfoViewControllerProtocol { self.presentIfPanModalWithCustomModalPresentationStyle(assembly.makeModule()) } + func displayPaidCourseRestorePurchaseResult(viewModel: CourseInfo.PaidCourseRestorePurchase.ViewModel) { + switch viewModel.state { + case .inProgress: + SVProgressHUD.show() + case .error(let title, let message): + let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) + alert.addAction( + UIAlertAction( + title: NSLocalizedString("CourseInfoRestorePurchaseAlertCancelTitle", comment: ""), + style: .cancel + ) + ) + alert.addAction( + UIAlertAction( + title: NSLocalizedString("CourseInfoRestorePurchaseAlertContactSupportTitle", comment: ""), + style: .default, + handler: { [weak self] _ in + self?.restorePurchaseErrorContactSupportController.contactSupport() + } + ) + ) + self.present(module: alert) + case .success(let message): + SVProgressHUD.showSuccess(withStatus: message) + } + } + func displayIAPNotAllowed(viewModel: CourseInfo.IAPNotAllowedPresentation.ViewModel) { let alert = UIAlertController(title: viewModel.title, message: viewModel.message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .cancel, handler: nil)) diff --git a/Stepic/en.lproj/Localizable.strings b/Stepic/en.lproj/Localizable.strings index 4aad2be169..bb5bc96b05 100644 --- a/Stepic/en.lproj/Localizable.strings +++ b/Stepic/en.lproj/Localizable.strings @@ -476,6 +476,13 @@ CourseInfoAddToWishlistFailureMessage = "Failed to Add Course to Wishlist"; CourseInfoRemoveFromWishlistSuccessMessage = "Course Successfully Removed from Wishlist"; CourseInfoRemoveFromWishlistFailureMessage = "Failed to Remove Course from Wishlist"; +CourseInfoRestorePurchaseTitle = "Restore Purchase"; +CourseInfoRestorePurchaseSuccessMessage = "Purchase Successfully Restored"; +CourseInfoRestorePurchaseErrorTitle = "Failed to Restore Purchase"; +CourseInfoRestorePurchaseErrorMessage = "Try to restore the purchase again later and contact support, if the error persists.\nError: %@"; +CourseInfoRestorePurchaseAlertCancelTitle = "Cancel"; +CourseInfoRestorePurchaseAlertContactSupportTitle = "Contact Support"; + CourseInfoTabInfo = "Info"; CourseInfoTabSyllabus = "Syllabus"; CourseInfoTabSyllabusSectionProgressTitle = "%@/%@ points"; diff --git a/Stepic/ru.lproj/Localizable.strings b/Stepic/ru.lproj/Localizable.strings index 4a8041f681..544317fc2f 100644 --- a/Stepic/ru.lproj/Localizable.strings +++ b/Stepic/ru.lproj/Localizable.strings @@ -478,6 +478,13 @@ CourseInfoAddToWishlistFailureMessage = "Не удалось добавить к CourseInfoRemoveFromWishlistSuccessMessage = "Курс успешно убран из списка желаний"; CourseInfoRemoveFromWishlistFailureMessage = "Не удалось убрать курс из списка желаний"; +CourseInfoRestorePurchaseTitle = "Восстановить покупку"; +CourseInfoRestorePurchaseSuccessMessage = "Покупка успешно восстановлена"; +CourseInfoRestorePurchaseErrorTitle = "Не удалось восстановить покупку"; +CourseInfoRestorePurchaseErrorMessage = "Попробуйте восстановить покупку позже и свяжитесь с поддержкой, если ошибка не будет устранена.\nОшибка: %@"; +CourseInfoRestorePurchaseAlertCancelTitle = "Отменить"; +CourseInfoRestorePurchaseAlertContactSupportTitle = "Связаться с поддержкой"; + CourseInfoTabInfo = "Инфо"; CourseInfoTabSyllabus = "Модули"; CourseInfoTabSyllabusSectionProgressTitle = "%@/%@ баллов"; From a2c62491f1ec6436486eb5c1936aff29c88f5983 Mon Sep 17 00:00:00 2001 From: Stepik Bot Date: Wed, 19 Jan 2022 05:03:20 +0000 Subject: [PATCH 09/16] "Set version to 1.206 & bump build" --- Stepic.xcodeproj/project.pbxproj | 24 +++++++++++----------- Stepic/Info-Develop.plist | 4 ++-- Stepic/Info-Production.plist | 4 ++-- Stepic/Info-Release.plist | 4 ++-- StepicTests/Info-Develop.plist | 4 ++-- StepicTests/Info-Production.plist | 4 ++-- StepicTests/Info-Release.plist | 4 ++-- StickerPackExtension/Info-Develop.plist | 4 ++-- StickerPackExtension/Info-Production.plist | 4 ++-- StickerPackExtension/Info-Release.plist | 4 ++-- 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Stepic.xcodeproj/project.pbxproj b/Stepic.xcodeproj/project.pbxproj index ad900a4199..30b7804350 100644 --- a/Stepic.xcodeproj/project.pbxproj +++ b/Stepic.xcodeproj/project.pbxproj @@ -12954,7 +12954,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Production.plist"; @@ -12979,7 +12979,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Production.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -13121,7 +13121,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Production.plist"; @@ -13151,7 +13151,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; @@ -13242,7 +13242,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Develop.plist"; @@ -13294,7 +13294,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Develop.plist"; @@ -13375,7 +13375,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Develop.plist"; @@ -13423,7 +13423,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Develop.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -13943,7 +13943,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Release.plist"; @@ -13997,7 +13997,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Release.plist"; @@ -14079,7 +14079,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Release.plist"; @@ -14127,7 +14127,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 399; + CURRENT_PROJECT_VERSION = 400; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Release.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; diff --git a/Stepic/Info-Develop.plist b/Stepic/Info-Develop.plist index eb12d6c62f..c04b6c934d 100644 --- a/Stepic/Info-Develop.plist +++ b/Stepic/Info-Develop.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.205-develop + 1.206-develop CFBundleSignature ???? CFBundleURLTypes @@ -62,7 +62,7 @@ CFBundleVersion - 399 + 400 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/Stepic/Info-Production.plist b/Stepic/Info-Production.plist index 3074407569..70c98eef93 100644 --- a/Stepic/Info-Production.plist +++ b/Stepic/Info-Production.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.205 + 1.206 CFBundleSignature ???? CFBundleURLTypes @@ -62,7 +62,7 @@ CFBundleVersion - 399 + 400 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/Stepic/Info-Release.plist b/Stepic/Info-Release.plist index e47f211768..70d074c818 100644 --- a/Stepic/Info-Release.plist +++ b/Stepic/Info-Release.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.205-release + 1.206-release CFBundleSignature ???? CFBundleURLTypes @@ -62,7 +62,7 @@ CFBundleVersion - 399 + 400 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/StepicTests/Info-Develop.plist b/StepicTests/Info-Develop.plist index a0f3f6c09c..987c612176 100644 --- a/StepicTests/Info-Develop.plist +++ b/StepicTests/Info-Develop.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.205-develop + 1.206-develop CFBundleSignature ???? CFBundleVersion - 399 + 400 diff --git a/StepicTests/Info-Production.plist b/StepicTests/Info-Production.plist index 6d1af2909d..014a8ea8e0 100644 --- a/StepicTests/Info-Production.plist +++ b/StepicTests/Info-Production.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.205 + 1.206 CFBundleSignature ???? CFBundleVersion - 399 + 400 diff --git a/StepicTests/Info-Release.plist b/StepicTests/Info-Release.plist index e246f64eae..d7e9d4472b 100644 --- a/StepicTests/Info-Release.plist +++ b/StepicTests/Info-Release.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.205-release + 1.206-release CFBundleSignature ???? CFBundleVersion - 399 + 400 diff --git a/StickerPackExtension/Info-Develop.plist b/StickerPackExtension/Info-Develop.plist index 481fa95598..3f13cfe3d8 100644 --- a/StickerPackExtension/Info-Develop.plist +++ b/StickerPackExtension/Info-Develop.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.205-develop + 1.206-develop CFBundleVersion - 399 + 400 UIRequiredDeviceCapabilities arm64 diff --git a/StickerPackExtension/Info-Production.plist b/StickerPackExtension/Info-Production.plist index 90cf28953c..55746fa6ac 100644 --- a/StickerPackExtension/Info-Production.plist +++ b/StickerPackExtension/Info-Production.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.205 + 1.206 CFBundleVersion - 399 + 400 UIRequiredDeviceCapabilities arm64 diff --git a/StickerPackExtension/Info-Release.plist b/StickerPackExtension/Info-Release.plist index df7017017c..f606487def 100644 --- a/StickerPackExtension/Info-Release.plist +++ b/StickerPackExtension/Info-Release.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 1.205-release + 1.206-release CFBundleVersion - 399 + 400 UIRequiredDeviceCapabilities arm64 From 4e798887e393bad38485ecdb0fae6d6460f0f886 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Wed, 19 Jan 2022 08:21:40 +0300 Subject: [PATCH 10/16] Update release notes for beta testers --- fastlane/release-notes.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fastlane/release-notes.txt b/fastlane/release-notes.txt index 2fd822450b..82ac7d48a1 100644 --- a/fastlane/release-notes.txt +++ b/fastlane/release-notes.txt @@ -1,3 +1,2 @@ Что тестировать: -- Замечания по доходам курса APPS-3494 -- Отображение manual course benefit в доходах курса APPS-3496 \ No newline at end of file +- iOS: Новый flow покупки курса / Восстановление покупки на экране курса APPS-3553 \ No newline at end of file From 881dae90abdf6ff025cd3024625029809c4dd409 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Wed, 19 Jan 2022 08:21:57 +0300 Subject: [PATCH 11/16] Set version to 1.206 & bump build --- Stepic.xcodeproj/project.pbxproj | 24 +++++++++++----------- Stepic/Info-Develop.plist | 2 +- Stepic/Info-Production.plist | 2 +- Stepic/Info-Release.plist | 2 +- StepicTests/Info-Develop.plist | 2 +- StepicTests/Info-Production.plist | 2 +- StepicTests/Info-Release.plist | 2 +- StepicUITests/Info-Develop.plist | 4 ++-- StepicUITests/Info-Production.plist | 4 ++-- StepicUITests/Info-Release.plist | 4 ++-- StepicWidget/Info-Develop.plist | 4 ++-- StepicWidget/Info-Production.plist | 4 ++-- StepicWidget/Info-Release.plist | 4 ++-- StickerPackExtension/Info-Develop.plist | 2 +- StickerPackExtension/Info-Production.plist | 2 +- StickerPackExtension/Info-Release.plist | 2 +- 16 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Stepic.xcodeproj/project.pbxproj b/Stepic.xcodeproj/project.pbxproj index 30b7804350..b203316b80 100644 --- a/Stepic.xcodeproj/project.pbxproj +++ b/Stepic.xcodeproj/project.pbxproj @@ -12954,7 +12954,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Production.plist"; @@ -12979,7 +12979,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Production.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -13121,7 +13121,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Production.plist"; @@ -13151,7 +13151,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; @@ -13242,7 +13242,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Develop.plist"; @@ -13294,7 +13294,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Develop.plist"; @@ -13375,7 +13375,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Develop.plist"; @@ -13423,7 +13423,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Develop.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -13943,7 +13943,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Release.plist"; @@ -13997,7 +13997,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Release.plist"; @@ -14079,7 +14079,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Release.plist"; @@ -14127,7 +14127,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 400; + CURRENT_PROJECT_VERSION = 401; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Release.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; diff --git a/Stepic/Info-Develop.plist b/Stepic/Info-Develop.plist index c04b6c934d..4973d8c350 100644 --- a/Stepic/Info-Develop.plist +++ b/Stepic/Info-Develop.plist @@ -62,7 +62,7 @@ CFBundleVersion - 400 + 401 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/Stepic/Info-Production.plist b/Stepic/Info-Production.plist index 70c98eef93..e0110ce774 100644 --- a/Stepic/Info-Production.plist +++ b/Stepic/Info-Production.plist @@ -62,7 +62,7 @@ CFBundleVersion - 400 + 401 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/Stepic/Info-Release.plist b/Stepic/Info-Release.plist index 70d074c818..b848581ba5 100644 --- a/Stepic/Info-Release.plist +++ b/Stepic/Info-Release.plist @@ -62,7 +62,7 @@ CFBundleVersion - 400 + 401 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/StepicTests/Info-Develop.plist b/StepicTests/Info-Develop.plist index 987c612176..32844433d1 100644 --- a/StepicTests/Info-Develop.plist +++ b/StepicTests/Info-Develop.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 400 + 401 diff --git a/StepicTests/Info-Production.plist b/StepicTests/Info-Production.plist index 014a8ea8e0..895b001af7 100644 --- a/StepicTests/Info-Production.plist +++ b/StepicTests/Info-Production.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 400 + 401 diff --git a/StepicTests/Info-Release.plist b/StepicTests/Info-Release.plist index d7e9d4472b..1c4b1a1468 100644 --- a/StepicTests/Info-Release.plist +++ b/StepicTests/Info-Release.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 400 + 401 diff --git a/StepicUITests/Info-Develop.plist b/StepicUITests/Info-Develop.plist index 67b00bab5e..a92f2976c8 100644 --- a/StepicUITests/Info-Develop.plist +++ b/StepicUITests/Info-Develop.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.205-develop + 1.206-develop CFBundleVersion - 399 + 401 diff --git a/StepicUITests/Info-Production.plist b/StepicUITests/Info-Production.plist index 1c88c5a10d..bcc1f8afa1 100644 --- a/StepicUITests/Info-Production.plist +++ b/StepicUITests/Info-Production.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.205 + 1.206 CFBundleVersion - 399 + 401 diff --git a/StepicUITests/Info-Release.plist b/StepicUITests/Info-Release.plist index 988c763449..c6aa976487 100644 --- a/StepicUITests/Info-Release.plist +++ b/StepicUITests/Info-Release.plist @@ -15,8 +15,8 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.205-release + 1.206-release CFBundleVersion - 399 + 401 diff --git a/StepicWidget/Info-Develop.plist b/StepicWidget/Info-Develop.plist index 0debc6d347..9cd2b37d87 100644 --- a/StepicWidget/Info-Develop.plist +++ b/StepicWidget/Info-Develop.plist @@ -17,9 +17,9 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.205-develop + 1.206-develop CFBundleVersion - 399 + 401 NSExtension NSExtensionPointIdentifier diff --git a/StepicWidget/Info-Production.plist b/StepicWidget/Info-Production.plist index 5b8f8e89ff..99dcb239c0 100644 --- a/StepicWidget/Info-Production.plist +++ b/StepicWidget/Info-Production.plist @@ -17,9 +17,9 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.205 + 1.206 CFBundleVersion - 399 + 401 NSExtension NSExtensionPointIdentifier diff --git a/StepicWidget/Info-Release.plist b/StepicWidget/Info-Release.plist index be45e6ad20..4bd9b72135 100644 --- a/StepicWidget/Info-Release.plist +++ b/StepicWidget/Info-Release.plist @@ -17,9 +17,9 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.205-release + 1.206-release CFBundleVersion - 399 + 401 NSExtension NSExtensionPointIdentifier diff --git a/StickerPackExtension/Info-Develop.plist b/StickerPackExtension/Info-Develop.plist index 3f13cfe3d8..09adea3a21 100644 --- a/StickerPackExtension/Info-Develop.plist +++ b/StickerPackExtension/Info-Develop.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-develop CFBundleVersion - 400 + 401 UIRequiredDeviceCapabilities arm64 diff --git a/StickerPackExtension/Info-Production.plist b/StickerPackExtension/Info-Production.plist index 55746fa6ac..70a6a29595 100644 --- a/StickerPackExtension/Info-Production.plist +++ b/StickerPackExtension/Info-Production.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206 CFBundleVersion - 400 + 401 UIRequiredDeviceCapabilities arm64 diff --git a/StickerPackExtension/Info-Release.plist b/StickerPackExtension/Info-Release.plist index f606487def..5acdf09d02 100644 --- a/StickerPackExtension/Info-Release.plist +++ b/StickerPackExtension/Info-Release.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-release CFBundleVersion - 400 + 401 UIRequiredDeviceCapabilities arm64 From 93d76c3a0f6c96d9ea4b0907262a3c37add44189 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Wed, 19 Jan 2022 08:27:01 +0300 Subject: [PATCH 12/16] Update release notes for beta testers --- fastlane/release-notes.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fastlane/release-notes.txt b/fastlane/release-notes.txt index 82ac7d48a1..b7ec9df613 100644 --- a/fastlane/release-notes.txt +++ b/fastlane/release-notes.txt @@ -1,2 +1,4 @@ Что тестировать: -- iOS: Новый flow покупки курса / Восстановление покупки на экране курса APPS-3553 \ No newline at end of file +- Замечания по доходам курса APPS-3494 +- Отображение manual course benefit в доходах курса APPS-3496 +- Новый flow покупки курса / Восстановление покупки на экране курса APPS-3553 \ No newline at end of file From a46218b04cfb911c096e2b43e642476abaa7586e Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Wed, 19 Jan 2022 15:08:48 +0300 Subject: [PATCH 13/16] Firstly use cached payload APPS-3553 --- .../Sources/Modules/CourseInfo/CourseInfoInteractor.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Stepic/Sources/Modules/CourseInfo/CourseInfoInteractor.swift b/Stepic/Sources/Modules/CourseInfo/CourseInfoInteractor.swift index 24d258b7cb..55d0e6c675 100644 --- a/Stepic/Sources/Modules/CourseInfo/CourseInfoInteractor.swift +++ b/Stepic/Sources/Modules/CourseInfo/CourseInfoInteractor.swift @@ -428,6 +428,14 @@ final class CourseInfoInteractor: CourseInfoInteractorProtocol { self.presenter.presentPaidCourseRestorePurchaseResult(response: .init(state: .inProgress)) self.analytics.send(.courseRestoreCoursePurchasePressed(id: self.courseID, source: .courseScreen)) + if let cachedCoursePaymentPayload = self.iapPaymentsCache.getCoursePayment(for: self.courseID) { + return self.iapService.retryValidateReceipt( + courseID: self.courseID, + mobileTier: cachedCoursePaymentPayload.productIdentifier, + delegate: self + ) + } + firstly { () -> Guarantee in if let currentMobileTier = self.currentMobileTier { return .value(currentMobileTier) From 685c5c30daa1f3cfb0b8a61938aa05bbb116f116 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Wed, 19 Jan 2022 15:09:28 +0300 Subject: [PATCH 14/16] Bump build --- Stepic.xcodeproj/project.pbxproj | 24 +++++++++++----------- Stepic/Info-Develop.plist | 2 +- Stepic/Info-Production.plist | 2 +- Stepic/Info-Release.plist | 2 +- StepicTests/Info-Develop.plist | 2 +- StepicTests/Info-Production.plist | 2 +- StepicTests/Info-Release.plist | 2 +- StepicUITests/Info-Develop.plist | 2 +- StepicUITests/Info-Production.plist | 2 +- StepicUITests/Info-Release.plist | 2 +- StepicWidget/Info-Develop.plist | 2 +- StepicWidget/Info-Production.plist | 2 +- StepicWidget/Info-Release.plist | 2 +- StickerPackExtension/Info-Develop.plist | 2 +- StickerPackExtension/Info-Production.plist | 2 +- StickerPackExtension/Info-Release.plist | 2 +- 16 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Stepic.xcodeproj/project.pbxproj b/Stepic.xcodeproj/project.pbxproj index b203316b80..3ad37fba4f 100644 --- a/Stepic.xcodeproj/project.pbxproj +++ b/Stepic.xcodeproj/project.pbxproj @@ -12954,7 +12954,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Production.plist"; @@ -12979,7 +12979,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Production.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -13121,7 +13121,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Production.plist"; @@ -13151,7 +13151,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; @@ -13242,7 +13242,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Develop.plist"; @@ -13294,7 +13294,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Develop.plist"; @@ -13375,7 +13375,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Develop.plist"; @@ -13423,7 +13423,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Develop.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -13943,7 +13943,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Release.plist"; @@ -13997,7 +13997,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Release.plist"; @@ -14079,7 +14079,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Release.plist"; @@ -14127,7 +14127,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 401; + CURRENT_PROJECT_VERSION = 402; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Release.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; diff --git a/Stepic/Info-Develop.plist b/Stepic/Info-Develop.plist index 4973d8c350..0f973953c6 100644 --- a/Stepic/Info-Develop.plist +++ b/Stepic/Info-Develop.plist @@ -62,7 +62,7 @@ CFBundleVersion - 401 + 402 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/Stepic/Info-Production.plist b/Stepic/Info-Production.plist index e0110ce774..1b7ab01aaf 100644 --- a/Stepic/Info-Production.plist +++ b/Stepic/Info-Production.plist @@ -62,7 +62,7 @@ CFBundleVersion - 401 + 402 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/Stepic/Info-Release.plist b/Stepic/Info-Release.plist index b848581ba5..31b860d763 100644 --- a/Stepic/Info-Release.plist +++ b/Stepic/Info-Release.plist @@ -62,7 +62,7 @@ CFBundleVersion - 401 + 402 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/StepicTests/Info-Develop.plist b/StepicTests/Info-Develop.plist index 32844433d1..66f1c4bb47 100644 --- a/StepicTests/Info-Develop.plist +++ b/StepicTests/Info-Develop.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 401 + 402 diff --git a/StepicTests/Info-Production.plist b/StepicTests/Info-Production.plist index 895b001af7..fb2338e485 100644 --- a/StepicTests/Info-Production.plist +++ b/StepicTests/Info-Production.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 401 + 402 diff --git a/StepicTests/Info-Release.plist b/StepicTests/Info-Release.plist index 1c4b1a1468..e4f35d2d34 100644 --- a/StepicTests/Info-Release.plist +++ b/StepicTests/Info-Release.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 401 + 402 diff --git a/StepicUITests/Info-Develop.plist b/StepicUITests/Info-Develop.plist index a92f2976c8..eabb3a0d80 100644 --- a/StepicUITests/Info-Develop.plist +++ b/StepicUITests/Info-Develop.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.206-develop CFBundleVersion - 401 + 402 diff --git a/StepicUITests/Info-Production.plist b/StepicUITests/Info-Production.plist index bcc1f8afa1..4b88169ab3 100644 --- a/StepicUITests/Info-Production.plist +++ b/StepicUITests/Info-Production.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.206 CFBundleVersion - 401 + 402 diff --git a/StepicUITests/Info-Release.plist b/StepicUITests/Info-Release.plist index c6aa976487..7375200970 100644 --- a/StepicUITests/Info-Release.plist +++ b/StepicUITests/Info-Release.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.206-release CFBundleVersion - 401 + 402 diff --git a/StepicWidget/Info-Develop.plist b/StepicWidget/Info-Develop.plist index 9cd2b37d87..bc966a47fc 100644 --- a/StepicWidget/Info-Develop.plist +++ b/StepicWidget/Info-Develop.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-develop CFBundleVersion - 401 + 402 NSExtension NSExtensionPointIdentifier diff --git a/StepicWidget/Info-Production.plist b/StepicWidget/Info-Production.plist index 99dcb239c0..fb0901557e 100644 --- a/StepicWidget/Info-Production.plist +++ b/StepicWidget/Info-Production.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206 CFBundleVersion - 401 + 402 NSExtension NSExtensionPointIdentifier diff --git a/StepicWidget/Info-Release.plist b/StepicWidget/Info-Release.plist index 4bd9b72135..da7d311466 100644 --- a/StepicWidget/Info-Release.plist +++ b/StepicWidget/Info-Release.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-release CFBundleVersion - 401 + 402 NSExtension NSExtensionPointIdentifier diff --git a/StickerPackExtension/Info-Develop.plist b/StickerPackExtension/Info-Develop.plist index 09adea3a21..1f3f708327 100644 --- a/StickerPackExtension/Info-Develop.plist +++ b/StickerPackExtension/Info-Develop.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-develop CFBundleVersion - 401 + 402 UIRequiredDeviceCapabilities arm64 diff --git a/StickerPackExtension/Info-Production.plist b/StickerPackExtension/Info-Production.plist index 70a6a29595..e57ca05aae 100644 --- a/StickerPackExtension/Info-Production.plist +++ b/StickerPackExtension/Info-Production.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206 CFBundleVersion - 401 + 402 UIRequiredDeviceCapabilities arm64 diff --git a/StickerPackExtension/Info-Release.plist b/StickerPackExtension/Info-Release.plist index 5acdf09d02..eff9180443 100644 --- a/StickerPackExtension/Info-Release.plist +++ b/StickerPackExtension/Info-Release.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-release CFBundleVersion - 401 + 402 UIRequiredDeviceCapabilities arm64 From d0695b53b5b35fbfa6f65ee082545aa7b05198aa Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Wed, 19 Jan 2022 18:20:17 +0300 Subject: [PATCH 15/16] Use shared instance of IAPPaymentsCache APPS-3553 --- .../InAppPurchases/IAPPaymentsCache.swift | Bin 4194 -> 4269 bytes .../InAppPurchases/IAPPaymentsService.swift | 2 +- .../CourseInfo/CourseInfoAssembly.swift | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsCache.swift b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsCache.swift index f85969e37dd2eb74cefa656b6cb3f9c54560b132..4e2db285fb320e294954d5b5ab0e97a98d3ac629 100644 GIT binary patch literal 4269 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 PM@Uu!6P58<4J_trFEloqLss)2SJ1jW0DlJ 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 diff --git a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift index bb2311b8dd..58b5563266 100644 --- a/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift +++ b/Stepic/Sources/Frameworks/InAppPurchases/IAPPaymentsService.swift @@ -53,7 +53,7 @@ final class IAPPaymentsService: NSObject, IAPPaymentsServiceProtocol { init( paymentQueue: SKPaymentQueue = SKPaymentQueue.default(), - paymentsCache: IAPPaymentsCacheProtocol = IAPPaymentsCache(userAccountService: UserAccountService()), + paymentsCache: IAPPaymentsCacheProtocol = IAPPaymentsCache.shared, receiptValidationService: IAPReceiptValidationServiceProtocol = IAPReceiptValidationService( coursePaymentsNetworkService: CoursePaymentsNetworkService( coursePaymentsAPI: CoursePaymentsAPI() diff --git a/Stepic/Sources/Modules/CourseInfo/CourseInfoAssembly.swift b/Stepic/Sources/Modules/CourseInfo/CourseInfoAssembly.swift index 90cf182a75..3551f739d3 100644 --- a/Stepic/Sources/Modules/CourseInfo/CourseInfoAssembly.swift +++ b/Stepic/Sources/Modules/CourseInfo/CourseInfoAssembly.swift @@ -76,7 +76,7 @@ final class CourseInfoAssembly: Assembly { urlFactory: StepikURLFactory(), dataBackUpdateService: dataBackUpdateService, iapService: IAPService.shared, - iapPaymentsCache: IAPPaymentsCache(userAccountService: UserAccountService()), + iapPaymentsCache: IAPPaymentsCache.shared, analytics: StepikAnalytics.shared, remoteConfig: RemoteConfig.shared, courseViewSource: self.courseViewSource From 044d56ba2ef2952de99780d10e0af8f2d6c7d4f5 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Wed, 19 Jan 2022 18:20:30 +0300 Subject: [PATCH 16/16] Bump build --- Stepic.xcodeproj/project.pbxproj | 24 +++++++++++----------- Stepic/Info-Develop.plist | 2 +- Stepic/Info-Production.plist | 2 +- Stepic/Info-Release.plist | 2 +- StepicTests/Info-Develop.plist | 2 +- StepicTests/Info-Production.plist | 2 +- StepicTests/Info-Release.plist | 2 +- StepicUITests/Info-Develop.plist | 2 +- StepicUITests/Info-Production.plist | 2 +- StepicUITests/Info-Release.plist | 2 +- StepicWidget/Info-Develop.plist | 2 +- StepicWidget/Info-Production.plist | 2 +- StepicWidget/Info-Release.plist | 2 +- StickerPackExtension/Info-Develop.plist | 2 +- StickerPackExtension/Info-Production.plist | 2 +- StickerPackExtension/Info-Release.plist | 2 +- 16 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Stepic.xcodeproj/project.pbxproj b/Stepic.xcodeproj/project.pbxproj index 3ad37fba4f..f2bf31849d 100644 --- a/Stepic.xcodeproj/project.pbxproj +++ b/Stepic.xcodeproj/project.pbxproj @@ -12954,7 +12954,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Production.plist"; @@ -12979,7 +12979,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Production.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -13121,7 +13121,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Production.plist"; @@ -13151,7 +13151,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; @@ -13242,7 +13242,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Develop.plist"; @@ -13294,7 +13294,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Develop.plist"; @@ -13375,7 +13375,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Develop.plist"; @@ -13423,7 +13423,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Develop.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -13943,7 +13943,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Release.plist"; @@ -13997,7 +13997,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Release.plist"; @@ -14079,7 +14079,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEVELOPMENT_TEAM = UJ4KC2QN7B; ENABLE_BITCODE = YES; INFOPLIST_FILE = "Stepic/Info-Release.plist"; @@ -14127,7 +14127,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 402; + CURRENT_PROJECT_VERSION = 403; DEVELOPMENT_TEAM = UJ4KC2QN7B; INFOPLIST_FILE = "StickerPackExtension/Info-Release.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; diff --git a/Stepic/Info-Develop.plist b/Stepic/Info-Develop.plist index 0f973953c6..082dbd1dff 100644 --- a/Stepic/Info-Develop.plist +++ b/Stepic/Info-Develop.plist @@ -62,7 +62,7 @@ CFBundleVersion - 402 + 403 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/Stepic/Info-Production.plist b/Stepic/Info-Production.plist index 1b7ab01aaf..a117939692 100644 --- a/Stepic/Info-Production.plist +++ b/Stepic/Info-Production.plist @@ -62,7 +62,7 @@ CFBundleVersion - 402 + 403 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/Stepic/Info-Release.plist b/Stepic/Info-Release.plist index 31b860d763..10e4f332a6 100644 --- a/Stepic/Info-Release.plist +++ b/Stepic/Info-Release.plist @@ -62,7 +62,7 @@ CFBundleVersion - 402 + 403 FacebookAppID 171127739724012 FacebookDisplayName diff --git a/StepicTests/Info-Develop.plist b/StepicTests/Info-Develop.plist index 66f1c4bb47..5b1240f3a7 100644 --- a/StepicTests/Info-Develop.plist +++ b/StepicTests/Info-Develop.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 402 + 403 diff --git a/StepicTests/Info-Production.plist b/StepicTests/Info-Production.plist index fb2338e485..8ed969fe99 100644 --- a/StepicTests/Info-Production.plist +++ b/StepicTests/Info-Production.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 402 + 403 diff --git a/StepicTests/Info-Release.plist b/StepicTests/Info-Release.plist index e4f35d2d34..7f0628e43d 100644 --- a/StepicTests/Info-Release.plist +++ b/StepicTests/Info-Release.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 402 + 403 diff --git a/StepicUITests/Info-Develop.plist b/StepicUITests/Info-Develop.plist index eabb3a0d80..c86d2a0ab3 100644 --- a/StepicUITests/Info-Develop.plist +++ b/StepicUITests/Info-Develop.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.206-develop CFBundleVersion - 402 + 403 diff --git a/StepicUITests/Info-Production.plist b/StepicUITests/Info-Production.plist index 4b88169ab3..f1bfd20951 100644 --- a/StepicUITests/Info-Production.plist +++ b/StepicUITests/Info-Production.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.206 CFBundleVersion - 402 + 403 diff --git a/StepicUITests/Info-Release.plist b/StepicUITests/Info-Release.plist index 7375200970..fe4f589510 100644 --- a/StepicUITests/Info-Release.plist +++ b/StepicUITests/Info-Release.plist @@ -17,6 +17,6 @@ CFBundleShortVersionString 1.206-release CFBundleVersion - 402 + 403 diff --git a/StepicWidget/Info-Develop.plist b/StepicWidget/Info-Develop.plist index bc966a47fc..968757d4bc 100644 --- a/StepicWidget/Info-Develop.plist +++ b/StepicWidget/Info-Develop.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-develop CFBundleVersion - 402 + 403 NSExtension NSExtensionPointIdentifier diff --git a/StepicWidget/Info-Production.plist b/StepicWidget/Info-Production.plist index fb0901557e..77c6c2647b 100644 --- a/StepicWidget/Info-Production.plist +++ b/StepicWidget/Info-Production.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206 CFBundleVersion - 402 + 403 NSExtension NSExtensionPointIdentifier diff --git a/StepicWidget/Info-Release.plist b/StepicWidget/Info-Release.plist index da7d311466..3902808319 100644 --- a/StepicWidget/Info-Release.plist +++ b/StepicWidget/Info-Release.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-release CFBundleVersion - 402 + 403 NSExtension NSExtensionPointIdentifier diff --git a/StickerPackExtension/Info-Develop.plist b/StickerPackExtension/Info-Develop.plist index 1f3f708327..58331cf5eb 100644 --- a/StickerPackExtension/Info-Develop.plist +++ b/StickerPackExtension/Info-Develop.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-develop CFBundleVersion - 402 + 403 UIRequiredDeviceCapabilities arm64 diff --git a/StickerPackExtension/Info-Production.plist b/StickerPackExtension/Info-Production.plist index e57ca05aae..3b8c7d7547 100644 --- a/StickerPackExtension/Info-Production.plist +++ b/StickerPackExtension/Info-Production.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206 CFBundleVersion - 402 + 403 UIRequiredDeviceCapabilities arm64 diff --git a/StickerPackExtension/Info-Release.plist b/StickerPackExtension/Info-Release.plist index eff9180443..fdb567c798 100644 --- a/StickerPackExtension/Info-Release.plist +++ b/StickerPackExtension/Info-Release.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.206-release CFBundleVersion - 402 + 403 UIRequiredDeviceCapabilities arm64