diff --git a/.swift-version b/.swift-version index bf77d54..819e07a 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -4.2 +5.0 diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..bb0cc27 --- /dev/null +++ b/Package.swift @@ -0,0 +1,23 @@ +// swift-tools-version:5.5 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "WKWebViewJavascriptBridge", + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "WKWebViewJavascriptBridge", + targets: ["WKWebViewJavascriptBridge"]), + ], + dependencies: [], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "WKWebViewJavascriptBridge", + dependencies: [], + path: "WKWebViewJavascriptBridge/"), + ] +) diff --git a/README.md b/README.md index 6b2be4f..65a2679 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ The reason for the iOS platform cross-domain access vulnerability is due to UIWe - **Swift Support:** Swift 3.2 ~ 5 Support. - **High Performance:** The messaging performance is higher than intercept requests. - **High Speed:** No need to consider alert box safety timeout. -- **Lightwight:** This framework contains only 3 files. +- **Lightweight:** This framework contains only 3 files. - **Non-intrusive:** There is no need to make the webview class inherit from other base class. # Usage diff --git a/WKWebViewJavascriptBridge.podspec b/WKWebViewJavascriptBridge.podspec index 7ab6275..4b6a996 100644 --- a/WKWebViewJavascriptBridge.podspec +++ b/WKWebViewJavascriptBridge.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = 'WKWebViewJavascriptBridge' s.summary = 'A Bridge for Sending Messages between Swift and JavaScript in WKWebViews.' - s.version = '1.2.0' + s.version = '1.2.2' s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { 'Lision' => 'lisionmail@gmail.com' } s.social_media_url = 'https://lision.me/' @@ -10,4 +10,5 @@ Pod::Spec.new do |s| s.source_files = 'WKWebViewJavascriptBridge/*.{h,swift}' s.platform = :ios, '9.0' s.requires_arc = true + s.swift_version = '5.0' end diff --git a/WKWebViewJavascriptBridge/WKWebViewJavascriptBridge.swift b/WKWebViewJavascriptBridge/WKWebViewJavascriptBridge.swift index 6d1a039..16ccfab 100644 --- a/WKWebViewJavascriptBridge/WKWebViewJavascriptBridge.swift +++ b/WKWebViewJavascriptBridge/WKWebViewJavascriptBridge.swift @@ -79,8 +79,8 @@ public class WKWebViewJavascriptBridge: NSObject { } extension WKWebViewJavascriptBridge: WKWebViewJavascriptBridgeBaseDelegate { - func evaluateJavascript(javascript: String) { - webView?.evaluateJavaScript(javascript, completionHandler: nil) + func evaluateJavascript(javascript: String, completion: CompletionHandler) { + webView?.evaluateJavaScript(javascript, completionHandler: completion) } } diff --git a/WKWebViewJavascriptBridge/WKWebViewJavascriptBridgeBase.swift b/WKWebViewJavascriptBridge/WKWebViewJavascriptBridgeBase.swift index 2431b87..a544a77 100644 --- a/WKWebViewJavascriptBridge/WKWebViewJavascriptBridgeBase.swift +++ b/WKWebViewJavascriptBridge/WKWebViewJavascriptBridgeBase.swift @@ -9,7 +9,15 @@ import Foundation protocol WKWebViewJavascriptBridgeBaseDelegate: AnyObject { - func evaluateJavascript(javascript: String) + typealias CompletionHandler = ((Any?, Error?) -> Void)? + + func evaluateJavascript(javascript: String, completion: CompletionHandler) +} + +extension WKWebViewJavascriptBridgeBaseDelegate { + func evaluateJavascript(javascript: String) { + evaluateJavascript(javascript: javascript, completion: nil) + } } @available(iOS 9.0, *) @@ -21,13 +29,13 @@ public class WKWebViewJavascriptBridgeBase: NSObject { public typealias Message = [String: Any] weak var delegate: WKWebViewJavascriptBridgeBaseDelegate? - var startupMessageQueue = [Message]() + var startupMessageQueue: [Message]? = [] var responseCallbacks = [String: Callback]() var messageHandlers = [String: Handler]() var uniqueId = 0 func reset() { - startupMessageQueue = [Message]() + startupMessageQueue = nil responseCallbacks = [String: Callback]() uniqueId = 0 } @@ -76,10 +84,10 @@ public class WKWebViewJavascriptBridgeBase: NSObject { } } - guard let handlerName = message["handlerName"] as? String else { return } + guard let handlerName = message["handlerName"] as? String else { continue } guard let handler = messageHandlers[handlerName] else { log("NoHandlerException, No handler for message from JS: \(message)") - return + continue } handler(message["data"] as? [String : Any], callback) } @@ -88,15 +96,25 @@ public class WKWebViewJavascriptBridgeBase: NSObject { func injectJavascriptFile() { let js = WKWebViewJavascriptBridgeJS - delegate?.evaluateJavascript(javascript: js) + delegate?.evaluateJavascript(javascript: js, completion: { [weak self] (_, error) in + guard let self = self else { return } + if let error = error { + self.log(error) + return + } + self.startupMessageQueue?.forEach({ (message) in + self.dispatch(message: message) + }) + self.startupMessageQueue = nil + }) } // MARK: - Private private func queue(message: Message) { - if startupMessageQueue.isEmpty { + if startupMessageQueue == nil { dispatch(message: message) } else { - startupMessageQueue.append(message) + startupMessageQueue?.append(message) } }

AltStyle によって変換されたページ (->オリジナル) /