URL Scheme與openURL

来源:http://www.cnblogs.com/pandawuwyj/archive/2017/05/08/6827913.html
-Advertisement-
Play Games

URL Schemes URL Schemes是蘋果給出的用來跳轉到系統應用或者跳轉到別人的應用的一種機制。同時還可以在應用之間傳數據。 設置一個URL Schemes:選中App工程->Info->URL Types里添加,可以添加多個。 在Info.plist里是這樣的: 打開App的代碼是這樣 ...


URL Schemes

URL Schemes是蘋果給出的用來跳轉到系統應用或者跳轉到別人的應用的一種機制。同時還可以在應用之間傳數據。

設置一個URL Schemes:選中App工程->Info->URL Types里添加,可以添加多個。

 

在Info.plist里是這樣的:

 

打開App的代碼是這樣的:

1 NSURL *url = [NSURL URLWithString:@"testapp://"];
2 [[UIApplication sharedApplication] openURL:url];

如果兩個應用有URL Schemes是相同的,後安裝的應用的URL Schemes會把早安裝的應用的URL Schemes覆蓋掉。

 

在safari中打開

註冊了URL Schemes的應用,用safari瀏覽器也是可以打開的。用這個可以來驗證應用是否設置了想要的URL Schemes
方法:直接在safari的地址欄輸入testapp://, enter就可以打開了

 

canOpenURL

canOpenURL方法判斷能否打開這個url,然後再用openURL方法打開該URL的。這樣可以帶來更好的用戶體驗。

1 if ([[UIApplication sharedApplication] canOpenURL:url]) {
2         [[UIApplication sharedApplication] openURL:url];
3 }

iOS9的時候蘋果加強了許可權,只有在info.plist文件中加入了URL Schemes白名單才能使用canOpenURL:方法來判斷是否能打開該url。該白名單的上限是50個。

白名單在這添加(圖中是接入FacebookSDK後添加的項):

對應的Info.plist:

 

使用URL Schems傳遞數據

URL Schemes除了可以用來打開APP之外,還可以用來在兩個App之間傳遞少量的數據。

1 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
2 
3 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
4 
5 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can't open for some reason

url可以這麼寫:testapp://www.abc.com/abc?title=hello&content=helloworld,以上三個方法的url就會接收到後面的參數信息,這樣就實現了app間的數據傳遞。

以下是這三個回調的區別:

  • 3個回調的功能基本一樣,都是在別人通過URL Schemes打開應用的時候會執行的。
    不同之處:
  • A回調是在iOS2.0的時候推出的,參數只有url
  • B回到是在iOS4.2的時候推出的,參數有url sourceApplication annotation.
  • C回調是iOS9.0的時候推出的,參數有url optionsoptions有下麵幾個key
    // Keys for application:openURL:options:
    UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsSourceApplicationKey NS_AVAILABLE_IOS(9_0);   // value is an NSString containing the bundle ID of the originating application
    UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsAnnotationKey NS_AVAILABLE_IOS(9_0);   // value is a property-list typed object corresponding to what the originating application passed in UIDocumentInteractionController's annotation property
    UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsOpenInPlaceKey NS_AVAILABLE_IOS(9_0);   // value is a bool NSNumber, set to YES if the file needs to be copied before use
  • 這幾個回調是有優先順序的。C>B>A。也就是說,如果你3個回調都實現了,那麼程式只會執行C回調。其他回調是不會執行的。(當然,iOS9以下只會執行B回調)。

 

最後,在接入多個sdk的時候,sdk之間可能會重寫openurl方法,可能會導致A把B蓋住了,B的openurl回調再也調用不起來。

舉個例子,項目接入了shareSDK和facebookSDK,就發現facebookSDK的登錄回調一直拉不起來。

如何驗證這一點,可以在回調處打斷點,如下圖:

如果根本斷不到,多半就是被別的幹掉了,搜下項目里還有沒有類似的AppController里也實現了這個函數,看看別的sdk是怎麼幹掉的,要麼做取捨,要麼花力氣做相容。

 

整理自(http://www.jianshu.com/p/0811ccd6a65d),與自己趟坑的一些體會。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先背景就是測試同學發現我們的網頁在ie9中展示不正確,實際是所有非同步的介面都沒有執行。然後我就開始了苦逼的排查過程。我們所有非同步介面都是使用jQuery的ajax方法發出的,使用的jquery版本是1.11.0。 我最先定位到的是ajax方法返回status=0,statusText=No Tra ...
  • 一、內聯式css樣式,直接寫在現有的HTML標簽中 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <title>認識html標簽< ...
  • history.back(-1):直接返回當前頁的上一頁,數據全部消息,是個新頁面 history.go(-1):也是返回當前頁的上一頁,不過表單里的數據全部還在 ...
  • #myCarousel img{ width: 100%; height: 100%; object-fit: cover; } ...
  • 1 /* 遮罩插件 2 * 可選選項 3 * smBoxBg 小方格遮罩顏色 預設 #FFFFFF 4 * backgroudColor 大遮罩顏色 預設 #000000 5 * backgroundImage 動態圖片 預設 loading.gif 6 * text 文字信息 預設 載入中.... ...
  • 背景 很多很多傳統的Web開發者還在用著傳統的jquery和ES5,大家都知道現在的前端如火如荼,但是眼花繚亂的框架和層出不窮的新概念,讓很多人無從下手,本文從0開始,帶你一步步由jquery操作DOM轉型成為一個新思想的前端開發者。沒有過多的引申和概念解釋。先上手實踐,再回頭體會。讓我們開始。(本 ...
  • localStorage是HTML5在在客戶端存儲數據的新方法,存儲的數據沒有時間限制。 localStorage的主要API: localStorage.setItem(key,value); key是保存數據的變數,value是保存的數據 localStorage.getItem(key); 讀 ...
  • 首先可能需要安裝npm,並且配置環境. 1.打開Dos(命令提示符).按Windows徽標鍵+R組合鍵,輸入cmd然後按回車鍵進入Dos. 2.安裝Yeoman.在Dos下輸入npm install -g yo. 3.安裝Grunt.在Dos下輸入npm install -g grunt-cli. ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...