SwiftyKamome 3.2.0

SwiftyKamome 3.2.0

Hituzi Ando维护。



  • 作者
  • Hituzi Ando

Kamome

Kamome 是一个用于 iOS 和 Android 应用的库,使用了 WebView。这个库架起了WebView中的 JavaScript 与 Swift、Java 或 Kotlin 编写的本地代码之间的桥梁。

Kamome 为 iOS 和 Android 提供了常用的 JavaScript 接口。

快速使用

从 JS 代码向本地代码发送消息

  1. 从 JavaScript 代码发送消息

    // JavaScript
    
    // Send `echo` command.
    Kamome.send('echo', { message: 'Hello' }).then(function (result) {
        // Receive a result from the native code if succeeded.
        console.log(data.message);
    }).catch(function (error) {
        // Receive an error from the native code if failed.
        console.log(error);
    });
  2. 在 iOS 上接收消息

    // Swift
    
    private lazy var webView: WKWebView = {
        let webView = WKWebView(frame: self.view.frame)
        return webView
    }()
    
    private var kamome: Kamome!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Create the Kamome object with default webView.
        self.kamome = Kamome(webView: self.webView)
    
        // Register `echo` command.
        kamome.add(Command(name: "echo") { commandName, data, completion in
                  // Received `echo` command.
                  // Then send resolved result to the JavaScript callback function.
                  completion.resolve(with: ["message": data!["message"]!])
                  // Or, send rejected result if failed.
                  //completion.reject(with: "Echo Error!")
              })
    
        let htmlURL = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "www")!
        self.webView.loadFileURL(htmlURL, allowingReadAccessTo: htmlURL)
        view.addSubview(self.webView)
    }

    【注意】此框架仅支持 WKWebView。UIWebView 不受支持。

  3. 在 Android 上接收消息

    // Java
    
    private Kamome kamome;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        WebView webView = findViewById(R.id.webView);
    
        // Create the Kamome object with the webView.
        kamome = new Kamome(webView)
            .add(new Command("echo", new Command.IHandler() {  // Register `echo` command.
    
                @Override
                public void execute(String commandName, JSONObject data, ICompletion completion) {
                    // Received `echo` command.
                    // Then send resolved result to the JavaScript callback function.
                    HashMap<String, Object> map = new HashMap<>();
                    map.put("message", data.optString("message"));
                    completion.resolve(map);
                    // Or, send rejected result if failed.
                    //completion.reject("Echo Error!");
                }
            }));
    
        webView.loadUrl("file:///android_asset/www/index.html");
    }

从本地代码向 JS 代码发送消息

  1. 在 iOS 上从本地代码发送消息

    // Swift
    
    // Send a data to JavaScript.
    kamome.sendMessage(with: ["greeting": "Hello! by Swift"], name: "greeting") { (commandName, result, error) in
        // Received a result from the JS code.
        guard let result = result else { return }
        print("result: \(result)")
    }
  2. 在 Android 上从本地代码发送消息

    // Java
    
    // Send a data to JavaScript.
    HashMap<String, Object> data = new HashMap<>();
    data.put("greeting", "Hello! by Java");
    kamome.sendMessage(data, "greeting", new Kamome.ISendMessageCallback() {
    
        @Override
        public void onReceiveResult(String commandName, Object result, Error error) {
            // Received a result from the JS code.
            Log.d(TAG, "result: " + result);
        }
    });
  3. 在 JavaScript 代码上接收消息

    // JavaScript
    
    // Add a receiver that receives a message sent by the native client.
    Kamome.addReceiver('greeting', function (data, resolve, reject) {
        // The data is the object sent by the native client.
        console.log(data.greeting);
    
        // Run asynchronous something to do...
        setTimeout(function () {
    
            // Return a result as any object or null to the native client.
            resolve('OK!');
            // If the task is failed, call `reject()` function.
            //reject('Error message');
        }, 1000);
    });

  • 导入 kamome.js 或 kamome.min.js

    <script src="/path/to/kamome[.min].js"></script>

    或者,您可以将 kamome.js 文件中的所有代码复制到您的 JavaScript。

  • 2. iOS App

    CocoaPods

    Kamome 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中

    pod "SwiftyKamome"

    手动安装

    将 SwiftyKamome.framework 拖放到您的 Xcode 项目中

    3. Android应用

    Gradle

    在 build.gradle(项目级别)中添加以下代码。

    allprojects {
        repositories {
            maven {
                url 'https://hituziando.github.io/kamome/android/repo'
            }
        }
    }

    在 build.gradle(应用级别)中添加以下代码。

    dependencies {		
        implementation 'jp.hituzi:kamome:3.0.0'
    }

    手动安装

    1. 将 kamome-x.x.x.jar 复制到 YOUR_ANDROID_STUDIO_PROJECT/app/libs 目录。
    2. 在 AndroidStudio 中同步项目。

    配置

    从JS代码请求到原生代码的超时时间

    Kamome.send 方法在JavaScript中期望在某种持续时间后返回 resolvereject 响应。如果请求超时,回调将使用 requestTimeout 错误调用 reject。您可以更改默认请求超时。以下为更改示例。

    // JavaScript
    
    // Set default timeout in millisecond.
    Kamome.setDefaultRequestTimeout(15000);

    如果给定时间小于或等于0,则请求超时功能将被禁用。

    如果您想单独指定请求超时,您可以在 Kamome.send 方法的第4个参数中设置以毫秒为单位的时间超时。

    // JavaScript
    
    // Set a timeout in millisecond at 4th argument.
    const promise = Kamome.send(commandName, data, null, 5000);

    钩子

    在调用之前和处理之后挂钩命令。

    // JavaScript
    
    // Hook.
    Kamome.hook
        .before("getScore", function () {
            // Called before sending "getScore" command.
            Kamome.send("getUser").then(function (data) {
                console.log("Name: " + data.name);
            });
        })
        .after("getScore", function () {
            // Called after "getScore" command is processed.
            Kamome.send("getAvg").then(function (data) {
                console.log("Avg: " + data.avg);
            });
        });
    
    // Send "getScore" command.
    Kamome.send("getScore").then(function (data) {
        console.log("Score: " + data.score + " Rank: " + data.rank);
    });

    仅限浏览器

    当没有Kamome的iOS/Android原生客户端时,即仅使用浏览器运行时,您可以注册每个命令的处理过程。

    // JavaScript
    
    Kamome.browser
        .addCommand("echo", function (data, resolve, reject) {
            // Received `echo` command.
            // Then send resolved result to the JavaScript callback function.
            resolve({ message: data["message"] });
            // Or, send rejected result if failed.
            //reject("Echo Error!");
        });

    更多信息,请参阅我的iOS示例项目Android示例项目