1.html中的点击按钮和回调显示标签—————直接上代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" name="" value="拍照" onclick="takeIDcardImg()"> <!--点击拍照调用相机-->
<br/>
<p id="result">扫描结果:</p> <!--原生给h5值---插入html上-->
<script>
//调用APP的扫描方法 h5->app
function takeIDcardImg(){
app.takeIDcardImg('imgBase');
}
//扫描结果回调方法 app->h5
function imgBase(result){
document.getElementById("result").innerHTML = '扫描结果:' + result;
}
</script>
</body>
</html>
2.使用———- JavaScriptCore的—-这里是创建了一个类,也可以用块回调。
(1)。创建AppJSObject类继承NSObject .———– AppJSObject.h
#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>
NS_ASSUME_NONNULL_BEGIN
@protocol AppJSObjectDelegate <JSExport>
-(void)takeIDcardImg:(NSString *)message;//--takeIDcardImg--方法名要是html中保持一致
@end
@interface AppJSObject : NSObject<AppJSObjectDelegate>
@property(nonatomic,weak) id<AppJSObjectDelegate> delegate;
@end
NS_ASSUME_NONNULL_END
(2).AppJSObject.m
-(void)takeIDcardImg:(NSString *)message{
NSLog(@"%@",message);
[self.delegate takeIDcardImg:message];
}
3.ViewController控制起中
#import "WebViewController.h"
#import <JavaScriptCore/JavaScriptCore.h>
#import "AppJSObject.h"
@interface WebViewController ()<UIWebViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, AppJSObjectDelegate>
@property (nonatomic, strong) UIWebView * webView;
@property (nonatomic, strong) UIImageView * imageVC;
@end
@implementation WebViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
self.webView.dataDetectorTypes = UIDataDetectorTypeAll;
[self.view addSubview:_webView];
self.webView.delegate = self;
[self loadExamplePage:_webView];//本地加载
}
- (void)loadExamplePage:(UIWebView*)webView {
NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"];
NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
NSURL *baseURL = [NSURL fileURLWithPath:htmlPath];
[webView loadHTMLString:appHtml baseURL:baseURL];
}
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
//NSLog(@"------UserAgent = %@", [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]);
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
AppJSObject *jsObject = [AppJSObject new];
jsObject.delegate = self;
context[@"app"] = jsObject;
}
-(void)takeIDcardImg:(NSString *)message {
[self openCamera];
}
/**
* 调用照相机
*/
- (void)openCamera {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES; //可编辑
//判断是否可以打开照相机
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
//摄像头
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
//出现这个问题,基本就是UI操作放在了非主线程中操作导致。我的问题是webview的回调,有时候会进入子线程处理。所以统一加上dispatch_async(dispatch_get_main_queue...
dispatch_async(dispatch_get_main_queue(), ^{ //不加这句有时候点击会闪退
[self presentViewController:picker animated:YES completion:nil];
});
}
else
{
NSLog(@"没有摄像头");
}
}
#pragma mark - UIImagePickerControllerDelegate
// 拍照完成回调
//参数:图片选择器 字典参数
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
//通过key值获取到图片
UIImage * image =info[UIImagePickerControllerOriginalImage];
//NSLog(@"image=%@ info=%@",image, info);
//判断数据源类型
if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) {
//设置图片背景
// NSUserDefaults * user = [NSUserDefaults standardUserDefaults];
// NSData* imgData = UIImageJPEGRepresentation(image, 1);
self.imageVC.image = image;
[self dismissViewControllerAnimated:YES completion:nil];
}
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
NSLog(@"在相机中选择图片");
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
//设置图片背景
self.imageVC.image = image;
// NSData *data = UIImageJPEGRepresentation(image, 1.0f);
//
// NSString *encodedImageStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];//新的方法
NSData *imageData = UIImageJPEGRepresentation(image, 1.0f);
NSString *dataStr = [imageData base64Encoding];//这个base64方法被遗弃了,但是前端能接受到,最新方法,他接受不到只能将就了
JSContext *context=[self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *alertJS= [NSString stringWithFormat:@"imgBase('%@')",dataStr];//准备执行的js代码 --这里的imgBase要与html 中保持一致
[context evaluateScript:alertJS];//通过oc方法调用js
dispatch_async(dispatch_get_main_queue(), ^{
[self dismissViewControllerAnimated:YES completion:nil];
});
}
}
//进入拍摄页面点击取消按钮
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
dispatch_async(dispatch_get_main_queue(), ^{
[self dismissViewControllerAnimated:YES completion:nil];
});
}
4.还有就是前端要判断手机类型.UserAgent需要修改下在appdelegate中添加
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *newUserAgent = [userAgent stringByAppendingString:@"IOSAPP"];//自定义需要拼接的字符串
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
5.还有几种方法。参考链接。https://blog.csdn.net/dolacmeng/article/details/79623708
版权声明:本文为u012106239原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。