OC和JS的交互

引入类拓展UIWebView+TS_JavaScriptContext, 这个类拓展是能在JSCotext出现的时候就可以拿到. 因为一般情况下JSCotext在webViewDidFinishLoad:才拿到, JS端可能在我们没有执行webViewDidFinishLoad:方法的时候就已经调用了我们的方法.

在交互类中创建一个实现了JSExport协议的协议, 协议中提供暴露的方法给JS端. 并在交互类中实现我们定义的方法. 如果需要相关控制器相关参数的话, 可以写个通知(代理或block也行)然后让相关控制器去实现.

1.把拓展类UIWebView+TS_JavaScriptContext拖进项目.

2.创建交互类JavaOCInterRac, 给H5提供相关方法, 并在@implementation中实现方法.

// 首先创建一个实现了JSExport协议的协议
@protocol JavaOCInterRacProtocol <JSExport>

// 调系统相册
- (void)callPicker;
// 调支付
- (void)callPay;
// 传一个参数回来
- (void)callPassParameter: (NSString *)orderNumber;
// 传两个参数回来
- (void)callTestParameterone: (NSString *)orderNumber AndParametertwo:(NSString *)name;

@end

// JavaOCInterRac.h

@interface JavaOCInterRac : NSObject

+(instancetype)getInstance
/** 定义block,回调到控制器中 */
@property (nonatomic, copy) void(^showPickerBlock)();

@end

// JavaOCInterRac.m

@interface JavaOCInterRac() <JavaOCInterRacProtocol>

@end

@implementation JavaOCInterRac

// 提供交互类的单例单例对象
static JavaOCInterRac *JavaOCInterac = nil;
+(instancetype)getInstance
{
    @synchronized(self)
    {
        if(!JavaOCInterac)
        {
            JavaOCInterac = [[self alloc] init];
        }
    }
    return JavaOCInterac;
}
// 调用系统相册实现
- (void)callPicker {
    
    NSLog(@"%s %s [第%d行] ----- 点击了调用系统相册", __TIME__, __FUNCTION__, __LINE__);
    self.showPickerBlock(); //定义block回调
}
// ...其他方法实现同理

@end

3.在对应控制器.m中

#pragma mark ----- TSWebViewDelegate
- (void)webView:(UIWebView *)webView didCreateJavaScriptContext:(JSContext*) ctx {
    
    ctx[@"object"] = [JavaOCInterRac getInstance];
}

#pragma mark ----- UIWebViewDelegate
- (void)webViewDidStartLoad:(UIWebView *)webView {
    
    JavaOCInterRac *interac = [JavaOCInterRac getInstance];
    interac.showPickerBlock = ^{
        [self showImagePicker];
    };
}

- (void)showImagePicker {
    
    UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                  initWithTitle:@"请选择文件来源"
                                  delegate:nil
                                  cancelButtonTitle:@"取消"
                                  destructiveButtonTitle:nil
                                  otherButtonTitles:@"拍照",@"从手机相册选择",nil];
    [actionSheet showInView:self.view];
}

附上git托管地址: https://github.com/yemuhong/OCJS_Interac

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容