深度跳转-scheme
1. 什么是 scheme ?
我們都知道蘋果手機中的APP都有一個沙盒,APP就是一個信息孤島,相互是不可以進行通信的。但是iOS的APP可以注冊自己的URL Scheme,URL Scheme是為方便app之間互相調用而設計的。我們可以通過系統的OpenURL來打開該app,并可以傳遞一些參數
URL Scheme必須能唯一標識一個APP,如果你設置的URL Scheme與別的APP的URL Scheme沖突時,你的APP不一定會被啟動起來。因為當你的APP在安裝的時候,系統里面已經注冊了你的URL Scheme。 一般情況下,是會調用先安裝的app。但是iOS的系統app的URL Scheme肯定是最高的。所以我們定義URL Scheme的時候,盡量避開系統app已經定義過的URL Scheme。
2. scheme 用來做什么?
- 應用 A 跳轉到應用 B
- 從應用 B 返回到應用 A
- 從 warp 頁喚起 APP
- 跳轉到指定頁面
- 喚起應用傳參數
3. scheme 怎么用 ?
- 方法一
在?TARGETS?->?Info?->?URL Types?點擊添加
- 方法二
在info.plist中右擊,選中,Add Row選項,然后輸入URL types,類型為 Array
URL Identifier是自定義的 URL scheme 的名字,一般采用反轉域名的方法保證該名字的唯一性,比如 com.DemoB.www,不過在iOS中打開一個應用程序只需要拿到這個應用程序的協議頭(URL Scheme)即可,所以我們只需配置應用程序的協議頭即可。一個應用是可以有多個URL Schemes的。
4. scheme 的實際使用
4.1 應用A跳轉到應用B
這里創建了兩個應用:DemoA?和?DemoB,DemoB?注冊了?Scheme?為?demobscheme,下面來實現?DemoA?→?DemoB?的跳轉
#pragma mark - DemoA -> DemoB - (IBAction)jumpToDemoB:(id)sender {NSString *urlString = @"demobscheme://";//沒有參數NSURL *url = [NSURL URLWithString:urlString];if ([[UIApplication sharedApplication] canOpenURL:url]) {[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {}];}else {[self showMessage:@"沒有該應用"];} }在?DemoA?中點擊相應的按鈕跳轉到?DemoB,會發現并不能跳轉,因為在iOS9?以后,如果使用?canOpenURL:?方法,該方法所涉及到的?URL Schemes?必須在?Info.plist?中將它們列為白名單,否則不能使用
在?Info.plist?中添加?LSApplicationQueriesSchemes字段,該字段對應的是數組類型,然后添加鍵值為DemoBScheme(DemoB的Scheme)
再次點擊按鈕就可以跳轉到DemoB
4.2 跳轉到指定頁面
在?DemoA?中的點擊事件中,我們可以修改?urlString?為?demobscheme://page1,其中?demobscheme://?是?DemoB?應用的?scheme?,page1?是與?DemoB?約定好的跳轉到?PageOne?頁面的標識符
#pragma mark - 跳轉到pageOne頁面 - (IBAction)jumpToPageOne:(id)sender {// demobscheme:// 是DemoB應用的scheme page1是與DemoB約定好的跳轉到PageOne頁面的標識符 // ?是分割符(當然也可以用其他符號作分割),在DemoB中通過分隔符來截取DemoA的scheme, demoascheme是自己的scheme,用來從DemoB跳轉回來NSString *urlString = @"demobscheme://page1?demoascheme"; NSURL *url = [NSURL URLWithString:urlString];if ([[UIApplication sharedApplication] canOpenURL:url]) {[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {}];}else {[self showMessage:@"沒有該應用"];} }在?appdelegatete?中實現?application:openURL:options:?方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {// 1.獲取導航欄控制器UINavigationController *rootNav = (UINavigationController *)self.window.rootViewController;// 2.獲得主控制器UIViewController *mainVc = [rootNav.childViewControllers firstObject];// 3.每次跳轉前必須是在跟控制器(細節)[rootNav popToRootViewControllerAnimated:NO];if ([url.absoluteString containsString:@"page1"]) {//與DemoA約定好的字符PageOneViewController *page = [[PageOneViewController alloc] init];page.urlString = url.absoluteString;[mainVc.navigationController pushViewController:page animated:YES];}else if ([url.absoluteString containsString:@"page2"]) {PageOneViewController *page = [[PageOneViewController alloc] init];page.urlString = url.absoluteString;[mainVc.navigationController pushViewController:page animated:YES];}else {UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打開啦"message:[NSString stringWithFormat:@"scheme - %@,\n host -- %@,\n query -- %@",url.scheme,url.host,url.query]delegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];NSLog(@"query -- %@", url.query);[alertView show];}return YES; }4.3 通過網址打開app
網頁打開app也是根據app的協議頭(URL scheme)來區分打開的是哪一個app的,我們直接在瀏覽器上復制粘貼我們的url scheme ,系統會自動彈框提醒是否打開本應用,跟DemoA跳轉到DemoB的跳轉是一樣的, 當然網頁傳參跟app跳轉傳參都是一樣的格式.
4.4 通過URL傳參
有的時候我們跳轉到另一個app的時候需要傳遞一些參數,讓另一個app根據我們傳遞的參數作出相應的行為
傳參的格式如下:
可以發現跟我們用get請求的接口是一樣的,但是參數協議需要自己定義好,避免解析出錯。
5. 相關第三方
自己去開發scheme的跳轉,以及參數跳轉,還有warp頁面的跳轉和傳參,是一個比較費時、費力的事情
不過可以直接使用第三方SDK來簡單快速實現,極光魔鏈JMLink?是一個輕量級、操作簡單的深度跳轉SDK。
- 快速
- 無需考慮適配問題
- 無需定義參數解析協議
- 無需繁瑣測試
- 只需定義自己參數即可
傳送門:
極光魔鏈JMLink
魔鏈JMLink - iOS 集成指南
魔鏈JMLink - Android 集成指南
魔鏈JMLink - Web 集成指南
原創聲明:本文系作者授權極光社區發表。如有侵權,請聯系 stallonedll@sina.com?刪除。?
總結
以上是生活随笔為你收集整理的深度跳转-scheme的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算今天是星期几
- 下一篇: PPC飞信问题...WM6.5版无法安装