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

DBeaver社区版AI助手(AI Assistant)设置

最近更新DBeaver社区版的时候,发现引入了AI助手,感觉非常棒,体验了一把,将过程分享给大家。 确保你使用的是最新版本的DBeaver社区版本(本文版本25.2.0),否者可能并不支持。 AI助手配置 详细配置常考官方文档:https://dbeaver.com/docs/dbeaver/AI-Assistance-settings/ DBeaver AI助手支持以下模型提供者(providers): * OpenAI * GitHub Copilot * Azure OpenAI * Gemini * Ollama DBeaver AI助手通过调用API来调用模型能力的,只要是OpenAI 兼容的API格式都可以集成到AI助手中。 以llama.cpp + gemma-3 (在WSL2运行)为例,llama-server提供OpenAI 风格的API,先执行它: [root@DELL-P7750 models]# llama-server --model ./gemma-3-4B-it-Q8_0.gguf --host 0.

【2026最新Python+AI入门指南】:从零基础到实操落地,避开90%新手坑

【2026最新Python+AI入门指南】:从零基础到实操落地,避开90%新手坑

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 【前言】 2026年AI技术持续爆发,大模型应用普及、边缘AI轻量化,Python作为AI开发的“第一语言”,成为零基础入门者的最优选择。作为深耕AI领域3年的开发者,我深知“选对方向+找对方法”比盲目跟风更重要。 不同于千篇一律的入门教程,本篇博客结合2026年AI热门趋势,拆解Python+AI零基础入门完整路径,包含热门实操案例、极简代码、避坑指南,附带流程图、表格,全程贴合新手节奏,帮你少走弯路、快速上手。 适合人群:零基础编程小白、转行AI职场人、非计算机专业大学生;核心收获:掌握Python必备语法、了解AI热门方向、实现2个AI入门案例、获取全套学习工具资料。 文章目录: * 一、先搞懂:为什么2026年入门AI,必须先学Python? * 1. 生态碾压:AI开发“

做了一个 AI 鸿蒙 App,我发现逻辑变了

做了一个 AI 鸿蒙 App,我发现逻辑变了

子玥酱(掘金 / 知乎 / ZEEKLOG / 简书 同名) 大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。 我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案, 在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。 技术方向:前端 / 跨端 / 小程序 / 移动端工程化 内容平台:掘金、知乎、ZEEKLOG、简书 创作特点:实战导向、源码拆解、少空谈多落地 文章状态:长期稳定更新,大量原创输出 我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、

AI在医疗领域的十大应用场景:变革医疗健康未来与AI产品经理的新机遇

AI在医疗领域的十大应用场景:变革医疗健康未来与AI产品经理的新机遇

AI在医疗领域的十大应用场景:变革医疗健康未来与AI产品经理的新机遇 写在前面 在科技飞速发展的今天,人工智能(AI)已逐渐渗透到各个行业,医疗领域更是成为其大展身手的舞台。从疾病诊断到治疗方案制定,从药物研发到患者护理,AI正在深刻改变着医疗健康的面貌。对于产品经理而言,这一变革不仅意味着技术层面的升级,更是一次职业发展的重大机遇。 引言 传统产品经理的角色正逐渐向AI产品经理转型,这一转变不仅要求掌握新的技术工具,更需要对医疗行业的深刻理解和敏锐洞察。本文将深入探讨AI在医疗领域的十大应用场景,并阐述为何转型为AI产品经理是明智之选。 **本文将详细介绍AI在医疗领域的10大应用场景,并探讨AI产品经理在这一变革中的角色和价值。 为什么转型为AI产品经理? 1. 行业趋势所迫 随着AI技术的不断成熟,越来越多的医疗企业开始将AI应用于产品和服务中。传统产品经理若不及时转型,将面临被市场淘汰的风险。 2. 职业发展空间广阔 AI产品经理不仅需要具备产品管理的基本技能,还需掌握AI技术、数据分析、医疗知识等多方面的能力。这种复合型人才在市场上极为稀缺,因此拥有