Swift中通过URL Scheme打开iPhone已安装第三方应用实现问询
相关参考截图

现有实现存在的问题
- 缺少Info.plist权限配置:iOS 9及以上系统要求,调用
canOpenURL(_:)查询其他App的URL Scheme前,必须将目标Scheme添加到项目Info.plist的LSApplicationQueriesSchemes数组中,否则系统会默认返回false,无法正确判断应用是否安装。 - 缺少异常场景处理:现有代码仅在判定可打开时执行打开逻辑,没有对「应用未安装」「打开失败」等异常场景做用户反馈,用户操作后无响应会产生困惑。
- 缺少打开结果回调:
open(_:options:completionHandler:)方法自带完成回调,可以获取打开操作的最终结果,现有代码没有使用该回调做后续逻辑处理。
正确实现逻辑
- 首先修改项目Info.plist,添加Scheme查询权限,右键Info.plist选择「Open As - Source Code」,添加如下代码:
<key>LSApplicationQueriesSchemes</key> <array> <string>avaya</string> </array>
如果是可视化编辑Info.plist,新增Key为LSApplicationQueriesSchemes的Array类型项,在数组下新增String类型的元素,值填avaya即可。
- 优化功能实现代码:
@IBAction func openApp(_ sender: Any) { // 校验URL合法性 guard let targetURL = URL(string: "avaya://") else { let alert = UIAlertController(title: "提示", message: "跳转链接无效", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "知道了", style: .default)) present(alert, animated: true) return } // 校验是否可打开 if UIApplication.shared.canOpenURL(targetURL) { UIApplication.shared.open(targetURL, options: [:]) { openSuccess in // 处理打开失败场景 if !openSuccess { let alert = UIAlertController(title: "提示", message: "打开应用失败,请稍后重试", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "知道了", style: .default)) self.present(alert, animated: true) } } } else { // 处理应用未安装场景,可根据需求替换为跳对应App的App Store下载页 let alert = UIAlertController(title: "提示", message: "未检测到目标应用,请先前往App Store下载安装后重试", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "知道了", style: .default)) present(alert, animated: true) } }
内容的提问来源于stack exchange,提问作者Ab.sh
相关产品推荐
相关产品推荐

