美文网首页
OC和JS的交互

OC和JS的交互

作者: 顾阿耶 | 来源:发表于2017-08-09 17:09 被阅读15次

    引入类拓展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

    相关文章

      网友评论

          本文标题:OC和JS的交互

          本文链接:https://www.haomeiwen.com/subject/zbsqrxtx.html