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

Flutter 三方库 mcp_server 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、基于 Model Context Protocol 的工业级 AI 插件服务端与上下文通信引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 mcp_server 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、基于 Model Context Protocol 的工业级 AI 插件服务端与上下文通信引擎 在鸿蒙(OpenHarmony)系统的端云一体化应用、人工智能辅助系统、或者是需要让大模型(LLM)由于由于能够直接物理感知并由于控制鸿蒙本地硬件、资源与工具的场景中,如何实现毫秒级的由于由于由于由跨协议通信?mcp_server 为开发者提供了一套工业级的、针对 Model Context Protocol 进行深度封装的服务端方案。本文将深入实战其在鸿蒙 AI 插件逻辑层中的应用。 前言 什么是 MCP?它是一个将“AI 模型上下文(Context)”与“由于由于由本地由于工具执行(Tools

技术拆解:P2P组网如何一键远程AI

技术拆解:P2P组网如何一键远程AI

文章目录 * **远程访问AI服务的核心是什么?** * **从暴露服务到连接设备** * **核心组件与交互解析** * **安全架构深度剖析** * **一键安装脚本的技术实现** * **# Windows** * **#macOS** * **#Linux** * **与AI工作流的结合实践** 远程访问AI服务的核心是什么? 你自己在电脑或者服务器上装了AI服务,比如大语言模型、Stable Diffusion这些,但是有个头疼的事儿:外面的人或者你在别的地方,怎么既安全又方便地连上这些本地的服务?以前的办法要么得有公网IP,还得敲一堆命令行用SSH隧道,要么就是直接开端口映射,等于把服务直接晾在公网上,太不安全了。 今天咱们就好好说说一种靠P2P虚拟组网的办法,还拿个叫节点小宝的工具举例子,看看它怎么做到不用改啥东西,点一下就装好,还能建个加密的通道,实现那种“服务藏得好好的,想连就能直接连上”的安全远程访问方式。 从暴露服务到连接设备 核心思路转变在于:不再尝试将内网服务端口暴露到公网(一个危险的攻击面),而是将外部访问设

从零开始:在腾讯云服务器上部署 OpenClaw AI 助手(2)—— 浏览器自动化功能配置

从零开始:在腾讯云服务器上部署 OpenClaw AI 助手(2)—— 浏览器自动化功能配置 让 AI 助手拥有"眼睛"和"双手",实现网页自动化操控 前言 在上一篇博客中,我们成功在腾讯云服务器上部署了 OpenClaw AI 助手,实现了基本的对话功能。但那时的 AI 就像一个"只会说话的大脑"——能理解你的问题,却无法真正操作电脑。 这篇博客将记录如何为 OpenClaw 配置浏览器自动化功能,让 AI 助手真正拥有"眼睛"(看网页)和"双手"(操作网页),变成一个能够自动打开网页、填写表单、

在国内环境部署 OpenClaw:从零到跑通的个人 AI 助手搭建指南

在国内环境部署 OpenClaw:从零到跑通的个人 AI 助手搭建指南 OpenClaw 是一个开源的个人 AI 助手框架,可以连接 WhatsApp、Telegram、Slack、Discord、飞书等 20+ 消息渠道。本文记录了在国内网络环境下部署 OpenClaw 的完整流程,包括网络适配、模型配置、渠道接入等实战经验。 什么是 OpenClaw? OpenClaw 是一个 local-first 的个人 AI 助手平台。它的核心是一个 Gateway 服务,运行在你自己的设备上,通过 WebSocket 管理会话、消息路由和工具调用。 核心特性: * 🏠 本地运行,数据不经过第三方 * 📱 支持 20+ 消息渠道(飞书、Telegram、Discord、Slack、微信等)