如何在 Objective C 中使用 JS Context SetObject

用户1169079

我正在尝试使用用 Swift 编写的教程在 JS 和 ObjC 之间进行通信,但我使用的是 ObjC。

@objc protocol CommunicationProtocol: JSExport {
    static func callNativeFunction(_ mytext: String)
}

@objc class CommunicationClass: NSObject, CommunicationProtocol {
    class func callNativeFunction(_ mytext: String) {
        print("Native function called \(mytext)")
    }
}

并在JS中注入通信类

ctx.setObject(unsafeBitCast(CommunicationClass.self, to: AnyObject.self), forKeyedSubscript: "SwiftBridge" as (NSCopying & NSObjectProtocol)!)

我将如何在目标 C 中做到这一点

因德尔·库马尔·拉托
//
//  ViewController.m
//  ObjcTest
//
//  Created by Inder Kumar Rathore on 07/05/17.
//  Copyright © 2017 Inder Kumar Rathore. All rights reserved.
//

#import "ViewController.h"

#import <JavaScriptCore/JavaScriptCore.h>


@protocol CommunicationProtocol <JSExport>

+ (void)callNativeFunction:(NSString *)mytext;

@end


@interface CommunicationClass : NSObject<CommunicationProtocol>

@end


@implementation CommunicationClass

+ (void)callNativeFunction:(NSString *)mytext {
    NSLog(@"Hurray! Native method called:%@", mytext);
}

@end




@implementation ViewController {

    __weak IBOutlet UIWebView *webView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"abc" withExtension:@"html"];
    [webView loadRequest:[NSURLRequest requestWithURL:url]];
}


- (void)webViewDidFinishLoad:(UIWebView *)webView {
    JSContext *ctxt = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    [ctxt setObject:[CommunicationClass class] forKeyedSubscript:@"SwiftBridge"];
}


@end

HTML文件 abc.html

<!doctype html>
<html lang="en">

    <head>
        <meta charset="utf-8">
            <title>Web page</title>
            <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
            <script type="text/javascript">
                function callNative(mytext) {
                    SwiftBridge.callNativeFunction(mytext);
                }

            function changeText(text) {
                $("#textfield").val(text);
            }
            $(function() {

              $("#textfield").on("keyup", function() {
                                 textChanged($("#textfield").val());
                                 });
              });
                </script>
            </head>

    <body>
        <input type="text" id="textfield" />
        <br/>

        <a onclick="callNative('hi from web!');" href="#">call native function</a>
    </body>

</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 Objective C 中使用 CallKit

如何在Objective-C中使用后台线程?

如何在Objective-C中使用此枚举?

如何在 Objective-C 中使用 swift 协议实现?

如何在objective c 中使用json web 服务?

如何在Swift中使用Objective-C枚举

如何在Objective-C中使用Swift结构

如何在Objective-C中使用NSOperation和NSOperationQueue?

如何在objective c ios中使用multipart上传图像?

如何在Objective C中使用* .so库?

如何在Objective-C中使用GLKMatrixStack?(GLKit)

如何在 Objective C 中使用 Safari 打开表单?

如何在 Objective-C 中使用存储属性

如何在iphone中使用objective c创建嵌套目录?

如何在Objective C中使用托管对象?

如何在混合代码的Objective-C / C ++文件(.mm文件)中使用PHPhotoLibrary?

如何在Objective C中使用wkWebView使用参数执行Javascript?

ReactJS钩子:如何在两个不同的.js文件中使用context?

如何在Objective-C中使Swift String枚举可用?

如何在框架的Objective-C文件中使用Swift类?

如何在我的Swift项目中使用Objective-C项目

如何在 Objective-C 中使用 FFmpeg 在 macOS 中录制屏幕?

如何在SwiftPM的Objective-C模块中使用swift模块?

如何在没有桥接头的情况下在 Swift 中使用 Objective-C 框架?

如何在Swift项目中使用Objective-C CocoaPods

如何在Swift中使用Objective-C NSMeasurement类别方法?

Xcode 8如何在Objective-C中使用Core Data Code Gen类?

如何在Objective C中使用AES加密发送CommonCrypto POST请求?

Swift中inout参数的方法如何在Objective-C中使用?