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


    概述

    常见的涉及到应用程序之间的跳转场景,比如社交分享、支付宝、微信支付、链接跳转到应用。
    在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;
    }
    
  • 相关阅读:
    ROM定制开发教程-Android adb命令用法与实例解析
    Android内存优化—dumpsys meminfo详解
    adb命令查看手机应用内存使用情况
    【特征检测】BRISK特征提取算法
    焦虑症
    基于Lua的游戏服务端框架简介
    流量
    学习React Native必看的几个开源项目
    那些离开私企进入国企的人,现在都过得怎么样了?
    分布式系统中有关一致性的理解
  • 原文地址:https://www.cnblogs.com/CoderHong/p/9062275.html
Copyright © 2020-2023  润新知