iOS Swift调用canOpenURL访问message://协议报错无法打开邮件应用
报错原因
- iOS 9及以上系统新增了URL Scheme查询的安全限制,所有需要通过
canOpenURL:方法检测的自定义Scheme,必须提前在项目Info.plist的查询白名单中登记,未登记的Scheme调用查询接口就会触发该报错。 - 你用到的
message://是iOS系统邮件应用的专属URL Scheme,未加入白名单时直接执行检测逻辑,所以收到了不允许查询的错误提示。 - 额外说明:iOS模拟器默认没有预装系统邮件应用,就算完成了白名单配置,模拟器上也无法正常调起该功能,需要使用真机测试。
解决方案
步骤1:配置URL Scheme白名单
打开项目的Info.plist文件,两种配置方式二选一即可:
- 可视化编辑:添加类型为数组的
Queries URL Schemes(对应原始键为LSApplicationQueriesSchemes),在数组中新增一个值为message的item。 - 源码编辑:右键点击
Info.plist选择Open As -> Source Code,粘贴以下代码:
<key>LSApplicationQueriesSchemes</key> <array> <string>message</string> </array>
步骤2:优化调用逻辑(可选)
如果你不需要提前检测邮件应用是否存在,可以直接调用open方法,系统找不到对应应用时会自动返回失败不会崩溃,代码可以调整为:
func sendEmail() { // Converted to Swift 5.4 by Swiftify v5.4.24488 guard let mailURL = URL(string: "message://") else { return } UIApplication.shared.open(mailURL, options: [:]) { openSuccess in if !openSuccess { // 可在这里添加兜底逻辑,比如提示用户未安装邮件应用 print("无法打开邮件应用") } } }
内容的提问来源于stack exchange,提问作者George Sepetadelis
相关产品推荐
相关产品推荐

