Allen Woody

如果你像程序员一样工作,你就是程序员。如果你像架构师一样工作,你就是架构师。

嗨,我是朱洪伍 (@hnxyzhw),一名 iOS 开发者。现居北京,就职于中化能源科技有限公司。正在get新技能,探求创意之源。


我在简书上创建的有关于iOS开发的技术专辑,欢迎各位前来了解!

#文章内容

iOS-中JS与OC(UIWebView)的交互

项目开发中,会推一些活动供用户参加,活动页面一般都是用h5或者web页面,这活动页面有时候需要跟移动端有交互操作,比如点了一个链接或者button,跳转到app内的某个页面。那么这个时候就需要移动端交互来完成了。

UIWebView是可以捕获当前页面要去加载的url地址,比如当你点击了页面的一个超链接,或者一个图片类型的标签连接,又或者是点击页面的中的button(在点击方法里去加载指定的url)。那么当前的UIWebView就会去加载这个url地址,此时我们可以通过UIWebView的代理方法去拦截这个url。

具体代码如下(UIWebViewDelegate):

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
//判断是否是单击
if (navigationType == UIWebViewNavigationTypeLinkClicked)
{
  NSURL *url = [request URL];
  NSLog(@"----url:%@",[url absoluteString]);
//当你单击页面上的超链接或者button,去加载url时,是可以在这个代理方法里面拦截到url地址的
//既然能够拿到,那么就可以跟写这个web页面或者h5的同事,约定一个url
//比如你的url是:http://www.huodong
  if([[url absoluteString] isEqualToString:@"http://www.huodong"]){
    //如果是你们约定的url,那么就可以在执行你要调转的方法
    return NO;//(NO,表示不去加载这个url地址)
  }else{
    //如果不是,那么就去加载我们的不需要跳转的url连接地址
    return YES;
  }
}
return YES;

}

还有另外一种方法也可实现js跟oc的交互(使用了本地的一个html测试),这个需要导入JavaScriptCore.framework

在viewDidLoad方法里:

mywebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[mywebView setDelegate:self];

NSString *path = [[NSBundle mainBundle] pathForResource:@"huodong" ofType:@"html"];

NSString *htmlString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

NSString *basePath = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:basePath];
[mywebView loadHTMLString:htmlString baseURL:baseURL];

JSContext *context=[mywebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//注意这个jump方法就是html中点击button后要执行的方法,
/*
	document.getElementById('button').onclick = function(){window.jump(12);
*/
//html中回去掉jump这个方法,并讲12这个整形参数传递过来,这个是可以传多参数的
context[@"jump"] = ^() {
	NSArray *args = [JSContext currentArguments];
	for (id obj in args) {
		NSLog(@"%@",obj);
	}
};

可以参考下面这个博客

iOS js oc相互调用(JavaScriptCore)(二) js oc相互调用

IOS开发—JS调用OC(通过非URL的方式) IOS开发—JS调用OC

iOS js与oc交互(js调用oc篇) js与oc交互

上一篇文章

Runtime优雅的解决UIButton多次点击(重复点击)

 在实际开发中我们,点击一个button按键时,需要触发一个事件去执行。用户在正常操作情况下,单次点击时,button只会响应一次点击。但是如果用户多次点击一个button,那么就会引起这个事件被多次执行,导致一些bug的出现。如何优雅解决的这个问题呢?今天我们来使用Runtime来解决UIButton重复点击的问题。 首先新建一个分类category,继承于UIControl,名字自己定义。 UIControl+ZHW.h(.h文件)@interface UIControl (ZHW)@...…

继续阅读
下一篇文章

iOS静态库文件(framework和a)合并兼容真机以及模拟器

       开发过程中有时候需要讲一些功能代码封装到静态库文件中,以确保代码的安全性。主要分为:静态库、动态库两种       静态库和动态库的存在形式:       静态库: .a 和 .framework        动态库: .dylib 和 .framework       静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。       需要注...…

iOS,静态库文件继续阅读