需求如题,如果是你,你一定首先想到看看JavaScriptCore有没有暴露出对应的 delegate 方法可以直接用,抱歉,还真没有。那该怎么办?怎么办?么办?办?......
创新互联建站是专业的邵武网站建设公司,邵武接单;提供成都网站建设、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行邵武网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
记得之前有一篇关于 JSBridge 的文章有提到,直接 NSObject 类有一个方法,webView:didCreateJavaScriptContext:forFrame:,从语义上看,应该就满足上面的需求。
好,写个 NSObject 的分类实现下看看。
测试很简单,在 web 页面的 js 脚本里,调用 printHello(); 即可。
实践证明:好使!
熟悉 runtime 的话,这个很简单,调用 class_copyMethodList 把类里所有的方法取出来打印就好。有的时候,为了分析一个需求如何实现,可能要递归打印几个类的方法,从当前类,到其父类,到其爷爷类,...直到 NSObject 类。
感谢 oc 语言的创始人和开发者,每个类的类方法、实例方法都几乎可以做到望文生义,才让大家能有这一快乐!
最后,enjoy yourself!
①打开“注册表编辑器”,找到[HKEY_ CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Old WorkAreas],然后选中窗口右侧的“OldWorkAreaRects”,将其删除。
②同样在“注册表编辑器”中找到[HKEY_CURRENT_USER\Software \Microsoft\Internet Explorer\Main],选择窗口右侧的“Window_Placement”,将其删除。
③退出“注册表编辑器”,重启电脑,然后打开IE,将其窗口最大化,并单击“往下还原”按钮将窗口还原,接着再次单击“最大化”按钮,最后关闭IE窗口。以后重新打开IE时,窗口就正常了!
第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理。
我写了一个简单的HTML网页和一个btn点击事件用来与原生OC交互,HTML代码如下:
html
header
meta http-equiv="Content-Type" content="text/html; charset=utf-8" /
script type="text/javascript"
function showAlert(message){
alert(message);
}
function loadURL(url) {
var iFrame;
iFrame = document.createElement("iframe");
iFrame.setAttribute("src", url);
iFrame.setAttribute("style", "display:none;");
iFrame.setAttribute("height", "0px");
iFrame.setAttribute("width", "0px");
iFrame.setAttribute("framebor
我们要做的有如下几件事情:
首先:通过webview加载一个本地html文件
[self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];
其次:我们要在我们的OC代码里面注册JS方法
- (void)h5callApp
{
//获取该UIWebview的javascript执行环境。
JSContext *context = [self.myWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context.exceptionHandler = ^(JSContext *con, JSValue *exception) {
NSLog(@"%@", exception);
con.exception = exception;
};
context[@"h5CallApp"] = ^() {
NSLog(@"+++++++Begin Log+++++++");
NSArray *args = [JSContext currentArguments];
for (JSValue *jsVal in args) {
NSLog(@"%@", jsVal);
}
JSValue *this = [JSContext currentThis];
NSLog(@"this: %@",this);
NSLog(@"-------End Log-------");
};
}
要保证本地的html里面有h5CallApp这个方法哦。
这就是刚刚上述博客里面提到的方法,是不是看上次很简单的样子。
But
我运用到我们项目里面的时候,死活不能调用该方法,why?我厚着脸皮问了我们的帅哥安卓开发,得知他们里面有这一样一行代码
webView.addJavascriptInterface(new JSInvoke(), "test");
看上去第一眼的感觉是不是累似注册了一个东西,可是我找了好多博客我没有找到我们IOS类似的啊,着急啊着急。
意外的意外,伟大的github上面就是资源多,我在上面找到一个EasyJSWebViewSample这样一个开源项目,里面有一句
MyJSInterface* interface = [MyJSInterface new];
[self.myWebView addJavascriptInterfaces:interface WithName:@"MyJSTest"];
是不是感觉和安卓里面的那个注册类似的,没错,太开心了。
最后的最后,你以为结束了,NO!
该Demo里面的html有空的小朋友可以看一下。
由于项目需求我们是3个参数,在该demo里面执行拿到第一个参数,该demo就运行出错,提示我们数组越界了,在这里真的浪费了好多时间,后来发现他们的demo里面调用两个参数的方法在JS里面声明的方法与OC里面真正的实现方法有点差入,比如OC里面定义的方法
- (void) h5CallApp: (NSString*) param And2: (NSString*) param2 And3: (NSString*) param3
在html里面只能写成
MyJSTest.h5CallAppAnd2And3("param1","param2","param3")。
是不是觉得不可思义,最后我整体看了一下代码,里面好像有这一段在注入JS的时候有用到的
inject: function (obj, methods){\\
window[obj] = {};\\
var jsObj = window[obj];\\
\\
for (var i = 0, l = methods.length; i l; i++){\\
(function (){\\
var method = methods[i];\\
var jsMethod = method.replace(new RegExp(\\":\\", \\"g\\"), \\"\\");\\
jsObj[jsMethod] = function (){\\
return EasyJS.call(obj, method, Array.prototype.slice.call(arguments));\\
};\\
})();\\
}\\
}
这个好像是替换方法的,原谅我的无知啊,我也是没看懂,仅仅是感觉与猜测,勿喷我,我真的怕被喷。
最后的最后,JS的那边的开发肯定是不会为了将IOS与安卓开发做区分写代码的,所以我只能在注入JS完成后加了这么一句
[webView stringByEvaluatingJavaScriptFromString:@"test.h5CallApp=test.h5CallAppAnd2And3;"]
这句话的作用是替换JS里面的方法的。
随着移动互联网流量红利的逐渐退去,iOS程序员正在面临开发岗位增速下降的现实问题,一方面App开发的热度在下降,另一方面大型互联网平台相继推出了自己的小程序生态,在这些因素的综合影响下,iOS程序员的岗位竞争压力将进一步加剧。
作为iOS程序员来说,如果想在技术研发的道路上走得更远,可以从以下几个方面入手:
第一:丰富自身的知识结构。 在当前大数据以及产业互联网的推动下,软件开发的功能边界在不断得到拓展,同时由于大量的互联网公司开始采用数据驱动的运营方式,所以开发团队小型化的趋势也比较明显,这就要求程序员要具备更丰富的知识结构,以适应不同的开发角色。iOS程序员可以进一步从岗位任务开始进行知识结构的拓展,比如进一步丰富前端开发知识就是不错的选择,iOS程序员也完全可以走全栈开发路线。
第二:跳出iOS的生态圈。 iOS的生态圈相对来说还是比较封闭的,而且iOS程序员自身可以发挥的空间也相对有限,主要原因是系统的封闭性所导致的。如果想综合提升自身的研发能力,可以考虑跳出iOS的生态圈。
第三:走研发级路线。 iOS程序员也完全可以走研发级路线,走研发级路线需要做好三件事,其一是选择一个主攻方向;其二是有扎实的基础知识储备;其三是能够不断完成岗位升级,从而获得更多的资源整合渠道。不少应用级程序员在发展的过程中会遇到较大的上升瓶颈,通过读研来完成岗位升级也是一个比较常见的选择。
如果有互联网、大数据、人工智能等方面的问题,或者是考研方面的问题,都可以在评论区留言!
微信适配夜间模式了吗?这就是例子,强者话语权,ios先天的系统优势就是一个市场的锚点,微信知道自己的命根子在哪,为硬件设备提供极致操作的工具,例如Metal,无可匹敌,再说ios系统核心的源代码,与高端服务器os unix一脉相承,又有进一步的嵌入式操作,核心api专业打磨,绝对不是开源系统能比的量级,说白了每个环节都是钱砸出来的,靠的都是工匠精神,核心源码是任何一个程序员的宝藏,不要认为玩过几个跨平台根本不考虑性能的js小技术就明白了一切,只要去过Google开发者大会的就知道,看看安卓程序员手里吃饭的家伙是啥,mac,顶上的叶子再多也要靠下面的根,乔布斯,一骑绝尘
去开发华为系统的APP,动作要快
转后端 Java PHP go py都学一波
我干过大概一年的iOS开发,后来又转回java了,说句实话,iOS对开发者确实友好,一切都很不错,开发工作也很愉快,但是后来工作不太好找,而且iOS开发的发展深度没有java深,java深入不仅仅是curd,还有架构、框架、微服务、分布式 等等。而且java到架构之后,薪资也比iOS要高很多,不过我不建议你学我,除非你有毅力学习java,因为我除了有iOS开发经验之外,还有五年的java经验,说转也就转了。
作为IT行业的从事多年的程序狗,我来解答下您的这个问题。
2015年到2017年可能是IOS最热的一段时间,大量的软件开发人员投入IOS的市场。现今随着苹果公司的销量不断受挫。IOS的市场也是不温不火。
IOS开发程序员,其实可以尝试这跳出这个生态舒适圈,软件这个行业是多向选择的,软件的开发思想、程序的设计思想都是大同小异的。对于一个精深IOS开发人员来说,对于别的语言多少都会掌握一些,这对于您跳出IOS的圈也是一大帮助。毕竟Java、Python现在是市场上的主流语言。
另一个方面就是很多资深程序员选择的,进入深层次领域的学习。走研发级的一些路线。研发级软件研发的职位生命周期长。工作压力会比程序员小很多,很适合大龄程序员的选择。
或者就是选择自己的一个主攻方向,做这个方向的专家,这也不失为一种选择。丰富自身的知识结构,向着全栈开发工程师不断的前进。
或者可以尝试这转行管理层,做一些技术经理、技术总监。当然任何一种选择都需要您结合自身的实际情况去抉择。谨慎考虑、然后在做选择。
希望回答对您有所帮助。
我本人从事多年互联网Java开发,感兴趣的朋友可以关注私聊,共同努力,共同进步。
谢谢!
我是8年iOS开发从业者,结合我自身情况以及我自己的职业规划,希望能够帮到你。
焦虑 今年已经三十岁了,对于iOS的现状和未来也时常感到焦虑,大龄程序员未来的出路在哪,我也会迷茫。
市场需求 移动开发需要iOS,安卓两端一起开发,耗费的时间成本是企业会考虑的,再加上html5、小程序、各种跨端方案的出现,市场对原生开发需求更少了。
案例 再分享一个之前做主管时我招聘C++开发的一个经历,杭州C++需求量不大,但是这位应聘者能力过硬,最终进了华为。
我们应该怎么做 上面的案例也印证了只要自身技术过硬,只要市场还有需求,过多的担心和焦虑是没有必要的,把大量的时间花在 探索 未来方向,不如沉下心来学习技术,努力提高自己,成为不可替代的人才。其实应对焦虑最好的方法是行动,目前市场更需要的是高端人才,只要有岗位需求,把自身能力提高上去之后,现在所担忧的问题都会迎刃而解。
希望我的回答对你有帮助,随时欢迎留言反馈。
flutter欢迎你
转其他语言,或者自己独立开发
我鼓捣flutter去了
前端开发最重要的基础就三门技术 jvascript+css+html,js是其中最重要的
ps可以不掌握,工作的时候一般只需要会切图就行,而且很多公司会让作图的人切好图,你可以不考虑
flash完全不用理会,pc上flash日渐消沉,无线上早就死光光了
我想说的 最重要的,就是基础,深入掌握一下javascript和css基础,这两个是无论是面试相关,跟以后的项目开发,都是最息息相关的。如果时间不够的话,重点掌握javascript,推荐两本书,你选其中一本就行,一是犀牛书(javascript权威指南),另外一本是javascript高级程序设计(尼古拉斯大神的书,目前第三版),重点掌握js语法基础,ajax,面向对象相关(基于原型的继承等高级技术)。
css推荐 css权威指南一书,css学习是很枯燥的,一般在项目过程中才能不断掌握,如果没有条件,可以重点学一下选择器,定位,盒模型和浮动这几章。
jquery在很多公司或者整个前端界用的居多,但在很多大公司面试时(像我在百度面试时,人家都豪不理会),因为这些公司重视的是基础,项目经验可以培养,但基础需要花狠劲才能掌握牢固。这些框架对你现在的作用是熟悉一下源码,看看它们怎么实现的。我也是大三才学的前端,并且边读框架边学的js,如果你对这样学感兴趣,推荐你读一下prototype.js的源码。jquery的源码太过讲究技巧,不太适合初学者去读。
最后谈一下准备作品这块,去年开始前端界衍生了一个新的职位,叫无线前端开发工程师,说白了就是在iphone和android手机上做网站,用到的技术基础还是js跟css,但不需要像pc那样考虑兼容性(IE6是很恶心的),最重要的,就是对html5和css3支持度比较高,这个职位目前还是很热门的,你可以往这个方向发展,掌握好基础后学这些新技术还是很容易的。利用css3和html5写一些demo绝对可以让考官眼前一亮。
如果你学了一学期掌握了基础,可以尝试联系我,百度还是很欢迎热爱技术的人的,特别是女生(嘿嘿),最后祝你成功。