Swift中如何实现打开用户可管理的动态URL Scheme?
实现用户可管理并打开URL Scheme的方案
你混淆了两个核心概念:在info.plist中注册URL Scheme是为了让其他应用能唤起你的App,而你的App要打开其他应用的URL Scheme,根本不需要在自己的info.plist里添加任何注册项。这就是那些同类App能实现动态管理功能的关键原因。
具体实现步骤
本地存储用户自定义的URL Scheme
用UserDefaults、Core Data或者本地plist文件来保存用户添加的Scheme列表,实现增删改查逻辑:- 添加:接收用户输入的Scheme字符串(比如
weixin://),验证格式合法后存入本地 - 更新:定位到目标Scheme条目,替换为新的字符串
- 删除:从存储列表中移除指定的Scheme
示例代码(iOS,基于UserDefaults存储数组):
// 添加Scheme func addScheme(_ scheme: String) { var schemes = UserDefaults.standard.array(forKey: "CustomURLSchemes") as? [String] ?? [] if !schemes.contains(scheme) { schemes.append(scheme) UserDefaults.standard.set(schemes, forKey: "CustomURLSchemes") } } // 删除Scheme func removeScheme(_ scheme: String) { var schemes = UserDefaults.standard.array(forKey: "CustomURLSchemes") as? [String] ?? [] schemes.removeAll { $0 == scheme } UserDefaults.standard.set(schemes, forKey: "CustomURLSchemes") }- 添加:接收用户输入的Scheme字符串(比如
打开指定的URL Scheme
直接调用系统API尝试打开对应的URL即可,无需提前注册。同时要处理打开失败的场景(比如对应应用未安装):
示例代码(iOS):func openScheme(_ scheme: String) { guard let url = URL(string: scheme) else { // 提示用户Scheme格式无效 return } UIApplication.shared.open(url, options: [:], completionHandler: { success in if !success { // 提示用户无法打开该Scheme,可能对应应用未安装 } }) }注意:iOS 9及以后,若要使用
canOpenURL做预检查,需要在info.plist中添加LSApplicationQueriesSchemes数组并列出常用Scheme,但用户自定义的Scheme无法动态添加到该数组,因此可以跳过预检查,直接调用open并通过completionHandler判断结果。用户界面实现
做一个列表展示用户存储的所有Scheme,每个条目提供编辑、删除按钮,添加按钮用于输入新的Scheme,点击条目直接触发打开操作。
关键补充说明
- 你完全不需要在自己App的info.plist中注册用户自定义的Scheme,因为那是给其他应用唤起你的App用的,和你唤起其他App的逻辑无关。
- 动态管理的核心就是将用户的Scheme保存在本地,使用时直接构造URL调用系统打开方法即可。
内容的提问来源于stack exchange,提问作者LSH
相关产品推荐
相关产品推荐

