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

【混元AIGC+腾讯云智能体+首创Coze核心流思维导图MCP】:打造一个文思通-智能写作助手Agent

【混元AIGC+腾讯云智能体+首创Coze核心流思维导图MCP】:打造一个文思通-智能写作助手Agent

【混元AIGC+腾讯云智能体+首创Coze核心流思维导图MCP】:打造一个文思通-智能写作助手Agent 1.背景 作为一名长期关注人工智能发展的内容创作者,我经常需要撰写关于AI技术、应用趋势和产品体验的文章。然而,在实际写作过程中,常常会遇到灵感枯竭、结构混乱、表达不够精准等问题。有时候写到一半才发现逻辑断层,或者内容重复,甚至忘记了一些关键知识点。 为了解决这些痛点,我决定打造一个专属于自己的智能写作助手,取名为“文思通”——寓意“文思如泉涌,条理通达”。这个助手不仅要能帮我生成内容,更要具备结构化思维引导、逻辑梳理和语言润色的能力。 最近,我接触到一种创新的工具组合:以 Coze 平台为核心逻辑流,结合自研的思维导图 MCP 服务,可以实现从文本到可视化思维导图的自动转换。这正好解决了我在构思阶段缺乏条理的问题。而选择开发平台时,我注意到腾讯云智能体开发平台与腾讯混元大模型(Hunyuan AIGC) 的深度整合能力非常出色,支持工作流编排、插件扩展(MCP),并且提供稳定高效的推理服务。 最终,我决定采用“混元AIGC + 腾讯云智能体平台

基于FPGA的简易数据采集系统

基于FPGA的简易数据采集系统

一、实验目的         本实验基于Intel Alter CycloneⅣ EP4CE6F17C8N开发板与Verilog HDL语言设计简易数据采集系统。该系统需要实现DDS正常产生波形,通过DAC与ADC转换后的波形数据一致。为实现该目的,需进行的操作细则如下:         1.查阅资料,理解并掌握dds运行原理。         2.阅读ADC和DAC芯片手册理解芯片工作原理及时序要求。         3.进行模块化程序设计,独立进行各个模块的代码设计和仿真调试,完成各个模块设计之后,再进行模块互联,最后测试模块互联后的顶层程序功能是否与预期设计一致。         4.板级测试,将通过仿真调试的程序烧录到开发板上,用Singal Tap联合调试,抓取输入与输回的波形数据,观察二者是否一致。 二、实验原理         本次实验原理将分为理论原理、硬件原理两部分进行阐述。 2.1 理论原理 2.1.1 DDS基本原理         DDS(Direct Digital Synthesis)是一种用于产生可控制频率的数字信号的技术,由于其易于

服务器环境 VsCode:Github Copilot 安装完成却用不了?关键步骤补全

GitHub Copilot在VS Code中无法使用的关键解决步骤 1. 基础环境检查 * VS Code版本:确保使用最新版(至少≥1.60),旧版可能导致兼容问题 * Copilot状态:在VS Code左侧活动栏点击Copilot图标(飞机形状),检查是否显示已登录和启用状态 * 网络环境:Copilot需访问GitHub服务器,尝试关闭代理或检查防火墙是否屏蔽api.github.com 2. 核心配置步骤 # 步骤1:检查Copilot是否激活 # 在VS Code命令面板(Ctrl+Shift+P)输入: > GitHub Copilot: Check Status # 步骤2:重置授权令牌(常见问题根源) > GitHub Copilot: Reset GitHub Copilot Token # 步骤3:强制刷新扩展 >

数据中台建设中的数据血缘可视化:Neo4j应用

数据中台建设中的数据血缘可视化:Neo4j应用 关键词:数据中台、数据血缘、可视化、图数据库、Neo4j、数据治理、元数据管理 摘要:数据中台建设中,数据血缘分析是实现数据治理、影响分析和链路优化的核心能力。本文系统阐述基于Neo4j图数据库构建数据血缘可视化平台的技术体系,从数据血缘的核心概念与数学模型出发,详细讲解元数据采集、图模型构建、可视化渲染的全流程实现,结合真实项目案例演示如何通过Neo4j的图遍历算法和Cypher查询语言解决数据血缘分析中的复杂依赖问题。通过理论与实践结合,揭示图数据库在数据血缘场景中的独特优势,为企业数据中台建设提供可落地的技术方案。 1. 背景介绍 1.1 目的和范围 在企业数据中台建设中,数据资产规模呈指数级增长,数据来源涵盖业务系统、日志平台、第三方接口等多类数据源,数据加工流程涉及ETL作业、数据建模、指标计算等复杂处理逻辑。数据血缘分析旨在回答"数据从哪里来,到哪里去"的核心问题,通过可视化手段呈现数据实体(表、字段、任务等)之间的依赖关系,为数据质量监控、故障定位、合规审计提供关键支撑。