概述
常见的涉及到应用程序之间的跳转场景,比如社交分享、支付宝、微信支付、链接跳转到应用。在iOS中应用跳转的本质:打开一个应用只需要拿到对应应用的URL即可。
统一资源定位符
URL(统一资源定位符)的组成:协议头(scheme)+资源路径。
协议头:决定查找资源的的方式 比如 http:// 、https:// 、 file://
资源路径:path 路径注意:一个有效的URL必须协议头,可以没有资源路径。也就是说我们只要知道一个应用的协议头就可以跳转到该应用。
默认一个iOS应用是没有URL的需要我们进行配置。
iOS实现应用程序跳转
第一步需要给被跳转应用配置URL。其它的应用才能通过该URL跳转到该应用。在TARGETS->Info->URL Types配置URL,可以只配置协议头。
如果别的应用跳转到该应用可以通过UIApplication的openURL:方法进行跳转
UIApplication *application = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"wechat://"];
if ([application canOpenURL:url]) {
[application openURL:url];
}else{
NSLog(@"不能打开微信应用");
}
同时我们也可以通过点击链接的方式打开该应用,比如在Safari浏览器输入wechat://也可以跳转。
通过上面的配置加代码实现跳转还是不够的,在跳转时控制台会输出
原因:iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。
例如:如果是应用A应用想跳转到B应用,需要在A应用的“Info.plist”将B应用的URL Schemes列为白名单。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
</array>
这样就可以实现应用程序之间的跳转了。
iOS实现应用程序跳转指定页面
我们在App分享场景,可以分享到微信好友与微信朋友圈。这个就需要设计跳转应用指定的页面。这里需要用到UIApplication的代理方法。
目前已经有三代理方法,当应用是被其它应用共通过openURL方法打开回来到回调方法,前两个已经过期。
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
根据URL资源路径携带参数做判断
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
NSString *urlString = url.absoluteString;
NSLog(@"urlStr=%@", urlString);
UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;
// 1.首先让导航控制器pop所有栈中的控制器 解决多次跳转出现上次push的页面没有pop 再一次push出现需要多次返回问题
[rootNav popToRootViewControllerAnimated:NO];
UIViewController *rootVC = [rootNav childViewControllers].firstObject;
if ([urlString containsString:@"timeline"]) {
[rootVC performSegueWithIdentifier:@"HomeToTimeline" sender:nil];
NSLog(@"跳转到朋友圈");
}else if ([urlString containsString:@"session"]){
[rootVC performSegueWithIdentifier:@"HomeToSession" sender:nil];
NSLog(@"跳转到微信好友");
}
return YES;
}