Scheme是什麼、怎麼自定義Scheme、JLRoutes的使用-備

轉到移動端開發後竟然如今纔用到Scheme真是慚愧慚愧。ios

URL Scheme是什麼

相信你們都知道URL。git

http://www.apple.com就是一個URL。github

而://以前的部分就稱爲Scheme瀏覽器

(因此,你看,其實並無什麼難的,在這裏多插一句給新人的話:不要看到新東西就以爲難,其實不少時候難的就是在於你看到新事物而不敢去研究)微信

也就是說http://www.apple.com的Scheme就是http。app

iOS中的URL Scheme

iOS中的Scheme也是同樣的,無非是定義應用本身的Scheme,而後定義一些本身的URL解析,就好像YourApp://OneController?username=xxx&userInput=xxx工具

有了這些URL Scheme你能夠像網頁跳轉同樣經過URL來傳遞參數、信息。學習

好比常見的分享功能,從其餘應用點擊微信分享,會自動跳轉到微信APP的朋友圈發表動態頁面,並填好相應的動態內容。你能夠想象一下其URL Scheme多是這樣的:weixin://dl/moments?content=」今天在學習URL Scheme」&src=」zhoulingyu.com」(我只是舉個例子)url

有一點須要注意的是,和Web開發不一樣,iOS中並非全部的頁面或者操做都有URL Schemes,這徹底是由你主導的的,若是你須要,你就能夠本身定義一些,並去解析。code

自定義你應用的Scheme

何時用到URL Scheme

自定義Scheme是有意義的 
有如下幾種使用場景供你參考:

  1. 從一個頁面跳轉到另外一個頁面,你不想寫N多行代碼來『獲取下一個控制器』->『建立控制器』->『傳遞參數』
  2. 從其餘應用中跳轉到你的應用中特定的位置,並填好相應的參數。好比微博分享的時候,是從另外一個頁面跳轉到微博應用的『發微博』頁面,並自動填好了微博的文字內容

開始寫代碼吧

使用瀏覽器訪問應用

咱們建一個應用,就叫URLSchemeDemo

  1. 在storyboard中,給咱們的應用加一個按鈕,便於展現 
  2. 打開info.plist 
    • 添加一行,key選擇 URL types 
    • 點擊左邊箭頭打開列表,能夠看到 Item 0。打開Item 0,能夠看到 URL Identifier,這是你自定義的 URL scheme 的名字。若是想保證惟一性,可使用翻轉域名好比 com.taobao.ios.yourApp 
    • 給 Item 0 再新增一行,從下拉列表中選擇 URL Schemes。你會發現這是一個Array,這是由於容許應用定義多個 URL schemes 
    • 打開URL schemes並點擊裏面的Item 0。在value中定義你的 URL scheme 的名字。好比你的APP名 
  3. 在AppDelegate.m中要處理接收到的URL Scheme
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {    NSLog(@"從哪一個app跳轉而來 Bundle ID: %@", sourceApplication);    NSLog(@"URL scheme:%@", [url scheme]);    return YES;}
  1. 運行項目,當app安裝到設備上時,URL Scheme將會自動註冊
  2. 打開Safari在地址欄輸入URLSchemeDemo://(你剛剛在URL schemes中定義的Scheme) 
  3. 回車調整轉,Safari會提示你『在URLSchemeDemo中打開鏈接嗎?』 
  4. 點擊確認,你會發現跳轉到了你的應用中,而且後臺也打印了相應的處理內容 
     

使用另外一個應用訪問應用

上面編寫了如何從瀏覽器經過URL Scheme跳轉應用,下面將展現如何從另外一個應用跳轉到本應用

再建一個項目,就叫URLSchemeDemoTest

  1. 在storyboard中拉一個按鈕 
  2. 給按鈕添加事件
- (IBAction)jump:(UIButton *)sender {    NSString *customURL = @"URLSchemeDemo://";    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];}
  1. 運行項目,點擊按鈕,你會發現一樣能跳轉到以前的應用

JLRoutes

看到這裏可能有人問了,我能夠在跳轉的時候傳遞一些參數嗎?

固然能夠,這些參數你均可以本身添加,可是一樣要在- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation中作解析。 
好比像YourAPP://SecondController?content=」成功解析」這樣的URL Scheme,可能本身解析起來很是的費勁

在這裏介紹一個第三方工具JLRoutes,能夠很是方便的解析自定義URL Scheme

使用JLRoutes

好比咱們如今就要解析URLSchemeDemo://SecondController,但願使用這個URLScheme直接能夠打開URLSchemeDemo應用中的SecondController

URLSchemeDemo項目

  1. 導入JLRoutes.h、JLRoutes.m
  2. 我在URLSchemeDemo中添加SecondViewController
  3. 給SecondViewController在viewDidLoad中添加如下顏色,以做區分
- (void)viewDidLoad {    [super viewDidLoad];    self.view.backgroundColor = [UIColor greenColor];}
  1. 在AppDelegate.m中修改處理方式
////  AppDelegate.m//  URLSchemeDemo////  Created by 周凌宇 on 16/1/3.//  Copyright © 2016年 周凌宇. All rights reserved.//#import "AppDelegate.h"#import "JLRoutes.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    [JLRoutes addRoute:@"/:controller" handler:^BOOL(NSDictionary *parameters) {        NSString *controller = parameters[@"controller"];        [self.window.rootViewController presentViewController:[[NSClassFromString(controller) alloc] init] animated:YES completion:^{        }];        return YES;    }];    return YES;}- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {    return [JLRoutes routeURL:url];}@end

URLSchemeDemoTest項目

固然是改一下咱們點擊按鈕後打開的URL

- (IBAction)jump:(UIButton *)sender {    NSString *customURL = @"URLSchemeDemo://SecondViewController";    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];}

運行

  1. 打開URLSchemeDemoTest應用,點擊按鈕,就能夠直接跳轉到URLSchemeDemo的SecondViewController了 

源代碼

若是想要源代碼,小魚已經上傳了一份,能夠在這裏下載

補充

JLRoutes是一個很是好用的工具,除了以上簡單的用法外,還能夠解析更加複雜的URL Scheme,能夠參考官方文檔:https://github.com/joeldev/JLRoutes

相關文章
相關標籤/搜索