热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ios中仿支付宝js与oc交互,ios和js交互

本文目录一览:1、iOS开发(OC)——支付宝支付

本文目录一览:


  • 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,其余的类型暂时不支持。


推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 使用jqTransform插件美化表单
    jqTransform 是由 DFC Engineering 开发的一款 jQuery 插件,专用于美化表单元素,操作简便,能够美化包括输入框、单选按钮、多行文本域、下拉选择框和复选框在内的所有表单元素。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 基于 Vue 和 Element UI 实现的简洁登录界面设计
    本文介绍了一种利用 Vue.js 和 Element UI 框架构建的简洁登录界面设计。该设计不仅注重用户体验,还确保了界面的美观性和易用性。通过合理的布局和组件配置,实现了高效、响应式的登录功能,适用于多种前端应用场景。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的RossIhaka和RobertGentleman开发(也因此称为R),现在由R开 ... [详细]
author-avatar
书友60061807
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有