iOS的URLScheme – iPhone手機開發技術文章 iPhone軟體開發教學課程

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


如何在info.plist中加入url scheme

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

CFBundleURLTypes


CFBundleURLName
com.xxxx.xxxx
CFBundleURLSchemes

yourURLScheme


當然也可以在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函數。




      <script>
      window.location = "URL Scheme:";
      setTimeout( function(){ window.location="https://App Store地址"; } , 1500);
      </script>

      將該代碼保存為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];

發佈留言