標籤:swift url scheme safari
開啟之前會發生什麼呢,先看看這個圖:
我這裡只是簡單類比了一下。當你輸入一個特殊的“url”之後,Safari彈出一個提示,問你是否繼續開啟這個App。如果你這個時候confirm的話。那麼這個App就會開啟。
我們開啟看看這個app是什麼樣的App。看圖:
是一個灰常簡答的TableView。然後點擊某一行的時候會跳轉到一個號稱是詳細也的地方。其實什麼都沒有。只有一個地方可以看的,那就是這個頁面的title。記住這個title,後面的功能展示就全靠他了。
當你跳轉到詳細頁的時候就是這個樣子的:
是的就一個title,然後沒別的了。
我們接著上文繼續。上文說到在Safari中輸入一個特殊的“URL”,confirm了Safari的彈出框以後就會開啟這個應用。到這裡來說只是初級的功能。因為這樣顯然還是不夠的。我們需要的是使用者完成confirm彈出框以後可以開啟詳細頁。一步一步來。
1. 在Xcode6+版本中選擇你的項目,之後選擇infotab。看圖:
從左至右一共三步就到了設定url scheme的地方了。圖:
在info頁面裡的最下面有個URL Types,點開以後在裡面設定URL Scheme為deeplink,當然了,這裡可以按照你需要的方式設定任意的URL Scheme。
到這裡,儲存一下然後運行你的App。App運行起來以後按下cmd+shift+H,調到app介面。之後開啟Safari,在地址欄中輸入deeplink://,然後點Go按鈕。接下來就會彈出一個comfirm的彈框。點擊open,你的app就會開啟。圖:
1. 在地址欄中輸入你定義的url scheme。
2. 點Go按鈕後彈出confirm框
點open按鈕後,你的app就會開啟。
但是。。我們要得不只是這樣而已。url scheme能提供給我們的也不只是這樣而已。我們要開啟的是詳細頁。
url 有了scheme,那麼就可以有後面的一堆東西。比如:http://baidu.com。有了http://後面就可以有baidu.com。我們也可以這樣用。在deeplink://後面加入一串數字,用這串數字可以代表很多。在這裡我們就用這串數字來代表一個詳細頁需要展示的產品的產品編號。這些都很簡單,但是怎麼實現呢???
其實,很多的App的第三方登入用的就是這個東西。比如微博或者的登入或者分享之類的。在選擇了登入之後就會跳到或者微博裡,等登入了以後就可以跳回去。這些都是用的自訂url scheme。在配置SDK的時候你都會看到這樣的要求。使用這樣的方法開啟的方法是:func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool,這個方法是在AppDelegate類中得。預設沒有提供實現,需要我們自己添加。
在這個方法執行的時候,添加一段代碼:println(url.absoluteString),可以列印出來開啟App的url是什麼。我們這裡當然是,比如,我要包括產品的詳細編號的話就是:"deeplink://1234567890"。那麼在這裡列印出來的就是整個的這個字串:"deeplink://1234567890"。因為,我們的url scheme是固定不變的。那麼我們可以截取產品的具體編號。
var itemCode = (url.absoluteString! as NSString).substringFromIndex(11)
這樣就可以獲得產品的編號。然後調用window的rootViewController(需要說明的是,我們的rootViewController是UINavigationController)。只需要把產品編號賦值給產品詳細頁的Controller,讓這個Controller使用這個產品編號從伺服器後端擷取產品的詳細資料就可以了。當然在後面的實現中是不包括從後端擷取資訊的內容的。這些功能也很容易添加。
我們在DetailViewController中添加一個產品編號的屬性:var productDetail: String!。之後,將這個屬性賦值給Controller的title,在頁面中展示出來。
override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.whiteColor() self.title = self.productDetail }
瞭解了具體的展示以後,看看如何在上面說到的方法:func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool中如何處理頁面的跳轉,不處理的話只是開啟了UINavigationController的rootViewController。
這樣的處理其實也很簡單。UINavigationController本來已經是rootViewController了,只要push一下初始化好的DetailViewController就完事大吉了。非常簡單。代碼:
if let window = self.window, let rootController = window.rootViewController {// self.window?.rootViewController println("window is cool") var navController = rootController as! UINavigationController var detailController = DetailViewController() detailController.productDetail = itemCode navController.pushViewController(detailController, animated: true) }
這樣就處理完畢了。開啟safari,輸入“deeplink://1234567890”,看看運行效果吧:
so far so good!但是,還有一個bug。重複多次實驗就會看到。想想怎麼解決吧,就當是課後作業。
歡迎加群互相學習,共同進步。QQ群:58099570 | 做人要厚道,轉載請註明出處!
Swift:在Safari中開啟App