iOS的URLScheme,iOSURLScheme

來源:互聯網
上載者:User

iOS的URLScheme,iOSURLScheme

一直都有接觸要設定app的url scheme,從最早的facebook開始。
當時的理解是SSO用的,當授權成功之後,facebook app或者safari可以利用給定的url scheme來回調程式。按照Facebook dev頁的指南,在Info.plist中加入url scheme。

如何在info.plist中加入url scheme

直接將info.plist用源碼開啟,加入如下代碼:

<key>CFBundleURLTypes</key>
   <array>
       <dict>
           <key>CFBundleURLName</key>
           <string>com.xxxx.xxxx</string>
           <key>CFBundleURLSchemes</key>
           <array>
               <string>yourURLScheme</string>
           </array>
       </dict>
   </array>

當然也可以在xCode中加入URL Type的row,不過遇到過xCode不自動提示補全,自己寫的話,會無效,所以還是比較信任源碼~

直接在xCode中操作添加URL Types

再後來xCode的工程屬性Info頁簽下面有專門的URL Types條目添加URL Types,在Identifier中填入BundleID,URL Schemes中填入對應的Scheme。

Scheme的作用在之前facebook的使用中已經領悟了一部分,但是還有其他強大的功能,比如你想要在iOS裝置的safari中輸入一個URL(後面你會知道,就是你自己定義的URL Schemes)就能直接開啟你的裝置,就和啟動眾多系統應用一樣!!沒錯,你的DIAO絲程式也能像掛著蘋果老爹光環的“高帥富”應用一樣啟動。
系統URL Schemes

Stock
Some of these URL schemes doesn't work anymore in the latest iOS. Let's hope they get reintroduced.

itms-apps:// – Open the App Store
maps:// – Open the Maps app
sms:// – Open the compose window of the Messages app
music:// – Go to the currently playing song in the Music app
youtube:// – Open the YouTube app
itms-books:// – Open the iBooks app
facetime://
prefs:root=General&path=Bluetooth
prefs:root=General&path=AUTOLOCKS
prefs:root=NOTIFICATIONS_ID
prefs:root=General&path=USAGE
prefs:root=General&path=Bluetooth
prefs:root=AIRPLANE_MODE
prefs:root=Brightness
prefs:root=Wallpaper
prefs:root=INTERNET_TETHERING
prefs:root=CASTLE
prefs:root=CASTLE&path=STORAGE_AND_BA
prefs:root=General&path=About
prefs:root=General&path=USAGE/CELLULAR_USAGE
prefs:root=MUSIC&path=EQ
prefs:root=General&path=Network
prefs:root=LOCATION_SERVICES
prefs:root=Phone&path=CallerID
prefs:root=Phone&path=CallForwarding
prefs:root=Safari
prefs:root=General&path=Assistant
prefs:root=General&path=Keyboard
prefs:root=Sounds
prefs:root=General&path=Network/VPN
prefs:root=WIFI

想要實現上面的功能,在應用中僅僅加入scheme是不夠的,還需要針對該scheme做對應的處理,有點類似廣播通訊的原理,輸入scheme後發出廣播,你需要寫接收該廣播以及處理的代碼。

  1. 不要實現applicationDidFinishLaunching:方法
  2. 實現application:didFinishLaunchingWithOptions:方法,並在其中檢查url,如果能處理該url則返回YES,否則不做處理返回NO。
  3. 實現application:handleOpenURL:,處理url,成功返回YES,否則返回NO。

在iOS4中,URL分以下兩種方式傳入app中

  1. 如果是啟動程式,則application:didFinishLaunchingWithOptions:被執行,返回YES若且唯若application:handleOpenURL:執行返回YES。
  2. 如果程式由後台掛起變為活動,則application:didFinishLaunchingWithOptions:不會被執行,但是application:handleOpenURL:會被執行。

處理代碼如下:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
   NSLog(@"%@", [url absoluteString]);
   if ([[url host] isEqualToString:@"yourURLScheme"]) {
       return YES;
   }
   return NO;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   ...
   NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
   if ([self application:application handleOpenURL:url]) {
       return YES;
   }
   return NO;
// End of application:didFinishLaunchingWithOptions:
注意:

在iOS4.2之後,application:handleOpenURL:將被DEPRECATED
可以使用

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
       sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

sourceApplication
The bundle ID of the application that is requesting your application to open the URL (url).

sourceApplication即為調用者發送給接收者的Bundle ID,比如MobileSafari就是com.apple.mobilesafari

annotation
A property-list object supplied by the source application to communicate information to the receiving application.

調用者發給接收者的plist對象

如果該程式沒有被安裝,那麼在Safari中開啟我們希望能跳轉到下載介面。需要實現這個功能,我們可以利用JS的window.location和setTimeout函數。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<body>
<script>
window.location = "URL Scheme:";
setTimeout( function(){ window.location="http://App Store地址";   } , 1500);
</script>
</body>
</html>

將該代碼儲存為index.html,放於網站上,利用Safari開啟該檔案,則可以實現如果安裝了該應用,則開啟,否則能夠直接跳轉到App Store的App下載頁面。

注意

JS中的URL Scheme不要包含非逸出字元,比如'-./'等,如果有非逸出字元則需要轉義後輸入到Safari,直接在Safari中輸入URL Scheme開啟應用,如果提示

Safari打不開該網頁,因為這是一個本地檔案

那麼很有可能因為你的URL Scheme中包含了非逸出字元,最好全為英文字母數字最好。


代碼如何調用
     NSURL *url = [NSURL URLWithString:@"URL Scheme://"];
[[UIApplication sharedApplication] openURL:url];

想要知道一個 ios app的 url scheme 去什地方找?

在這個程式的plist檔案中設定:
URL Types下面定義了URL Schemes。你可以搜尋一下URL Scheme,網上有很多介紹的。
 
IOS第三方應用沒有提供 URL Scheme供其他程式調用,我通過什方法才可以在代碼中實現對它的調用?

匯入標頭檔,和
delegate
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.