如何在运行时获取iOS应用的URL Scheme
从iOS应用Bundle中获取自定义URL Scheme的实现方法
要遵循DRY原则避免硬编码URL Scheme字符串,直接从应用Bundle的配置中解析是最优解——毕竟自定义URL Scheme本身就配置在Info.plist的CFBundleURLTypes字段里,我们只需要读取这个配置即可。
实现步骤
给
Bundle添加扩展,封装解析逻辑
直接通过Bundle的infoDictionary读取CFBundleURLTypes结构,提取出URL Scheme:extension Bundle { var customURLScheme: String? { // 从Info.plist中读取URL类型配置 guard let urlTypes = infoDictionary?["CFBundleURLTypes"] as? [[String: Any]], // 取第一个URL类型配置(如果有多个可根据需求筛选) let targetURLType = urlTypes.first, // 读取该类型下的所有URL Scheme let urlSchemes = targetURLType["CFBundleURLSchemes"] as? [String], // 取第一个Scheme(多Scheme场景可自定义筛选规则) let mainScheme = urlSchemes.first else { return nil } return mainScheme } }在代码中直接调用
后续需要使用URL Scheme时,直接通过Bundle.main获取即可,无需硬编码:if let scheme = Bundle.main.customURLScheme { let deepLinkURL = URL(string: "\(scheme)://profile/user123") // 处理跳转逻辑,比如打开应用内页面或调用其他App }
额外说明
- 如果你的应用配置了多个URL Scheme,或者需要指定某个特定的Scheme,可以在解析时通过
CFBundleURLName(URL类型的标识)来筛选,比如:// 修改扩展中的逻辑,根据URLName筛选 let targetURLType = urlTypes.first { type in type["CFBundleURLName"] as? String == "com.yourapp.mainScheme" } - 确保
Info.plist中确实配置了CFBundleURLTypes,否则方法会返回nil,建议在使用时做非空判断。
内容的提问来源于stack exchange,提问作者Chris Marshall
相关产品推荐
相关产品推荐

