美文网首页工具相关
iOS WebView长按网页里的图片识别图片中的二维码和保存图

iOS WebView长按网页里的图片识别图片中的二维码和保存图

作者: 弹吉他的少年 | 来源:发表于2019-10-11 14:29 被阅读0次

    Demo地址:KJWebDiscernDemo

    前言

    不需要和H5做交互实现长按识别网页当中的图片,然后配合识别二维码功能即可实现长按识别网页当中二维码操作,于是有了下面的工具长按识别网页图片


    13.jpg

    框架整体介绍

    <a id="作者信息"></a>作者信息

    Github地址:https://github.com/yangKJ
    简书地址:https://www.jianshu.com/u/c84c00476ab6
    博客地址:https://blog.csdn.net/qq_34534179

    <a id="作者其他库"></a>作者其他Pod库

    /*
    *********************************************************************************
    *
    *⭐️⭐️⭐️ ----- 本人其他库 ----- ⭐️⭐️⭐️
    *
    粒子效果、自定义控件、自定义选中控件
    pod 'KJEmitterView'
    pod 'KJEmitterView/Control' # 自定义控件
    
    扩展库 - Button图文混排、点击事件封装、扩大点击域、点赞粒子效果,
    手势封装、圆角渐变、倒影、投影、内阴影、内外发光、渐变色滑块等,
    图片加工处理、滤镜渲染、泛洪算法、识别网址超链接等等
    pod 'KJExtensionHandler'
    pod 'KJExtensionHandler/Foundation'
    pod 'KJExtensionHandler/Exception'
     
    基类库 - 封装整理常用,采用链式处理,提炼独立工具
    pod 'KJBaseHandler'
    pod 'KJBaseHandler/Tool' # 工具相关
    pod 'KJBaseHandler/Router' # 路由相关
    
    播放器 - KJPlayer是一款视频播放器,AVPlayer的封装,继承UIView
    视频可以边下边播,把播放器播放过的数据流缓存到本地,下次直接从缓冲读取播放
    pod 'KJPlayer'  # 播放器功能区
    pod 'KJPlayer/KJPlayerView'  # 自带展示界面
    
    轮播图 - 支持缩放 多种pagecontrol 支持继承自定义样式 自带网络加载和缓存
    pod 'KJBannerView'  # 轮播图,网络图片加载 支持网络GIF和网络图片和本地图片混合轮播
    
    加载Loading - 多种样式供选择 HUD控件封装
    pod 'KJLoading' # 加载控件
    
    菜单控件 - 下拉控件 选择控件
    pod 'KJMenuView' # 菜单控件
    
    工具库 - 推送工具、网络下载工具、识别网页图片工具等
    pod 'KJWorkbox' # 系统工具
    pod 'KJWorkbox/CommonBox'
    
    * 如果觉得好用,希望您能Star支持,你的 ⭐️ 是我持续更新的动力!
    *
    *********************************************************************************
    */
    
    Issue

    如果您在使用中有好的需求及建议,或者遇到什么bug,欢迎随时issue,我会及时的回复,有空也会不断优化更新这些库

    <a id="使用方法"></a>使用方法

    /// 回调获取长按识别的图片
    + (void)kj_initWithWKWebView:(WKWebView*)webView QRCodeImageBlock:(KJQRCodeImageBlock)block;
    
    

    实现代码

    //
    //  KJWebDiscernTool.m
    //  KJWebDiscernDemo
    //
    //  Created by 杨科军 on 2019/10/11.
    //  Copyright © 2019 杨科军. All rights reserved.
    //
    
    #import "KJWebDiscernTool.h"
    
    @interface KJWebDiscernTool ()<UIGestureRecognizerDelegate>//,WKNavigationDelegate>
    @property(nonatomic,copy,class) KJQRCodeImageBlock xxblock; /// 类属性block
    @property(nonatomic,strong) WKWebView *saveWebView;
    @property(nonatomic,strong) UIImage *currentImage;
    
    @end
    
    @implementation KJWebDiscernTool
    static KJQRCodeImageBlock _xxblock = nil;
    static KJWebDiscernTool *kj_tool = nil;
    + (KJQRCodeImageBlock)xxblock{
        if (_xxblock == nil) {
            _xxblock = ^void(UIImage *image){ };
        }
        return _xxblock;
    }
    + (void)setXxblock:(KJQRCodeImageBlock)xxblock{
        if (xxblock != _xxblock) {
            _xxblock = [xxblock copy];
        }
    }
    
    + (void)kj_initWithWKWebView:(WKWebView*)webView QRCodeImageBlock:(KJQRCodeImageBlock)block{
        self.xxblock = block;
        @synchronized (self) {
            if (kj_tool == nil) {
                kj_tool = [[KJWebDiscernTool alloc]init];
            }
        }
        [kj_tool kj_configWithWKWebView:webView];
    }
    
    - (void)kj_configWithWKWebView:(WKWebView*)webView{
        self.saveWebView = webView;
    //    self.saveWebView.navigationDelegate = self;
        UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
        longPress.minimumPressDuration = 1;
        longPress.delegate = self;
        [webView addGestureRecognizer:longPress];
    }
    - (void)handleLongPress:(UILongPressGestureRecognizer *)sender{
        if (sender.state != UIGestureRecognizerStateBegan) return;
        CGPoint touchPoint = [sender locationInView:self.saveWebView];
    //    UIImage *image = [self kj_getWebImageWithTouchPoint:touchPoint];
    //    if (self.currentImage == nil || self.currentImage != image) {
    //        self.currentImage = image;
    //    }
    //    _xxblock(self.currentImage);
        __weak typeof(self) weakself = self;
        // 获取长按位置对应的图片url的JS代码
        NSString *imgJS = [NSString stringWithFormat:@"document.elementFromPoint(%f,%f).src", touchPoint.x, touchPoint.y];
        // 执行对应的JS代码 获取url
        [self.saveWebView evaluateJavaScript:imgJS completionHandler:^(id _Nullable imgUrl, NSError * _Nullable error) {
            if (imgUrl) {
                NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgUrl]];
                weakself.currentImage = [UIImage imageWithData:data];
            }
            _xxblock(weakself.currentImage);
        }];
    }
    ///// 用工厂方法如何return block里的值 - 同步处理
    //- (UIImage*)kj_getWebImageWithTouchPoint:(CGPoint)touchPoint{
    //    __block UIImage *image = NULL;
    //    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //    dispatch_semaphore_t sem = dispatch_semaphore_create(0);//创建信号量初始值为0  0:表示无限等待
    //    __weak typeof(self) weakself = self;
    //    dispatch_group_async(dispatch_group_create(), queue, ^{
    //        // 获取长按位置对应的图片url的JS代码
    //        NSString *imgJS = [NSString stringWithFormat:@"document.elementFromPoint(%f,%f).src", touchPoint.x, touchPoint.y];
    //        // 执行对应的JS代码 获取url
    //        [weakself.saveWebView evaluateJavaScript:imgJS completionHandler:^(id _Nullable imgUrl, NSError * _Nullable error) {
    //            if (imgUrl) {
    //                NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgUrl]];
    //                image = [UIImage imageWithData:data];
    //            }
    //            dispatch_semaphore_signal(sem); //发送信号量 信号量+1
    //        }];
    //    });
    //    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);//阻塞等待 信号量-1
    //    return image;
    //}
    
    #pragma mark - UIGestureRecognizerDelegate
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        return YES;
    }
    //#pragma mark - WKNavigationDelegate
    //// 页面加载完成之后调用
    //- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    //    /// 禁止弹出菜单
    //    [self.saveWebView evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout = 'none';" completionHandler:nil];
    //    // 禁止选中 - 禁止用户复制粘贴
    //    [self.saveWebView evaluateJavaScript:@"document.documentElement.style.webkitUserSelect = 'none';" completionHandler:nil];
    //}
    
    @end
    

    在配合识别二维码工具就可实现长按识别图中二维码

    GitHub地址:KJScanDemo

    长按识别介绍就到此完毕,后面有相关再补充,写文章不容易,还请点个小星星传送门

    相关文章

      网友评论

        本文标题:iOS WebView长按网页里的图片识别图片中的二维码和保存图

        本文链接:https://www.haomeiwen.com/subject/gcwtmctx.html