谈谈OC-UIWebView与js 交互,定义的协议方法可在redirect后重复使用

因为我之前尝试用苹果自带的JSExport写一个UIWebView与js 交互的方法, 写完是能够正确调用, 但如果从webView 中再重定向到其他网页, 那之前写的JSExport就会失效, 也就是之前写的方法不能在同一个UIWebView下的不同网页共用, 在网上找了一位大神写的分类, 加上自己的使用. 下面分享一下.
UIWebView-TS_JavaScriptContext

  • 下面我们开始写代码吧.
    首先把大神写的分类拖进项目.里面写的也不难, 可以看懂,有兴趣的可以看看(最后有demo)



    *使用

#import "JJViewController.h"
#import "UIWebView+TS_JavaScriptContext.h"
#import "JSInterface.h"
// TSWebViewDelegate 中就一个方法, 实现他的方法
@interface JJViewController () <TSWebViewDelegate>
@end

@implementation JJViewController
{
    IBOutlet UIWebView* _webView;
    JSContext * _ctx;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSURL* htmlURL = [[NSBundle mainBundle] URLForResource: @"testWebView"
                                             withExtension: @"htm"];
    [_webView loadRequest: [NSURLRequest requestWithURL: htmlURL]];
  //  代理一定要设置
    _webView.delegate = self;
}
- (void)dealloc {
    NSLog(@"%s",__func__);
}

- (void)webView:(UIWebView *)webView didCreateJavaScriptContext:(JSContext *)ctx
{
    // js中想直接这样调用(<button type='button' onclick='sayHello()'>Say Hello!</button>), 可以把 sayHello , 直接丢给ctx:
    ctx[@"sayHello"] = ^{
        // 要注意, 它调用时是异步的, 如果想在主线程做事, 需回到主线程
        dispatch_async( dispatch_get_main_queue(), ^{
            UIAlertView* av = [[UIAlertView alloc] initWithTitle: @"Hello, World!"
                                                         message: nil
                                                        delegate: nil
                                               cancelButtonTitle: @"OK"
                                               otherButtonTitles: nil];
            [av show];
        });
    };
    // 为防止循环引用, 需要建立一个类来处理你的协议方法
   // 在js 中如果想调用JSInterface协议中的方法需要以 'viewController' 开头, 是ctx[@"viewController"]中决定定的.比如js:<button type='button' onclick='viewController.sayGoodbye()'>Say Goodbye!</button>
    ctx[@"viewController"] = [[JSInterface alloc]init];
}
@end
  • JSInterface.m
#import "JSInterface.h"
@protocol JavaScriptDelegate <JSExport>
- (void) sayGoodbye;
@end
@interface JSInterface() <JavaScriptDelegate>

@end
@implementation JSInterface

- (void) sayGoodbye
{
        // 要注意, 它调用时是异步的, 如果想在主线程做事, 需回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertView* av = [[UIAlertView alloc] initWithTitle: @"Goodbye, World!"
                                                         message: nil
                                                        delegate: nil
                                               cancelButtonTitle: @"OK"
                                               otherButtonTitles: nil];
            
            [av show];
        });   
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS与JS交互总结 近几年来移动开发使用网页嵌入形式的越来越多,这就不可避免的出现原生控件和网页页面的JS交互,...
    凌巅阅读 1,601评论 0 9
  • 一、简介 近两年随着HTML5的迅速发展与日趋成熟,越来越多的移动开发者选择使用HTML5来进行混合开发,不仅节约...
    RainyGY阅读 2,020评论 1 12
  • 简介 iOS原生应用和web页面的交互大致上有以下这几种方法: JavaScriptCore(iOS7之后) 拦截...
    MurtoTien阅读 1,300评论 0 1
  • 晚上带女儿去湿地公园玩,芭比娃娃的鞋子丢了,女儿十分着急,我们借着电动自行车微弱的光,边走边找,我对女儿说;“芭比...
    幸福像花儿一样6阅读 390评论 0 2
  • 今天读的是三毛《撒哈拉沙漠的故事》中与荷西在撒哈拉沙漠相处的婚姻爱情故事。很有趣!感受如下: 一:三毛和荷西都是拥...
    张一天的一天阅读 4,914评论 0 0

友情链接更多精彩内容