diff --git a/CHANGELOG.md b/CHANGELOG.md index 824ec6d..7267387 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Release Notes +## 10.1.1 + +* Bump to iOS 10.2.0 + ## 10.1.0 * Moved SmartSelfie enrollment and authentication to synchronous endpoints diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 5ad45c6..d48991e 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -3,10 +3,10 @@ PODS: - integration_test (0.0.1): - Flutter - lottie-ios (4.4.3) - - smile_id (10.1.6): + - smile_id (10.2.0): - Flutter - - SmileID (= 10.1.6) - - SmileID (10.1.6): + - SmileID (= 10.2.0) + - SmileID (10.2.0): - lottie-ios (~> 4.4.2) - Zip (~> 2.1.0) - Zip (2.1.2) @@ -34,8 +34,8 @@ SPEC CHECKSUMS: Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 integration_test: 13825b8a9334a850581300559b8839134b124670 lottie-ios: fcb5e73e17ba4c983140b7d21095c834b3087418 - smile_id: 52080f8ec2a65656dfd4d1a0a2e387ca2c9247f4 - SmileID: a3dd288193c84518e4f7c0fe9383de685afbac6e + smile_id: 28bd15b7b308a99e5b1661f74d487c053c15cd59 + SmileID: bfcd426e9a47560eb949c18591ad032a8d8cde0d Zip: b3fef584b147b6e582b2256a9815c897d60ddc67 PODFILE CHECKSUM: 929954fb8941cef06249e96bd1516fd2a22ed7a5 diff --git a/ios/Classes/SmileIDPlugin.swift b/ios/Classes/SmileIDPlugin.swift index 064dac5..7323b12 100644 --- a/ios/Classes/SmileIDPlugin.swift +++ b/ios/Classes/SmileIDPlugin.swift @@ -1,12 +1,9 @@ import Flutter import UIKit import SmileID -import Combine public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { - private var subscribers = Set() - public static func register(with registrar: FlutterPluginRegistrar) { let messenger: FlutterBinaryMessenger = registrar.messenger() let api: SmileIDApi & NSObjectProtocol = SmileIDPlugin() @@ -94,36 +91,28 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { request: FlutterAuthenticationRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.authenticate(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response = try await SmileID.api.authenticate(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func prepUpload( request: FlutterPrepUploadRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.prepUpload(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response = try await SmileID.api.prepUpload(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func upload( @@ -131,19 +120,13 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { request: FlutterUploadRequest, completion: @escaping (Result) -> Void ) { - do { - SmileID.api.upload(zip: try request.toRequest(), to: url) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - case .finished: - completion(.success(())) - } - }, receiveValue: { _ in }) - .store(in: &subscribers) - } catch { - completion(.failure(error)) + Task { + do { + try await SmileID.api.upload(zip: try request.toRequest(), to: url) + completion(.success(())) + } catch { + completion(.failure(error)) + } } } @@ -151,36 +134,28 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { request: FlutterEnhancedKycRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.doEnhancedKyc(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response = try await SmileID.api.doEnhancedKyc(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func doEnhancedKycAsync( request: FlutterEnhancedKycRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.doEnhancedKycAsync(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response = try await SmileID.api.doEnhancedKycAsync(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func doSmartSelfieEnrollment( @@ -195,37 +170,34 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { allowNewEnroll: Bool?, completion: @escaping (Result) -> Void ) { - SmileID.api.doSmartSelfieEnrollment( - signature: signature, - timestamp: timestamp, - selfieImage: MultipartBody( - withImage: getFile(atPath: selfieImage)!, - forKey: URL(fileURLWithPath: selfieImage).lastPathComponent, - forName: URL(fileURLWithPath: selfieImage).lastPathComponent - )!, - livenessImages: livenessImages.map { - MultipartBody( - withImage: getFile(atPath: $0)!, - forKey: URL(fileURLWithPath: $0).lastPathComponent, - forName: URL(fileURLWithPath: $0).lastPathComponent - )! - }, - userId: userId, - partnerParams: convertNullableMapToNonNull(data: partnerParams), - callbackUrl: callbackUrl, - sandboxResult: sandboxResult.map { Int($0) }, - allowNewEnroll: allowNewEnroll - ).sink(receiveCompletion: { status in - switch status { - case .failure(let error): + Task { + do { + let response = try await SmileID.api.doSmartSelfieEnrollment( + signature: signature, + timestamp: timestamp, + selfieImage: MultipartBody( + withImage: getFile(atPath: selfieImage)!, + forKey: URL(fileURLWithPath: selfieImage).lastPathComponent, + forName: URL(fileURLWithPath: selfieImage).lastPathComponent + )!, + livenessImages: livenessImages.map { + MultipartBody( + withImage: getFile(atPath: $0)!, + forKey: URL(fileURLWithPath: $0).lastPathComponent, + forName: URL(fileURLWithPath: $0).lastPathComponent + )! + }, + userId: userId, + partnerParams: convertNullableMapToNonNull(data: partnerParams), + callbackUrl: callbackUrl, + sandboxResult: sandboxResult.map { Int($0) }, + allowNewEnroll: allowNewEnroll + ) + completion(.success(response.toResponse())) + } catch { completion(.failure(error)) - default: - break } - - }, receiveValue: { response in - completion(.success(response.toResponse())) - }).store(in: &subscribers) + } } func doSmartSelfieAuthentication( @@ -239,161 +211,130 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { sandboxResult: Int64?, completion: @escaping (Result) -> Void ) { - SmileID.api.doSmartSelfieAuthentication( - signature: signature, - timestamp: timestamp, - userId: userId, - selfieImage: MultipartBody( - withImage: getFile(atPath: selfieImage)!, - forKey: URL(fileURLWithPath: selfieImage).lastPathComponent, - forName: URL(fileURLWithPath: selfieImage).lastPathComponent - )!, - livenessImages: livenessImages.map { - MultipartBody( - withImage: getFile(atPath: $0)!, - forKey: URL(fileURLWithPath: $0).lastPathComponent, - forName: URL(fileURLWithPath: $0).lastPathComponent - )! - }, - partnerParams: convertNullableMapToNonNull(data: partnerParams), - callbackUrl: callbackUrl, - sandboxResult: sandboxResult.map { Int($0) } - ).sink(receiveCompletion: { status in - switch status { - case .failure(let error): + Task { + do { + let response = try await SmileID.api.doSmartSelfieAuthentication( + signature: signature, + timestamp: timestamp, + userId: userId, + selfieImage: MultipartBody( + withImage: getFile(atPath: selfieImage)!, + forKey: URL(fileURLWithPath: selfieImage).lastPathComponent, + forName: URL(fileURLWithPath: selfieImage).lastPathComponent + )!, + livenessImages: livenessImages.map { + MultipartBody( + withImage: getFile(atPath: $0)!, + forKey: URL(fileURLWithPath: $0).lastPathComponent, + forName: URL(fileURLWithPath: $0).lastPathComponent + )! + }, + partnerParams: convertNullableMapToNonNull(data: partnerParams), + callbackUrl: callbackUrl, + sandboxResult: sandboxResult.map { Int($0) } + ) + completion(.success(response.toResponse())) + } catch { completion(.failure(error)) - default: - break } - - }, receiveValue: { response in - completion(.success(response.toResponse())) - }).store(in: &subscribers) + } } func getSmartSelfieJobStatus( request: FlutterJobStatusRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.getJobStatus(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response: SmartSelfieJobStatusResponse = try await SmileID.api.getJobStatus(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func getDocumentVerificationJobStatus( request: FlutterJobStatusRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.getJobStatus(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response: DocumentVerificationJobStatusResponse = try await SmileID.api.getJobStatus(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func getBiometricKycJobStatus( request: FlutterJobStatusRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.getJobStatus(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response: BiometricKycJobStatusResponse = try await SmileID.api.getJobStatus(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func getEnhancedDocumentVerificationJobStatus( request: FlutterJobStatusRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.getJobStatus(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response: EnhancedDocumentVerificationJobStatusResponse = try await SmileID.api.getJobStatus(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func getProductsConfig( request: FlutterProductsConfigRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.getProductsConfig(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response = try await SmileID.api.getProductsConfig(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func getValidDocuments( request: FlutterProductsConfigRequest, completion: @escaping (Result) -> Void ) { - SmileID.api.getValidDocuments(request: request.toRequest()) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response = try await SmileID.api.getValidDocuments(request: request.toRequest()) completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func getServices( completion: @escaping (Result) -> Void ) { - SmileID.api.getServices() - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - default: - break - } - }, receiveValue: { response in + Task { + do { + let response = try await SmileID.api.getServices() completion(.success(response.toResponse())) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } @@ -403,7 +344,6 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { numAttempts: Int64, completion: @escaping (Result) -> Void ) { - pollJobStatus( apiCall: SmileID.api.pollSmartSelfieJobStatus, request: request.toRequest(), @@ -426,7 +366,6 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { numAttempts: Int64, completion: @escaping (Result) -> Void ) { - pollJobStatus( apiCall: SmileID.api.pollDocumentVerificationJobStatus, request: request.toRequest(), @@ -450,7 +389,6 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { numAttempts: Int64, completion: @escaping (Result) -> Void ) { - pollJobStatus( apiCall: SmileID.api.pollBiometricKycJobStatus, request: request.toRequest(), @@ -490,7 +428,7 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { } func pollJobStatus( - apiCall: @escaping (RequestType, TimeInterval, Int) -> AnyPublisher, + apiCall: @escaping (RequestType, TimeInterval, Int) async throws -> ResponseType, request: RequestType, interval: Int64, numAttempts: Int64, @@ -501,19 +439,15 @@ public class SmileIDPlugin: NSObject, FlutterPlugin, SmileIDApi { completion(.failure(NSError(domain: "Invalid numAttempts value", code: -1, userInfo: nil))) return } - - apiCall(request, timeInterval, numAttemptsInt) - .sink(receiveCompletion: { status in - switch status { - case .failure(let error): - completion(.failure(error)) - case .finished: - break - } - }, receiveValue: { response in + + Task { + do { + let response = try await apiCall(request, timeInterval, numAttemptsInt) completion(.success(response)) - }) - .store(in: &subscribers) + } catch { + completion(.failure(error)) + } + } } func convertToTimeInterval(milliSeconds:Int64) -> TimeInterval { diff --git a/ios/smile_id.podspec b/ios/smile_id.podspec index e5545d0..ef5a602 100644 --- a/ios/smile_id.podspec +++ b/ios/smile_id.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.name = 'smile_id' # NB! Keep this version in sync with the Native iOS SDK version - s.version = '10.1.6' + s.version = '10.2.0' s.summary = 'Official Smile ID SDK for Flutter' s.description = <<-DESC A new Flutter project. @@ -15,7 +15,7 @@ A new Flutter project. s.source_files = 'Classes/**/*' s.dependency 'Flutter' # NB! Update the s.version above when changing this version - s.dependency 'SmileID', '10.1.6' + s.dependency 'SmileID', '10.2.0' s.platform = :ios, '13.0' # Flutter.framework does not contain a i386 slice. diff --git a/pubspec.yaml b/pubspec.yaml index 6de409b..3dc0308 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: smile_id description: The Official Smile ID Flutter SDK -version: 10.1.0 +version: 10.1.1 homepage: "https://usesmileid.com" environment: