APP URL Schemes

前言

通常來說它褪,手機APP相當于是一座座信息孤島茫打,APP之間不能相互通信老赤;但有些場景的確需要源葫,讓別的APP來喚醒自己息堂,例如支付寶為別的APP提供支付荣堰,又或者需要在一個營銷網(wǎng)頁中打開APP的指定頁面, 這時就可以利用定義自己的URL Schemes頁面跳轉(zhuǎn)協(xié)議來實現(xiàn)。

一.什么是URL Schemes

1.URL Schemes單詞理解

  • URL, 我們都很清楚振坚,https://www.apple.com 就是一個URL薇搁,我們叫它鏈接或者網(wǎng)址。
  • Schemes, 表示的是一個 URL 中的一個位置——最初始的位置渡八,即 ://之前的那段字符啃洋。比如 https://www.apple.com 這個網(wǎng)址的 Schemes 是 https。

2.簡單理解

例如微信打開掃一掃的功能的Schemes是:weixin://dl/scan屎鳍;我們可以理解宏娄,在以本地應(yīng)用為主的 iOS 上,我們可以像定位一個網(wǎng)頁一樣逮壁,用一種特殊的 URL 來定位一個應(yīng)用甚至應(yīng)用里某個具體的功能孵坚。而定位這個應(yīng)用的窥淆,就是這個應(yīng)用URL 的 Schemes 部分卖宠。

3.APP和網(wǎng)頁的對比

你可以完全按照理解一個網(wǎng)頁的 URL (也就是它的網(wǎng)址)的方式來理解一個 iOS 應(yīng)用的 URL,拿蘋果的網(wǎng)站和 iOS 上的微信來做個簡單對比:

網(wǎng)頁(蘋果) iOS 應(yīng)用(微信)
網(wǎng)站首頁/打開應(yīng)用 https://www.apple.com weixin://
子頁面/具體功能 https://www.apple.com/mac(Mac頁面) weixin://dl/moments(朋友圈)

在這里忧饭,https://www.apple.comweixin:// 都聲明了這是誰的地盤扛伍。然后在 https://www.apple.com 后面加上 /mac 就跳轉(zhuǎn)到從屬于 https://www.apple.com 的一個網(wǎng)頁(Mac 頁)上;同樣词裤,在 weixin:// 后面加上 dl/moments 就進入了微信的一個具體的功能——朋友圈蜒秤。

二.iOS中如何使用URL Schemes

1.注冊URL Schemes

為自己的項目Bank注冊一個URL Schemes汁咏,支持被喚醒。


Register Your URL Scheme

Identifier是自定義的 URL schemes 的名字作媚,一般采用反轉(zhuǎn)域名的方法保證該名字的唯一性攘滩,比如 com.lwin.www,不過在iOS中打開一個應(yīng)用程序只需要拿到這個應(yīng)用程序的協(xié)議頭URL Schemes即可,所以我們只需配置應(yīng)用程序的協(xié)議頭即可纸泡。一個應(yīng)用是可以有多個URL Schemes的漂问。

2.使用

a.喚醒應(yīng)用

在另外一個APP喚起B(yǎng)ank

- (IBAction)open:(id)sender {
    if(![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"LBSAPP://"]]) {
        return;
    }
    //不帶參數(shù)
     NSString * wslUrlScheme = @"LBSAPP://product";
    //如果參數(shù)含有特殊字符或漢字,需要轉(zhuǎn)碼女揭,否則這個URL不合法蚤假,就會喚起失敗吧兔;參數(shù)字符串的格式可以自定義磷仰,只要便于自己到時候解析就行;
    NSString * parameterStr = [@"?name=手機&id=1" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //LBSAPP://product?name=手機&id=1
    NSURL * url = [NSURL URLWithString:[wslUrlScheme stringByAppendingString:parameterStr]];
    //iOS 10以下
//    [[UIApplication sharedApplication] openURL:url];
    //iOS 10以上
    [[UIApplication sharedApplication] openURL:url options:nil completionHandler:^(BOOL success) {
    }];
}

如果點擊調(diào)用時控制臺報錯:
-canOpenURL: failed for URL: "LBSAPP://" - error: "This app is not allowed to query for scheme lbsapp"
這是因為在iOS9以后境蔼,如果使用 canOpenURL:方法灶平,該方法所涉及到的URL Schemes必須在"Info.plist"中將它們列為白名單,否則不能使用箍土。

添加URL Schemes探測白名單

b.被喚醒之后的處理

  1. 在AppDelegate里面的UIApplicationDelegate代理方法做監(jiān)聽逢享。
#import "AppDelegate.h"
#import "ViewController.h"
#import "SchemesManager.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    
    self.window.rootViewController = [[ViewController alloc] init];;
    
    [self.window makeKeyAndVisible];
    //第三方應(yīng)用打開本應(yīng)用啟動
    if(launchOptions[UIApplicationLaunchOptionsURLKey] != nil){
        [self application:application handleOpenURL:launchOptions[UIApplicationLaunchOptionsURLKey]];
    }
    // Override point for customization after application launch.
    return YES;
}
/**
 iOS 9.0 以下  程序運行過程中調(diào)用
 */
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    return [SchemesManager handleOpenURL:url];
}

/**
 iOS 9.0 以下   程序運行過程中調(diào)用
 */
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation{
    return [SchemesManager handleOpenURL:url];
}

/**
 iOS 9.0 之后
 三方喚起本程序后執(zhí)行的方法
 return YES 表示允許喚起本程序  程序運行過程中調(diào)用
 */
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options{
    return [SchemesManager handleOpenURL:url];
}


@end

2.可以單獨寫一個工具類來處理URL Schemes。

#import "SchemesManager.h"
#import <UIKit/UIKit.h>

@implementation SchemesManager

+ (BOOL)handleOpenURL:(NSURL *)url {
    
    NSMutableString *str = [NSMutableString string];
    [str appendFormat:@"URL scheme:%@ \n\n", [url scheme]];
    [str appendFormat:@"URL host:%@ \n\n", [url host]];
    [str appendFormat:@"URL absoluteString:%@ \n\n", [url absoluteString]];
    
    NSURLComponents *comp = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:YES];
    if(comp) {
        [str appendString:@"queryItems:\n"];
        NSArray<NSURLQueryItem *> *queryItems = [comp queryItems];
        for (int i=0; i<queryItems.count; i++) {
            NSURLQueryItem *item = queryItems[i];
            [str appendFormat:@"%@=%@ ", item.name, item.value];
            if(i<queryItems.count-1) {
                [str appendString:@","];
            }
        }
    }
    
    UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"分享" message:str delegate:self cancelButtonTitle:nil otherButtonTitles:@"分享完成", nil];
    [alertView show];
    return  YES;
}


+ (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    //返回URL scheme = bank234280的主應(yīng)用
    NSURL * url = [NSURL URLWithString:@"bank234280://success"];
    [[UIApplication sharedApplication] openURL:url options:nil completionHandler:^(BOOL success) {
    }];
}
@end

3.注意
如果使用了Scene吴藻,需要在SceneDelegate的代理方法
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts去處理URL Schemes :

@implementation SceneDelegate

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
    UIOpenURLContext *urlCtx = [URLContexts allObjects].firstObject;
    [SchemesManager handleOpenURL:urlCtx.URL];
}
@end

參考文章

URL Schemes 使用詳解
iOS scheme跳轉(zhuǎn)機制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞒爬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沟堡,更是在濱河造成了極大的恐慌侧但,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件航罗,死亡現(xiàn)場離奇詭異禀横,居然都是意外死亡,警方通過查閱死者的電腦和手機伤哺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來者祖,“玉大人立莉,你說我怎么就攤上這事∑呶剩” “怎么了蜓耻?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長械巡。 經(jīng)常有香客問我刹淌,道長饶氏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任有勾,我火速辦了婚禮疹启,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔼卡。我一直安慰自己喊崖,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布雇逞。 她就那樣靜靜地躺著荤懂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塘砸。 梳的紋絲不亂的頭發(fā)上节仿,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音掉蔬,去河邊找鬼廊宪。 笑死,一個胖子當著我的面吹牛眉踱,可吹牛的內(nèi)容都是我干的挤忙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼谈喳,長吁一口氣:“原來是場噩夢啊……” “哼册烈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起婿禽,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤赏僧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扭倾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淀零,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年膛壹,在試婚紗的時候發(fā)現(xiàn)自己被綠了驾中。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡模聋,死狀恐怖肩民,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情链方,我是刑警寧澤持痰,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站祟蚀,受9級特大地震影響工窍,放射性物質(zhì)發(fā)生泄漏割卖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一患雏、第九天 我趴在偏房一處隱蔽的房頂上張望鹏溯。 院中可真熱鬧,春花似錦纵苛、人聲如沸剿涮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽取试。三九已至,卻和暖如春怀吻,著一層夾襖步出監(jiān)牢的瞬間瞬浓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工蓬坡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猿棉,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓屑咳,卻偏偏與公主長得像萨赁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兆龙,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容