IOS webview打开相机 相册 选择文件上传

IOS使用wkwebview

一、核心前提:配置 Info.plist 权限
iOS 调用相机 / 相册必须在 Info.plist 中添加权限描述,否则会直接崩溃或无响应:
右键 Info.plist → 选择「Open As」→「Source Code」,添加以下代码:

<!-- 相机权限 --><key>NSCameraUsageDescription</key><string>需要访问相机以拍摄照片</string><!-- 相册权限(读取) --><key>NSPhotoLibraryUsageDescription</key><string>需要访问相册以选择照片</string><!-- iOS 11+ 相册写入(如需上传后保存可加) --><key>NSPhotoLibraryAddUsageDescription</key><string>需要访问相册以保存照片</string>

二、WKWebView 配置与权限处理

  1. 初始化 WKWebView 并设置代理
import WebKit import Photos class WebViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { var webView: WKWebView! override func viewDidLoad(){super.viewDidLoad()// 1. 配置 WKWebView let webConfig =WKWebViewConfiguration()// 允许 JS 交互(前端触发选择图片必须开) webConfig.preferences.javaScriptEnabled = true webConfig.preferences.javaScriptCanOpenWindowsAutomatically = true // 2. 创建 WKWebView webView =WKWebView(frame: view.bounds, configuration: webConfig) webView.uiDelegate =self// 必须设置,处理权限请求 webView.navigationDelegate =self view.addSubview(webView)// 3. 加载本地/远程页面(示例加载本地 test.html)if let htmlPath = Bundle.main.path(forResource:"test", ofType:"html"){ let htmlURL =URL(fileURLWithPath: htmlPath) webView.loadFileURL(htmlURL, allowingReadAccessTo: htmlURL.deletingLastPathComponent())}}}
  1. 实现 WKUIDelegate 处理相机 / 相册权限请求
    WKWebView 会通过 webView:permissionRequest: 回调请求媒体权限,需在这里处理:
    `// MARK: - WKUIDelegate
    extension WebViewController {
    // 处理权限请求(相机/麦克风/相册等)
    func webView(_ webView: WKWebView, permissionRequest: WKPermissionRequest) {
    // 1. 相机权限
    if permissionRequest.permissionType == .camera {
    // 先检查系统相机权限
    AVCaptureDevice.requestAccess(for: .video) { granted in
    DispatchQueue.main.async {
    granted ? permissionRequest.allow() : permissionRequest.deny()
    }
    }
    }
    // 2. 相册权限(WKPermissionType 无直接相册枚举,需配合前端 input 触发)
    else if permissionRequest.permissionType == .photos {
    PHPhotoLibrary.requestAuthorization { status in
    DispatchQueue.main.async {
    status == .authorized ? permissionRequest.allow() : permissionRequest.deny()
    }
    }
    }
    // 其他权限(如麦克风)可按需处理
    else {
    permissionRequest.allow()
    }
    }// iOS 14+ 新增:细化相册权限请求(只读/可写)
    func webView(_ webView: WKWebView, requestMediaCapturePermissionFor origin: WKSecurityOrigin, initiatedByFrame frame: WKFrameInfo, type: WKMediaCaptureType, decisionHandler: @escaping (WKPermissionDecision) -> Void) {
    if type == .camera {
    AVCaptureDevice.requestAccess(for: .video) { granted in
    decisionHandler(granted ? .grant : .deny)
    }
    } else if type == .microphone {
    AVCaptureDevice.requestAccess(for: .audio) { granted in
    decisionHandler(granted ? .grant : .deny)
    }
    }
    }
    }`

三、扩展:JS 与原生交互(可选)
如果需要将选择的图片传给原生处理(如上传、压缩),可添加 WKScriptMessageHandler:

// 初始化时添加消息处理器 webConfig.userContentController.add(self, name:"uploadImage")// 实现消息处理 extension WebViewController: WKScriptMessageHandler { func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage){if message.name =="uploadImage", let imageData = message.body as? String {// 处理前端传递的图片 Base64 数据print("收到图片数据:", imageData)}}}

前端可将图片转为 Base64 后调用:

// 前端将图片转 Base64 并传给原生functionuploadImage(file){const reader =newFileReader(); reader.onload=function(e){ window.webkit.messageHandlers.uploadImage.postMessage(e.target.result);}; reader.readAsDataURL(file);}

关键注意事项

ATS 限制:如果加载远程 HTTPS 页面,需确保服务器配置符合 iOS ATS 规则(iOS 9+ 默认禁用 HTTP,如需允许需在 Info.plist 加 NSAppTransportSecurity 例外);
iOS 版本差异:
iOS 14+ 需用 requestMediaCapturePermissionFor 细化媒体权限;
iOS 15+ 对相册权限新增「部分访问」,需兼容 PHAuthorizationStatus.limited;
文件大小限制:前端选择图片后,如需传给原生,可通过 WKScriptMessageHandler 交互,避免大文件卡顿;
权限申请时机:不要提前申请权限,需等用户触发 input 后再由系统弹窗申请(符合 iOS 隐私规范)。

android webview 打开相机 相册 图片上传。

Read more

Java+Leaflet:湖南省道路长度WebGIS的构建与实践

Java+Leaflet:湖南省道路长度WebGIS的构建与实践

目录 前言 一、基础空间数据简介 1、涉及相关表 2、省域道路长度检索 二、Java后台实现 1、道路视图对象 2、Mapper空间检索查询 3、控制API实现 三、WebGIS界面实现 1、里程图例及初始化 2、各地市信息展示 四、成果展示 1、总体展示 2、分区域说明 五、总结 前言         在当今数字化时代,地理信息系统(GIS)技术在各个领域都发挥着至关重要的作用。它不仅为城市规划、交通管理、环境保护等提供了强大的技术支持,也为公众获取地理信息提供了便捷的途径。湖南省作为中国中部地区的重要省份,拥有复杂的地理环境和庞大的交通网络。如何高效地管理和展示湖南省的道路长度信息,对于交通规划、物流运输以及公众出行都具有极其重要的意义。因此,我们开展了基于Java和Leaflet的湖南省道路长度WebGIS系统的构建与实践研究。         湖南省地处中国中部,交通网络密集且复杂。随着经济的快速发展和城市化进程的加快,湖南省的道路建设不断推进,

By Ne0inhk

【前端面经】字节前端社招面经分享(已offer)

社招时间线 全程面试时间都是候选人定的,字节效率还是非常高的 * 10.23 HR电话沟通约面 * 10.28 技术一面(两小时后告知通过约面) * 10.30 技术二面(半小时后告知通过约面) * 11.4 技术三面(两小时后告知通过约面) * 11.5 HR面(三小时后告知通过) * 11.5 OC * 11.5 收集薪资流水证明 * 11.6 谈薪 * 11.11 书面offer 面试 基本都是从简历出发深挖问题,没有太多通用性,仅列出偏技术点不涉及具体项目的问题。 因为AI相关内容较多,所以问题也偏AI。 技术一面(1h) 1. 代码输出题:闭包与变量提升相关 2. 手写题:数组转树形结构 3. 手写题:

By Ne0inhk
前端学习日记 - 前端函数防抖详解

前端学习日记 - 前端函数防抖详解

前端函数防抖详解 * 为什么使用防抖 * 函数防抖的应用场景 * 函数防抖原理与手写实现 * 原理 * 手写实现 * 使用 Lodash 的 \_.debounce * 完整示例:防抖搜索组件 * 结语 在现代 Web 应用中,函数防抖(debounce)是一种常见且高效的性能优化手段,用于限制高频事件触发下的函数调用次数,从而减少不必要的计算、网络请求或 DOM 操作。本文将从“为什么使用防抖”切入,介绍典型的应用场景,深入解析防抖原理,并给出从零实现到在实际项目中使用 Lodash 的完整代码示例,帮助你快速掌握前端防抖技术。 为什么使用防抖 函数防抖的核心思想是在连续触发的事件停止后,仅执行最后一次调用,以避免频繁触发带来的性能问题 ([MDN Web Docs][1])。 在不使用防抖的情况下,例如在 input 输入事件或 window.resize 事件中直接调用逻辑,页面可能会因短时间内大量调用而出现卡顿或请求风暴 ([GeeksforGeeks]

By Ne0inhk
全Web化智慧PACS/RIS系统源码 (纯B/S架构)

全Web化智慧PACS/RIS系统源码 (纯B/S架构)

告别传统C/S架构的笨重客户端!本套源码采用纯Web前端技术实现极速调阅,支持CT、核磁(MR)、DR、超声等多模态影像。内置专业级Web Viewer,支持MPR多平面重建、MIP、VR体渲染。自带RIS全流程管理。100%无加密源码交付,是医疗软件公司打造云PACS、区域影像中心的核心利器! 一、 为什么医疗企业都在寻找真正的WebPACS? 传统的PACS系统多采用C++或C#开发,需要医生在电脑上一台台安装庞大的客户端,维护成本极高,且无法适应如今“互联网医院”和“医共体远程诊断”的需求。 * 极速跨平台: 本系统基于HTML5+WebGL技术,医生只需打开浏览器,即可实现秒级加载百兆级影像,支持Windows、Mac甚至iPad移动阅片。 * 省去百万研发费: 医疗影像的底层解析(如窗宽窗位调节、各种DICOM Tag解析、图像无损压缩算法)是深水区,直接购买本源码,省去2-3年以上的底层图形学研发周期。 * 高价值变现: 本源码不仅可独立作为医院影像科管理系统出售,更可作为“影像插件”

By Ne0inhk