iOS中的URL Scheme

本文详细介绍如何在iOS应用中设置和使用URL Scheme,包括配置步骤、参数传递方式及处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在iOS的SDK中提供了一个非常有意思的功能,它能将iOS的Application同自定义的URL Schema绑定,同时可以通过URL Scheme在浏览器或者是其他应用中启动这个Application。本文主要介绍如何通过URL Scheme的方式启动应用和参数的传递。

##创建URL Scheme

1、首先在*-Info.plist中添加一行,选择URL types,效果如下图所示:

ios_url_scheme_001.png

2、在展开的Item 0中填写URL identifier,这个用来唯一标识用户自定义的URL Scheme,推荐使用域名的反转形式,如:com.devzeng.demo

ios_url_scheme_002.png

3、在Item 0中添加新的一行,选择URL Schemes

ios_url_scheme_003.png

4、展开URL Schemes,在Item 0中输入自定义的Scheme的名称。在这里只需要输入自定义的Scheme的名称即可,不需要加上://,例如这里输入的是devzeng,那么对应的自定义的URL就是devzeng://,这里可以输入多个。

ios_url_scheme_004.png

5、最后一个完整的示例效果图:

ios_url_scheme_005.png

对应的源码配置文件为:

<key>CFBundleURLTypes</key>
	<array>
		<dict>
			<key>CFBundleURLName</key>
			<string>com.devzeng.demo.urlschema</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>devzeng</string>
			</array>
		</dict>
	</array>

##使用URL Scheme

1、在Safari中使用

在Safari中直接在浏览器的地址栏中输入devzeng://,即可启动刚才的应用

2、在其他的应用程序中使用

在需要调用的地方使用下面的代码即可实现调用

NSString *customURL = @"devzeng://";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];

3、参数的传递

- (void)openOtherApp
{
    NSString *customURL = @"devzeng://?token=123abct&registered=1";
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
}

在AppDelegate中可以实现下面的两个方法

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

说明:

(1)上面的两个函数作用是一致的只是参数不同而已,函数的返回值是BOOL,如果为YES表示可以打开,NO表示不可以打开应用程序

(2)参数可以通过[url query]来获取,比如使用的是devzeng://?token=123abct&registered=1那么通过[url query]获取到的值是token=123abct&registered=1,然后可以通过这些数据再作相应的处理.

(3)调用的应用程序的Bundle ID可以通过sourceApplication参数获取

(4)通过[url scheme]可以获取到请求的URL Scheme,比如是通过devzeng://打开的那么[url scheme]的值就是devzeng。可以通过不同的参数来判断来源的合法性

(5)示例

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([sourceApplication isEqualToString:@"com.devzeng.demo.urlscheme"])
    {
        NSLog(@"调用的应用程序的Bundle ID是: %@", sourceApplication);
        NSLog(@"URL scheme:%@", [url scheme]);
        NSLog(@"URL query: %@", [url query]);
        return YES;
    }
    else
    {
        return NO;
    }
}
##参考资料
1、《The Complete Tutorial on iOS/iPhone Custom URL Schemes》

