URL Schemes 实现APP之间的跳转

简述

通过对比网页链接来理解iOS上的URL Schemes,应该就容易多了
URL Schemes 有两个单词:

  • URL:我们都很清楚,http://www.apple.com 就是个URL,我们也叫他链接或网址
  • Schemes:表示的是一个URL中的一个位置——最初始的位置,即://之前的那段字符。比如http://www.apple.com 这个网址的Schemes是http。
    根据我们上面对URL Schemes的使用,我们可以很轻易地理解,在以本地应用为主的iOS上,我们可以像定位一个网页一样,用一种特殊的URL来定位一个应用甚至应用里某个具体的功能。而定位这个应用的,就应该这个应用的URL的Schemes部分,也就是开头儿那部分。比如短信,就是 sms:
    你可以完全按照理解一个网页的 URL ——也就是它的网址——的方式来理解一个 iOS 应用的 URL,拿苹果的网站和 iOS 上的微信来做个简单对比:
    通过对比网页链接来理解 iOS 上的 URL Schemes,应该就容易多了。
网页(苹果) iOS 应用(微信)
网站首页/打开应用 http://www.apple.com weixin://
子页面/具体功能 http://www.apple.com/mac/(Mac页面) weixin://dl/moments(朋友圈)

实例:

  • 首先创建A,B两个app,通过A的点击事件跳转到B
    项目中URL Schemes配置(被跳转端B)


    URL Schemes配置
  • 说明:
    1. URL Type:表示可以被这些带前缀URL打开,而不是可以打开这些带前缀URL的app。
    2. identifier:表示一个标识符,自己随便写(我通常写公司的反转域名)
    3. URL Schemes:用来定位一个应用

prefs:实现跳转至苹果内置程序的url scheme,不可改变
appA:标识该应用程序的url scheme,尽量保持它的唯一性,可以被appA打开

或者直接在info.plist中设置Information Property List:


info设置
  • 说明:
    URL Schemes:是一个数组,可以定义多个应用的URL Schemes
  1. 在应用A的跳转按钮中设置跳转代码:
    - (void)jumpB:(id)sender
    {
    //无参数
    NSURL *url1 = [NSURL URLWithString:@"appB:"];
    [UIApplication shareApplication] openURL:url1];
    //有参数
    NSString *paramStr =[NSString stringWithFormat:@"appB://username=%@&password=%@", @"小刘", @"123"];
    NSURL *url2 = [NSURL URLWithString:[paramStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    [UIApplication shareApplication] openURL:url2];
    }
    点击之后就可以实现跳转应用B
  2. 在打开应用B的过程中,此时应用B有两种状态:
    • 第一个状态: 应用B还没有启动,打开过程中就会去启动,触发下面的方法
      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
      NSLog(@"didFinishLaunchingWithOptions---B");
      return YES;
      }
    • 第二个状态: 应用B已经启动了,但是在后台运行或者挂起,这个时候不会调用该方法。
  3. 如果一个应用被另外一个应用打开, 在代理方法- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation中判断唤起的来源source app,根据Url所携带的参数进行不同的操作。比如跳转到制定的页面,相关的逻辑处理等等.
    //当一个应用程序被其他程序打开的时候会调用这个方法,在该方法中可以实现两个应用程序间的数据局传递
    //当一个应用程序被其他程序打开的时候会调用这个方法,在该方法中可以实现两个应用程序间的数据局传递
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
    NSString *urlStr = [url absoluteString];
    if ([urlStr hasPrefix:@"appB://"]) {
    NSLog(@"appA request params: %@", urlStr);
    urlStr = [urlStr stringByReplacingOccurrencesOfString:@"appB://" withString:@""];
    NSArray *paramArray = [urlStr componentsSeparatedByString:@"&"];
    NSLog(@"paramArray: %@", paramArray);
    NSMutableDictionary *paramsDic = [[NSMutableDictionary alloc] initWithCapacity:0];
    for (int i = 0; i < paramArray.count; i++) {
    NSString *str = paramArray[i];
    NSArray *keyArray = [str componentsSeparatedByString:@"="];
    NSString *key = keyArray[0];
    NSString *value = keyArray[1];
    [paramsDic setObject:value forKey:key];
    NSLog(@"key:%@ ==== value:%@", key, value);
    }
    }
    return NO;
    }

注意:在iOS9之后,还需要在info.plist中添加LSApplicationQueriesSchemes设置为Array,以此来提高app的安全性,需要设置URL Schemes白名单,在白名单里面的才能打开app

白名单

附:

  • 常见的调用系统应用url
    // 关于本机
    About — prefs:root=General&path=About
    // 辅助功能
    Accessibility — prefs:root=General&path=ACCESSIBILITY
    // 飞行模式
    Airplane Mode On — prefs:root=AIRPLANE_MODE
    // 自动锁屏
    Auto-Lock — prefs:root=General&path=AUTOLOCKB
    // 调节设备背景亮度
    rightness — prefs:root=Brightness
    // 蓝牙
    Bluetooth — prefs:root=General&path=Bluetooth
    // 时间与日期
    Date & Time — prefs:root=General&path=DATE_AND_TIME
    // FaceTime
    FaceTime — prefs:root=FACETIME
    // 通用
    General — prefs:root=General
    // 键盘
    Keyboard — prefs:root=General&path=Keyboard
    // iCloud
    iCloud — prefs:root=CASTLE
    // iCloud存储空间
    iCloud Storage & Backup — prefs:root=CASTLE&path=STORAGE_AND_BACKUP
    // 语言与区域
    International — prefs:root=General&path=INTERNATIONAL
    // 定位服务
    Location Services — prefs:root=LOCATION_SERVICES
    // 音乐
    Music — prefs:root=MUSICMusic
    Equalizer — prefs:root=MUSIC&path=EQ
    Music Volume Limit — prefs:root=MUSIC&path=VolumeLimit
    // 网络
    Network — prefs:root=General&path=Network
    Nike + iPod — prefs:root=NIKE_PLUS_IPOD
    // 备忘录
    Notes — prefs:root=NOTES
    // 通知
    Notification — prefs:root=NOTIFICATIONS_ID
    // 电话
    Phone — prefs:root=Phone
    // 照片
    Photos — prefs:root=Photos
    // 描述文件
    Profile — prefs:root=General&path=ManagedConfigurationList
    // 还原
    Reset — prefs:root=General&path=Reset
    // Safari
    Safari — prefs:root=SafariSiri — prefs:root=General&path=Assistant
    // 声音
    Sounds — prefs:root=Sounds
    // 软件更新
    Software Update — prefs:root=General&path=SOFTWARE_UPDATE_LINK
    // iTunes Store 与 APP Store
    Store — prefs:root=STORE
    // Twitter
    Twitter — prefs:root=TWITTER
    // Usage
    Usage — prefs:root=General&path=USAGE
    // VPN
    VPN — prefs:root=General&path=Network/VPN
    // 墙纸
    Wallpaper — prefs:root=Wallpaper
    // WIFI
    Wi-Fi — prefs:root=WIFI
    、、、

  • 当你的应用在iOS 9中需要使用 QQ/QQ空间/支付宝/微信SDK 的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码:
    <key>LSApplicationQueriesSchemes</key>
    <array>

    <string>wechat</string>
    <string>weixin</string>

        <!-- 新浪微博 URL Scheme 白名单-->
        <string>sinaweibohd</string>
        <string>sinaweibo</string>
        <string>sinaweibosso</string>
        <string>weibosdk</string>
        <string>weibosdk2.5</string>
    
        <!-- QQ、Qzone URL Scheme 白名单-->
        <string>mqqapi</string>
        <string>mqq</string>
        <string>mqqOpensdkSSoLogin</string>
        <string>mqqconnect</string>
        <string>mqqopensdkdataline</string>
        <string>mqqopensdkgrouptribeshare</string>
        <string>mqqopensdkfriend</string>
        <string>mqqopensdkapi</string>
        <string>mqqopensdkapiV2</string>
        <string>mqqopensdkapiV3</string>
        <string>mqzoneopensdk</string>
        <string>wtloginmqq</string>
        <string>wtloginmqq2</string>
        <string>mqqwpa</string>
        <string>mqzone</string>
        <string>mqzonev2</string>
        <string>mqzoneshare</string>
        <string>wtloginqzone</string>
         <string>mqzonewx</string>
        <string>mqzoneopensdkapiV2</string>
        <string>mqzoneopensdkapi19</string>
        <string>mqzoneopensdkapi</string>
        <string>mqzoneopensdk</string>
    
        <!-- 支付宝  URL Scheme 白名单-->
        <string>alipay</string>
        <string>alipayshare</string>
    
    </array>
    

友情参考:
phzean
ZeroIG

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容