iOS开发系列-应用程序之间跳转

概述

常见的涉及到应用程序之间的跳转场景

  • 社交分享
  • 支付宝、微信支付
  • 链接跳转到应用

在iOS中应用跳转的本质:打开一个应用只需要拿到对应应用的URL即可。

什么是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://也可以跳转。

扫描二维码关注公众号,回复: 944276 查看本文章

通过上面的配置加代码实现跳转还是不够的,在跳转时控制台会输出

原因: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;
}

猜你喜欢

转载自www.cnblogs.com/CoderHong/p/9062275.html