<think>嗯,用户这次的问题很明确,就是想了解iOSURLScheme的具体实现和使用方法。从用户引用的内容来看,ta已经接触过一些跳转代码片段和网络监测的示例,但对整套机制还缺乏系统认识。用户可能正在开发一个需要跨应用调用的iOS应用,比如从自己的App跳转到设置页面,或者想实现第三方登录功能。ta的引用代码里出现了"xiaoshe://"这种自定义scheme和"prefs:"这种系统级scheme,说明需求可能涉及两种场景。专业层面需要拆解几个关键点:首先是URLScheme的定义规范,iOS要求所有自定义scheme必须在Info.plist声明;其次是安全校验,必须用canOpenURL做存在性检查;最后还要处理白名单问题,特别是LSApplicationQueriesSchemes这个容易被忽视的配置项。考虑到用户引用过AFNetworkReachabilityManager的代码,ta应该熟悉基础开发,所以可以在回答里适当提及UIApplication的生命周期相关方法。但不用深入网络监测部分,虽然引用[2]里有相关代码,但当前问题和网络状态无关。要特别注意用户上次指令要求的格式规范,数学公式在这里用不上,但代码块必须用```包裹。引用标记也要严格对应,比如提到Foundation框架时就关联引用[3]的内容。最后规划回答结构:从概念解释开始,分步骤说明实现流程,然后给出调用示例和异常处理。特别要强调iOS9之后的安全限制,很多开发者在这里踩坑。对于高级用法,可以提但不需要展开universallinks,避免偏离核心问题。</think> 以下是iOSURL Scheme的完整实现流程和使用方法详解: --- ### 一、URL Scheme工作原理 URL SchemeiOS应用间通信的核心机制,通过自定义协议(如`myapp://`)实现应用跳转和数据传递。其工作流程如下: 1. 应用A构造特定格式的URL发起请求 2. 系统检测目标应用是否注册该Scheme 3. 若目标应用已注册,则唤起应用并传递URL参数 4. 被唤起应用解析URL执行对应操作 [^1] --- ### 二、实现步骤(以跳转设置页为例) #### 1. 注册自定义Scheme(在Info.plist中添加) ```xml <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>myapp</string> <!-- 自定义协议头 --> </array> <key>CFBundleURLName</key> <string>com.yourcompany.appname</string> </dict> </array> ``` #### 2. 实现URL解析(AppDelegate中) ```objective-c // Swift示例 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true), let queryItems = components.queryItems else { return false } // 解析URL参数示例:myapp://profile?userid=123 if components.host == "profile" { if let userIdItem = queryItems.first(where: { $0.name == "userid" }), let userId = userIdItem.value { navigateToProfile(userId: userId) return true } } return false } ``` #### 3. 发起应用跳转 ```objective-c // Objective-C示例 - (void)openSettingsPage { // 系统预定义Scheme(需配置LSApplicationQueriesSchemes) NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=About"]; if ([[UIApplication sharedApplication] canOpenURL:url]) { if (@available(iOS 10.0, *)) { [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; } else { [[UIApplication sharedApplication] openURL:url]; } } else { NSLog(@"无法打开设置页"); } } ``` ⚠️ **关键安全限制**: iOS 9+ 需在Info.plist中添加白名单: ```xml <key>LSApplicationQueriesSchemes</key> <array> <string>prefs</string> <!-- 需跳转的Scheme --> <string>wechat</string> <string>alipay</string> </array> ``` [^1][^2] --- ### 三、典型应用场景 1. **应用间功能调用** - 微信支付:`weixin://dl/businessPay` - 支付宝跳转:`alipay://platformapi/startapp?appId=20000067` 2. **深度链接(Deep Linking)** ```swift // 商品页跳转示例:myapp://product/detail?id=10086 guard let url = URL(string: "myapp://product/detail?id=10086") else { return } UIApplication.shared.open(url) ``` 3. **系统功能调用** ```objective-c // 拨打电话 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:13800138000"]]; // 发送短信 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:10086"]]; ``` --- ### 四、注意事项 1. **URL编码规范** 特殊字符需编码处理:空格→`%20`、中文→UTF-8编码 ```swift let param = "上海".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! let urlStr = "myapp://search?city=\(param)" ``` 2. **防劫持检测** 跳转前必须验证目标应用存在性: ```objective-c if (![[UIApplication sharedApplication] canOpenURL:url]) { // 备用方案:跳转App Store或网页版 } ``` 3. **后台唤起处理** 通过`application:didFinishLaunchingWithOptions:`检测冷启动场景: ```swift func application(_ application: UIApplication, didFinishLaunchingWithOptions opts: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { if let url = opts?[.url] as? URL { handleDeepLink(url) } } ``` --- ### 五、扩展技术 | 技术 | 优势 | 适用场景 | |------|------|----------| | Universal Links | iOS原生支持,无需确认弹窗 | 网页到应用的无缝跳转 | | App Clips | 轻量化体验,无需安装 | 临时性功能使用 | | SiriKit Intents | 语音交互集成 | 语音控制场景 | ⚠️ 更多框架级实现可参考[Apple Foundation框架文档](https://developer.apple.com/documentation/foundation) [^3] --- **相关问题** 1. 如何防御恶意的URL Scheme劫持攻击? 2. Universal Links与URL Scheme的核心区别是什么? 3. iOS 14+的`LSAuditToken`如何影响跨进程通信安全? 4. 处理`canOpenURL`返回`false`的应急方案有哪些?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值