WKJavaScriptController 2.0.1

WKJavaScriptController 2.0.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2019 年 3 月
SPM支持 SPM

Ridibooks Viewer Team 维护。



  • 作者:
  • Ridibooks Viewer Team

WKJavaScriptController

在 iOS 中从 JavaScript 调用原生代码,类似于 Android 中的 JavascriptInterface。

CocoaPods Compatible Platform License

要求

  • Xcode 10.0+
  • Swift 4.2
  • iOS8+

(基于 WKJavaScriptController 1.2.0+)

安装

此库通过 CocoaPods 发行。

CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它

$ gem install cocoapods

要使用 CocoaPods 在 Xcode 项目中集成 WKJavaScriptController,请在 Podfile 中指定它

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

target '<Target name in your project>' do
    pod 'WKJavaScriptController'
end

然后,运行以下命令

$ pod install

用法

import WKJavaScriptController

// Create protocol.
// '@objc' keyword is required. because method call is based on ObjC.
@objc protocol JavaScriptInterface {
    func onSubmit(_ dictonary: [String: AnyObject])
    func onSubmit(_ email: String, firstName: String, lastName: String, address1: String, address2: String, zipCode: JSInt, phoneNumber: String)
    func onCancel()
    var isSubmitted: JSBool { get }
    @objc optional func getErrorMessages(codes: [JSInt]) -> [String]
}

// Implement protocol. 
extension ViewController: JavaScriptInterface {
    func onSubmit(_ dictonary: [String: AnyObject]) {
        NSLog("onSubmit \(dictonary)")
    }
    
    func onSubmit(_ email: String, firstName: String, lastName: String, address1: String, address2: String, zipCode: JSInt, phoneNumber: String) {
        NSLog("onSubmit \(email), \(firstName), \(lastName), \(address1), \(address2), \(zipCode.value), \(phoneNumber)")
    }
    
    func onCancel() {
        NSLog("onCancel")
    }
    
    var isSubmitted: JSBool {
        return JSBool(true)
    }
    
    func getErrorMessages(codes: [JSInt]) -> [String] {
        return codes.map { "message\($0)" }
    }
}

class ViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        // Create javaScriptController.
        let javaScriptController = WKJavaScriptController(name: "native", target: self, bridgeProtocol: JavaScriptInterface.self)
        
        // [Optional] Add your javascript.
        let jsString = ...
        let userScript = WKUserScript(source: jsString, injectionTime: .AtDocumentEnd, forMainFrameOnly: true)
        javaScriptController.addUserScript(userScript)
        
        let webView = WKWebView(...)
        ...
        
        // Assign javaScriptController.
        webView.javaScriptController = javaScriptController
        
        // Call prepareForJavaScriptController before initializing WKWebView or loading page.
        webView.prepareForJavaScriptController()
        webView.loadRequest(...)
    }
    
    ...
}
// In javascript.
native.onSubmit({
    'first_name': 'Davin',
    'last_name': 'Ahn',
    'mail': '[email protected]',
});

可以作为 Promise 在 JavaScript 中接收原生返回值。

// In javascript.
const isSubmitted = await native.isSubmitted;
// or native.isSubmitted.then(isSubmitted => ...);
const messages = await native.getErrorMessages([200, 400, 500]);
// or native.getErrorMessages([200, 400, 500]).then(messages => ...);

限制

  • JavaScript中不能以同步方式接收原声返回,只能异步返回。
  • 方法参数长度限制为10。
  • 支持的参数类型:字符串、日期、数组、字典、JSBool、JSInt、JSFloat、NSNumber和NSNull(当从JavaScript传递undefined或null时)。
  • 如果参数中使用了Swift值类型(Bool, Int32, Int, Float, Double, ...),必须将其替换为JSBool、JSInt或JSFloat。(因为Swift值类型在ObjC中被NSNumber替换。)
  • 不支持协议中的类方法。

许可证

MIT