JHHK

欢迎来到我的个人网站
行者常至 为者常成

待整理

目录

待整理

一、在原生端实现H5页面长按下载图片的功能
js注入实现:
注入一段js代码,这段代码监控长按事件
检测到长按的元素是IMG时,通过jsbridge调用原生回调将url传回原生
原生回调内下载图片并保存到本地

- (void)addLongPressSaveImgForXiaoC:(WKWebViewConfiguration*)configuration {
//    NSString *scriptSource = @"\
//        var timeout; \
//        document.body.addEventListener('touchstart', function(event) { \
//            console.log('Body touchstart');\
//            event.preventDefault(); \
//            if(event.target.tagName === 'IMG') { \
//                timeout = setTimeout(function() { \
//                    window.webkit.messageHandlers.imageHandler.postMessage(event.target.src); \
//                }, 1000); \
//            } \
//        }, false); \
//        document.body.addEventListener('touchend', function(event) { \
//            console.log('Body touchend');\
//            clearTimeout(timeout); \
//        }, false);";


    
//    NSString *scriptSource = @"\
//        var timeout; \
//        var touchStartTime; \
//        var touchStartX; \
//        var touchStartY; \
//        var touchStartDist; \
//        \
//        function getDistance(touches) { \
//            if (touches.length < 2) return 0; \
//            var dx = touches[0].pageX - touches[1].pageX; \
//            var dy = touches[0].pageY - touches[1].pageY; \
//            return Math.sqrt(dx * dx + dy * dy); \
//        } \
//        \
//        document.body.addEventListener('touchstart', function(event) { \
//            console.log('Body touchstart'); \
//            touchStartTime = Date.now(); \
//            if (event.touches.length === 1) { \
//                touchStartX = event.touches[0].pageX; \
//                touchStartY = event.touches[0].pageY; \
//            } else if (event.touches.length === 2) { \
//                touchStartDist = getDistance(event.touches); \
//            } \
//            \
//            if (event.target.tagName === 'IMG') { \
//                timeout = setTimeout(function() { \
//                    window.webkit.messageHandlers.imageHandler.postMessage(event.target.src); \
//                }, 1000); \
//            } \
//        }, false); \
//        \
//        document.body.addEventListener('touchmove', function(event) { \
//            console.log('Body touchmove'); \
//            if (event.touches.length === 1) { \
//                var moveX = event.touches[0].pageX - touchStartX; \
//                var moveY = event.touches[0].pageY - touchStartY; \
//                if (Math.abs(moveX) > 10 || Math.abs(moveY) > 10) { \
//                    clearTimeout(timeout); \
//                } \
//            } else if (event.touches.length === 2) { \
//                var moveDist = getDistance(event.touches); \
//                if (Math.abs(moveDist - touchStartDist) > 10) { \
//                    clearTimeout(timeout); \
//                } \
//            } \
//        }, false); \
//        \
//        document.body.addEventListener('touchend', function(event) { \
//            console.log('Body touchend'); \
//            clearTimeout(timeout); \
//        }, false); \
//    ";
//
    
    
    
    
      NSString *scriptSource = @"\
          var touchStartTime; \
          var touchStartX; \
          var touchStartY; \
          \
          document.body.addEventListener('touchstart', function(event) { \
              console.log('Body touchstart'); \
              touchStartTime = Date.now(); \
              touchStartX = event.pageX; \
              touchStartY = event.pageY; \
          }, false); \
          \
          document.body.addEventListener('touchend', function(event) { \
            console.log('Body touchend',event); \
            if (event.target.tagName === 'IMG') { \
                console.log('IMG touchend'); \
                var touchTime = Date.now() - touchStartTime; \
                var moveX = Math.abs(event.pageX - touchStartX); \
                var moveY = Math.abs(event.pageY - touchStartY); \
                console.log('touchTime:',touchTime, 'moveX:',moveX,'moveY:',moveY); \
                if (touchTime > 1000 && moveX < 10 && moveY < 10) { \
                    window.webkit.messageHandlers.imageHandler.postMessage(event.target.src); \
                } \
            } \
          }, false); \
      ";
    
    
//    NSString *scriptSource = @"\
//    function traverseAndAddEventListener(node) { \
//      console.log('traverseAndAddEventListener 调用'); \
//      // 检查节点是否为img标签 \
//      if (node.tagName === 'IMG') { \
//        node.addEventListener('touchmove', function(event) { \
//          // 处理触摸移动事件的代码 \
//          console.log('Image touchmove'); \
//          // 添加您想要执行的逻辑 \
//        }, false); \
//        \
//        node.addEventListener('touchstart', function(event) { \
//          // 处理触摸移动事件的代码 \
//          console.log('Image touchstart'); \
//          // 添加您想要执行的逻辑 \
//        }, false); \
//      } \
//      \
//      // 递归遍历子节点 \
//      var children = node.childNodes; \
//      for (var i = 0; i < children.length; i++) { \
//        traverseAndAddEventListener(children[i]); \
//      } \
//    } \
//    \
//    // 从document.body开始遍历 \
//    traverseAndAddEventListener(document.body); \
//";

    
    WKUserScript *userScript = [[WKUserScript alloc] initWithSource:scriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    [configuration.userContentController addUserScript:userScript];
    [configuration.userContentController addScriptMessageHandler:self name:@"imageHandler"];
}

二、完善pod库私有化的流程

三、flutter 引擎 梳理

四、flutter的页面是如何加载的

两个重要的参数:entrypoint 和 route 并且route可以携带query参数
route在flutter处需要有对应的注册

[flutterEngine runWithEntrypoint:@"main" initialRoute:[NSString stringWithFormat:@"/%@", routeString]];

五、网络代理检测提示

待整理2

硬件 驱动 kernel

FW

Git 是如何管理文件夹的
为什么同事删除了文件夹我拉取后文件夹还在?

flutter attach 的原理

studio 解决冲突
先处理冲突,冲突解决完后然后左右全进

Kernel

DSL flutter 热更新的原理

鸿蒙数据库

待整理3

玄关 宽120 高2米1

阳台宽1米3,长2米2 晾衣架:吊顶25公分

电钻

防火用品

戴森吸尘器

餐边柜

厨房架子


行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.