From 1d827037dd39d347ae34adf5e306be4ccb8cada2 Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 5 Oct 2023 18:51:23 +0900 Subject: [PATCH 1/2] [iOS] Improve loading time for load miniapp from bundle --- .../WKUserContentController+MiniApp.swift | 4 +- .../MiniAppScriptMessageHandler.swift | 2 +- .../core/Utilities/MiniAppSDKUtility.swift | 1 + .../Classes/core/View/MiniAppParameters.swift | 10 +- Sources/Classes/core/View/MiniAppView.swift | 23 +++-- .../core/View/MiniAppViewHandler.swift | 92 +++++++++++++------ Sources/Classes/ui/MiniAppSUIView.swift | 4 +- 7 files changed, 95 insertions(+), 41 deletions(-) diff --git a/Sources/Classes/core/Extensions/WKUserContentController+MiniApp.swift b/Sources/Classes/core/Extensions/WKUserContentController+MiniApp.swift index 299b756b..030ea919 100644 --- a/Sources/Classes/core/Extensions/WKUserContentController+MiniApp.swift +++ b/Sources/Classes/core/Extensions/WKUserContentController+MiniApp.swift @@ -14,7 +14,7 @@ extension WKUserContentController { delegate: MiniAppCallbackDelegate, hostAppMessageDelegate: MiniAppMessageDelegate, adsDisplayer: MiniAppAdDisplayer?, - secureStorageDelegate: MiniAppSecureStorageDelegate, + secureStorageDelegate: MiniAppSecureStorageDelegate?, miniAppId: String, miniAppTitle: String, miniAppManageDelegate: MiniAppManageDelegate @@ -25,7 +25,7 @@ extension WKUserContentController { delegate: delegate, hostAppMessageDelegate: hostAppMessageDelegate, adsDisplayer: adsDisplayer, - secureStorageDelegate: secureStorageDelegate, + secureStorageDelegate: secureStorageDelegate ?? nil, miniAppManageDelegate: miniAppManageDelegate, miniAppId: miniAppId, miniAppTitle: miniAppTitle diff --git a/Sources/Classes/core/JavascriptBridge/MiniAppScriptMessageHandler.swift b/Sources/Classes/core/JavascriptBridge/MiniAppScriptMessageHandler.swift index e6f7ed64..f240e2c8 100644 --- a/Sources/Classes/core/JavascriptBridge/MiniAppScriptMessageHandler.swift +++ b/Sources/Classes/core/JavascriptBridge/MiniAppScriptMessageHandler.swift @@ -28,7 +28,7 @@ internal class MiniAppScriptMessageHandler: NSObject, WKScriptMessageHandler { delegate: MiniAppCallbackDelegate, hostAppMessageDelegate: MiniAppMessageDelegate, adsDisplayer: MiniAppAdDisplayer?, - secureStorageDelegate: MiniAppSecureStorageDelegate, + secureStorageDelegate: MiniAppSecureStorageDelegate?, miniAppManageDelegate: MiniAppManageDelegate?, miniAppId: String, miniAppTitle: String diff --git a/Sources/Classes/core/Utilities/MiniAppSDKUtility.swift b/Sources/Classes/core/Utilities/MiniAppSDKUtility.swift index e0076164..2cd43793 100644 --- a/Sources/Classes/core/Utilities/MiniAppSDKUtility.swift +++ b/Sources/Classes/core/Utilities/MiniAppSDKUtility.swift @@ -11,6 +11,7 @@ class MiniAppSDKUtility { do { try FileManager.default.unzipItem(at: filePath, to: FileManager.getMiniAppVersionDirectory(with: miniAppId, and: versionId), skipCRC32: true) cacheVerifier.storeHash(for: miniAppId, version: versionId) + completionHandler?(.success(true)) return } catch let err { MiniAppLogger.e("Error unzipping archive", err) diff --git a/Sources/Classes/core/View/MiniAppParameters.swift b/Sources/Classes/core/View/MiniAppParameters.swift index c2fd9e87..c6ac9e00 100644 --- a/Sources/Classes/core/View/MiniAppParameters.swift +++ b/Sources/Classes/core/View/MiniAppParameters.swift @@ -19,6 +19,7 @@ public extension MiniAppViewParameters { let appId: String let version: String? let queryParams: String? + var fromBundle: Bool? = false /** Initializes default parameters for MiniAppView @@ -35,13 +36,15 @@ public extension MiniAppViewParameters { type: MiniAppType, appId: String, version: String? = nil, - queryParams: String? = nil + queryParams: String? = nil, + fromBundle: Bool? = false ) { self.config = config self.type = type self.appId = appId self.version = version self.queryParams = queryParams + self.fromBundle = fromBundle } } @@ -80,6 +83,7 @@ public extension MiniAppViewParameters { let type: MiniAppType let info: MiniAppInfo let queryParams: String? + var fromBundle: Bool? = false /** Initializes url parameters for MiniAppView @@ -94,12 +98,14 @@ public extension MiniAppViewParameters { config: MiniAppConfig, type: MiniAppType, info: MiniAppInfo, - queryParams: String? = nil + queryParams: String? = nil, + fromBundle: Bool? = false ) { self.config = config self.type = type self.info = info self.queryParams = queryParams + self.fromBundle = fromBundle } } } diff --git a/Sources/Classes/core/View/MiniAppView.swift b/Sources/Classes/core/View/MiniAppView.swift index 1b38ddb0..0d47468c 100644 --- a/Sources/Classes/core/View/MiniAppView.swift +++ b/Sources/Classes/core/View/MiniAppView.swift @@ -50,12 +50,23 @@ public class MiniAppView: UIView, MiniAppViewable { switch params { case let .default(params): self.type = params.type - self.miniAppHandler = MiniAppViewHandler( - config: params.config, - appId: params.appId, - version: params.version, - queryParams: params.queryParams - ) + if params.fromBundle ?? false { + self.miniAppHandler = MiniAppViewHandler( + config: params.config, + appId: params.appId, + version: params.version, + queryParams: params.queryParams, + fromBundle: params.fromBundle + ) + } else { + self.miniAppHandler = MiniAppViewHandler( + config: params.config, + appId: params.appId, + version: params.version, + queryParams: params.queryParams + ) + } + case let .url(urlParams): self.type = urlParams.type self.miniAppHandler = MiniAppViewHandler( diff --git a/Sources/Classes/core/View/MiniAppViewHandler.swift b/Sources/Classes/core/View/MiniAppViewHandler.swift index 7b652015..1adfeeee 100644 --- a/Sources/Classes/core/View/MiniAppViewHandler.swift +++ b/Sources/Classes/core/View/MiniAppViewHandler.swift @@ -13,11 +13,11 @@ class MiniAppViewHandler: NSObject { internal var miniAppDownloader: MiniAppDownloaderInterface internal var miniAppStatus: MiniAppStatus internal var manifestDownloader: ManifestDownloader - internal var miniAppInfoFetcher: MiniAppInfoFetcherInterface + internal var miniAppInfoFetcher: MiniAppInfoFetcherInterface? internal var miniAppManifestStorage: MAManifestStorage - internal var metaDataDownloader: MetaDataDownloader + internal var metaDataDownloader: MetaDataDownloader? internal var miniAppPermissionStorage: MiniAppPermissionsStorage - internal var secureStorage: MiniAppSecureStorage + internal var secureStorage: MiniAppSecureStorage? internal var projectId: String? @@ -94,6 +94,44 @@ class MiniAppViewHandler: NSObject { super.init() } + init( + config: MiniAppConfig, + appId: String, + version: String? = nil, + queryParams: String? = nil, + fromBundle: Bool? = false + ) { + manifestDownloader = ManifestDownloader() + miniAppStatus = MiniAppStatus() + miniAppManifestStorage = MAManifestStorage() + metaDataDownloader = MetaDataDownloader() + miniAppPermissionStorage = MiniAppPermissionsStorage() + + miniAppClient = MiniAppClient( + baseUrl: config.config?.baseUrl, + rasProjectId: config.config?.rasProjectId, + subscriptionKey: config.config?.subscriptionKey, + hostAppVersion: config.config?.hostAppVersion, + isPreviewMode: config.config?.isPreviewMode + ) + + adsDisplayer = config.adsDisplayer + + miniAppDownloader = MiniAppDownloader( + apiClient: miniAppClient, + manifestDownloader: manifestDownloader, + status: miniAppStatus + ) + + self.appId = appId + self.version = version + self.queryParams = queryParams + self.messageDelegate = config.messageDelegate + self.navigationDelegate = config.navigationDelegate + + super.init() + } + init( config: MiniAppConfig, url: URL, @@ -159,7 +197,7 @@ class MiniAppViewHandler: NSObject { UIViewController.attemptRotationToDeviceOrientation() webView?.configuration.userContentController.removeMessageHandler() NotificationCenter.default.removeObserver(self) - secureStorage.unloadStorage() + secureStorage?.unloadStorage() } required init?(coder: NSCoder) { return nil } @@ -298,28 +336,24 @@ class MiniAppViewHandler: NSObject { saveManifestInfoForBundle(miniAppManifest: miniAppManifest) if isValidMiniAppInfo(versionId: versionId) { if isMiniAppAvailable(versionId: versionId) { - if miniAppDownloader.isCacheSecure(appId: appId, versionId: versionId) { - DispatchQueue.main.async { - let newWebView = MiniAppWebView( + DispatchQueue.main.async { + let newWebView = MiniAppWebView( + miniAppId: self.appId, + versionId: versionId, + queryParams: self.queryParams + ) + self.webView = newWebView + do { + try self.loadWebView( + webView: newWebView, miniAppId: self.appId, versionId: versionId, queryParams: self.queryParams ) - self.webView = newWebView - do { - try self.loadWebView( - webView: newWebView, - miniAppId: self.appId, - versionId: versionId, - queryParams: self.queryParams - ) - } catch { - completion(.failure(.unknownError(domain: "", code: 0, description: "Internal error"))) - } - completion(.success(newWebView)) + } catch { + completion(.failure(.unknownError(domain: "", code: 0, description: "Internal error"))) } - } else { - completion(.failure(.miniAppCorrupted)) + completion(.success(newWebView)) } } else { completion(.failure(.miniAppNotFound)) @@ -406,7 +440,7 @@ extension MiniAppViewHandler { miniAppVersion: String? = nil, completionHandler: @escaping (Result) -> Void ) { - return miniAppInfoFetcher.getInfo( + miniAppInfoFetcher?.getInfo( miniAppId: miniAppId, miniAppVersion: miniAppVersion, apiClient: self.miniAppClient, @@ -529,7 +563,7 @@ extension MiniAppViewHandler { if version.isEmpty { return completionHandler(.failure(.invalidVersionId)) } - metaDataDownloader.getMiniAppMetaInfo( + metaDataDownloader?.getMiniAppMetaInfo( miniAppId: appId, miniAppVersion: version, apiClient: self.miniAppClient, @@ -707,7 +741,7 @@ extension MiniAppViewHandler: WKNavigationDelegate { private func notifySecureStorageStatus() { if shouldAutoLoadSecureStorage { - secureStorage.loadStorage { success in + secureStorage?.loadStorage { success in if success { MiniAppSecureStorage.sendLoadStorageReady(miniAppId: self.appId, miniAppVersion: self.version ?? "") } else { @@ -853,23 +887,23 @@ extension MiniAppViewHandler: MiniAppCallbackDelegate { // MARK: - MiniAppSecureStorageDelegate extension MiniAppViewHandler: MiniAppSecureStorageDelegate { func get(key: String) throws -> String? { - return try secureStorage.get(key: key) + return try secureStorage?.get(key: key) } func set(dict: [String: String], completion: ((Result) -> Void)?) { - return secureStorage.set(dict: dict, completion: completion) + secureStorage?.set(dict: dict, completion: completion) } func remove(keys: [String], completion: ((Result) -> Void)?) { - return secureStorage.remove(keys: keys, completion: completion) + secureStorage?.remove(keys: keys, completion: completion) } func size() -> MiniAppSecureStorageSize { - return secureStorage.size() + return secureStorage?.size() ?? MiniAppSecureStorageSize(used: 0, max: 0) } func clearSecureStorage() throws { - try secureStorage.clearSecureStorage() + try secureStorage?.clearSecureStorage() } } diff --git a/Sources/Classes/ui/MiniAppSUIView.swift b/Sources/Classes/ui/MiniAppSUIView.swift index e67780d3..bccabf7e 100644 --- a/Sources/Classes/ui/MiniAppSUIView.swift +++ b/Sources/Classes/ui/MiniAppSUIView.swift @@ -15,7 +15,9 @@ public struct MiniAppSUIView: UIViewRepresentable { var miniAppManifest: MiniAppManifest? public init(params: MiniAppViewParameters.DefaultParams, fromCache: Bool = false, handler: MiniAppSUIViewHandler, fromBundle: Bool = false, miniAppManifest: MiniAppManifest? = nil) { - self.params = .default(params) + var miniAppParams = params + miniAppParams.fromBundle = fromBundle + self.params = .default(miniAppParams) self.fromCache = fromCache self.handler = handler self.fromBundle = fromBundle From 64feb30f9230561eb275a97fbd775882d00359ec Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 5 Oct 2023 18:57:25 +0900 Subject: [PATCH 2/2] Swiftlint --- Sources/Classes/core/View/MiniAppViewHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Classes/core/View/MiniAppViewHandler.swift b/Sources/Classes/core/View/MiniAppViewHandler.swift index 1adfeeee..ee6973a0 100644 --- a/Sources/Classes/core/View/MiniAppViewHandler.swift +++ b/Sources/Classes/core/View/MiniAppViewHandler.swift @@ -131,7 +131,7 @@ class MiniAppViewHandler: NSObject { super.init() } - + init( config: MiniAppConfig, url: URL,