本文目录一览:
- 1、iOS开发(OC)——支付宝支付
- 2、OC与JS交互-WKWebView篇
- 3、OC仿支付宝返回到后台添加模糊效果
- 4、JS与OC交互、js事件注入、修改js方法实现
- 5、iOS - OC 与 JS 交互六种方式总结
- 6、如何在IOS平台上使用js直接调用OC方法
iOS开发(OC)——支付宝支付
1、首先在支付宝开发者平台上创建应用,并按照开发者平台上的步骤把SDK接入,配置环境(这些步骤支付宝开发者平台写的很清楚,下面我主要写一些开放平台没有,或者需要注意的地方)
2、导入头文件 #import AlipaySDK/AlipaySDK.h (如果报错,则是缺少某些类库或者静态库和头文件路径没有设置好,请仔细查看并按照开放平台的步骤检查,或者看一下这个: )
3、iOS 8.0以下重写下面方法
4、iOS 9.0以上实现下面的方法(也就是说,如果app要兼容iOS 8.0以上,则步骤3和步骤4的方法都要实现)
5、发起支付
注意:为了支付完成后能成功返回app,需要在info.plist文件中设置URL scheme,并且这个值是唯一的(最好填写bundel id 或者开放平台上的app ID),详细步骤在支付宝开放平台的接入文档有
OC与JS交互-WKWebView篇
oc 跟 js 端协议好方法名 比如 js 的方法为 Back()
1.oc 对 js 的方法进行监听
[config.userContentController addScriptMessageHandler:self name:@"Back"];
2.oc 设置代理并且导入代理
WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler
self.webView.UIDelegate = self;
self.webView.navigationDelegate = self;
3.实现代理
- (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message;
4.离开页面的时候移除监听
[config.userContentController removeScriptMessageHandlerForName:@"Back"];
1.创建按钮 并且实现按钮的回调
input type="button" value="返回按钮" onclick="backClick()" /
2.按钮的响应方法中添加发送消息到 OC (可以携带参数)
functionbackClick() {window.webkit.messageHandlers.Back.postMessage('固定写的 js 值--点击了返回');}
1.OC 添加对 JS 的消息监听,实现代理对监听的实现方法。
2.JS 端在合适的时机发送消息,并且可以携带参数。
js 跟 oc 端协议好方法名 比如 js 的方法为 transferPrama(str)
//oc 在合适的时机调用 js 方法(可以传参数)
NSString* paramString =@"我是 OC 调用 JS";
NSString* jsStr = [NSStringstringWithFormat:@"transferPrama('%@')",paramString];
[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {NSLog(@"result=%@ error=%@",result, error);}];
//js需要定义一个对应的方法供 OC 调用
functiontransferPrama(str) {
document.getElementById("secondid").value = str;
}
- (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message
- (void)evaluateJavaScript:(NSString*)javaScriptString completionHandler:(void(^_Nullable)(_Nullableid,NSError*_Nullableerror))completionHandler;
愤怒的牛牛的
愤怒的牛牛的新浪博客
愤怒的牛牛的GitHub
OC仿支付宝返回到后台添加模糊效果
最近在使用支付宝的过程中发现当支付宝运行在手机后台,我们双击Home键切换app的时候,支付宝为了保护用户隐私会添加模糊效果。自己就模仿着实现了一下,先说一下我的实现思路:
获取到当前window的截屏图片并保存到沙盒,然后在下面这个方法里面将你创建的覆盖window上view显示出来
在app将药进入前台的时候将你创建覆盖在window上的view移除掉
图片高斯模糊效果的实现
屏幕截图的实现
保存沙盒的实现
读取沙盒截图的实现
demo的 传送门
如果对您有帮助,顺便给个✨吧!
JS与OC交互、js事件注入、修改js方法实现
由于UIWebview即将废弃,相比较于WKWebview,通过测试即可发现UIWebview占用更多内存,且内存很夸张。WKWebView网页加载速度也有提升,但是并不像内存那样提升那么多。下面列举一些其它的优势:
WKScriptMessageHandler是因为我们要处理JS调用OC方法的请求。
WKScriptMessage有两个关键属性name 和 body。
因为我们给每一个OC 方法取了一个name,那么我们就可以根据name 来区分执行不同的方法。body 中存着JS 要给OC 传的参数。
ocAddAction方法在js文件中并没有定义
实现WKNavigationDelegate协议方法,执行之后会在WKScriptMessageHandler代理方法中拦截到 ocZRAction
动态修改alert系统函数的实现,当js中调用alert函数时,触发的是我们自定义方法
URL Scheme拦截的问题,这里不做赘述,请看 demo
JS注入详情
参考链接:
链接一
链接二
iOS - OC 与 JS 交互六种方式总结
在 APP 中,免不了与 H5页面打交道,所以掌握 与 JS 交互就显的至关重要,本文总结了常见的与 JS 交互方式。
注意事项
在 OC 原生中
在 html 文件中
早期的JS与原生交互的开源库很多都是用得这种方式来实现的,例如:PhoneGap、 WebViewJavascriptBridge 。
效果图
使用WKNavigationDelegate中的代理方法,拦截自定义的 URL 来实现 JS 调用 OC 方法。
注意点
关于如何区分执行不同的OC 方法,也与UIWebView的处理方式一样,通过URL 的host 来区分执行不同的方法:
JS 调用OC 方法后,有的操作可能需要将结果返回给JS。这时候就是OC 调用JS 方法的场景。
WKWebView 提供了一个新的方法 evaluateJavaScript:completionHandler: ,实现OC 调用JS 等场景。
注意点
运行结果
在iOS 7之后,apple添加了一个新的库JavaScriptCore,用来做JS交互,因此JS与原生OC交互也变得简单了许多。
首先导入JavaScriptCore库, 然后在OC中获取JS的上下文。
再然后定义好JS需要调用的方法,例如JS要调用share方法:
则可以在UIWebView加载url完成后,在其代理方法中添加要调用的share方法:
OC 调用 JS 方法有多种,首先介绍使用JavaScriptCore框架的方式。
使用JSContext 的方法 -evaluateScript ,可以实现 OC 调用 JS 方法
效果图
使用WKWebView的时候,如果想要实现JS调用OC方法,除了拦截URL之外,还有一种简单的方式。那就是利用WKWebView的新特性MessageHandler来实现JS调用原生方法。
创建 WKWebViewConfiguration 对象,配置各个API对应的MessageHandler。
然后在界面即将显示的时候添加MessageHandler
需要注意的是addScriptMessageHandler很容易引起循环引用,导致控制器无法被释放,所以需要移除MessageHandler
这里实现了两个协议 WKUIDelegate,WKScriptMessageHandler , WKUIDelegate 是因为我在JS中弹出了alert 。 WKScriptMessageHandler 是因为我们要处理JS调用OC方法的请求。
WKScriptMessage 有两个关键属性 name 和 body 。
因为我们给每一个OC 方法取了一个name,那么我们就可以根据name 来区分执行不同的方法。body 中存着JS 要给OC 传的参数。
关于参数body 的解析,我就举一个body中放字典的例子,其他的稍后可以看demo。
解析JS 调用OC 实现分享的参数:
message.boby 就是JS 里传过来的参数。我们不同的方法先做一下容错性判断。然后正常取值就可以了。
下面只列举一个shareClick()方法,其他看Demo
这里使用WKWebView 实现OC 调用JS方法与之前说的文章一样,通过
- evaluateJavaScript:completionHandler:
效果图如下图所示
详情看下面文章链接
iOS下 JS 与 OC 互相调用(五) - UIWebView+WebViewJavascriptBridge
详情看下面文章链接
iOS下 JS 与 OC 互相调用(六) - WKWebView+WKWebViewJavascriptBridge
iOS下 JS 与OC 互相调用(一) - UIWebView 拦截 URL
iOS下 JS 与OC 互相调用(二) - JavaScriptCore
iOS 下 JS 与 OC 互相调用(三) - WKWebView 拦截 URL
iOS下JS与OC互相调用(四)-MessageHandler
iOS下 JS 与 OC 互相调用(五) - UIWebView+WebViewJavascriptBridge
iOS下 JS 与 OC 互相调用(六) - WKWebView+WKWebViewJavascriptBridge
如何在IOS平台上使用js直接调用OC方法
在Cocos2d-JS v3.0 RC2中,与Android上js调用Java一样,Cocos2d-JS也提供了在iOS和Mac上js直接调用Objective-C的方法,示例代码如下:
1 var ojb = jsb.reflection.callStaticMethod(className, methodNmae, arg1, arg2, .....);
在 jsb.reflection.callStaticMethod 方法中,我们通过传入OC的类名,方法名,参数就可以直接调用OC的静态方法,并且可以获得OC方法的返回值。
类
•参数中的类名,只需要传入OC中的类名即可,与Java不同,类名并不需要路径。比如你在工程底下新建一个类 NativeOcClass ,只要你将他引入工程,那么他的类名就是 NativeOcClass ,你并不需要传入它的路径。
1 import Foundation/Foundation.h @interface NativeOcClass : NSObject +( BOOL )callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content; @end
方法
•js到OC的反射仅支持OC中类的静态方法。
•方法名比较要需要注意,我们需要传入完整的方法名,特别是当某个方法带有参数的时候,你需要将他的:也带上。根据上面的例子。此时的方法名字是callNativeUIWithTitle:andContent:,不要漏掉了他们之间的:。
•如果是没有参数的函数,那么他就不需要:,如下代码,他的方法名是 callNativeWithReturnString ,由于没有参数,他不需要:,跟OC的method写法一致。
1 +(NSString *)callNativeWithReturnString;
使用示例
•下面的示例代码将调用上面 NativeOcClass 的方法,在js层我们只需要这样调用:
1234 var ret = jsb.reflection.callStaticMethod( "NativeOcClass" , "callNativeUIWithTitle:andContent:" , "cocos2d-js" , "Yes! you call a Native UI from Reflection" );
•这里是这个方法在OC的实现,可以看到是弹出一个native的对话框。并把 title 和 content 设置成你传入的参数,并返回一个boolean类型的返回值。
123 +( BOOL )callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content{ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:content delegate:self cancelButtonTitle:@ "Cancel" otherButtonTitles:@ "OK" , nil]; [alertView show]; return true ; }
•此时,你就可以在 ret 中接受到从OC传回的返回值(true)了。
注意
在OC的实现中,如果方法的参数需要使用float、int、bool的,请使用如下类型进行转换:
•float,int 请使用NSNumber类型
•bool请使用BOOL类型。
•例如下面代码,我们传入2个浮点数,然后计算他们的合并返回,我们使用NSNumber而不是int、float去作为参数类型。
1 +( float ) addTwoNumber:(NSNumber *)num1 and:(NSNumber *)num2{ float result = [num1 floatValue]+[num2 floatValue]; return result;}
•目前参数和返回值支持 int, float, bool, string,其余的类型暂时不支持。