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後發出廣播,你需要寫接收該廣播以及處理的代碼。
- 不要實現applicationDidFinishLaunching:方法
- 實現application:didFinishLaunchingWithOptions:方法,並在其中檢查url,如果能處理該url則返回YES,否則不做處理返回NO。
- 實現application:handleOpenURL:,處理url,成功返回YES,否則返回NO。
在iOS4中,URL分以下兩種方式傳入app中
- 如果是啟動程式,則application:didFinishLaunchingWithOptions:被執行,返回YES若且唯若application:handleOpenURL:執行返回YES。
- 如果程式由後台掛起變為活動,則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