一直都有接觸要設(shè)置app的url scheme,,從最早的facebook開始,。
當(dāng)時(shí)的理解是SSO用的,當(dāng)授權(quán)成功之后,,facebook app或者safari可以利用給定的url
scheme來回調(diào)程序,。按照Facebook dev頁(yè)的指南,在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>
當(dāng)然也可以在xCode中加入U(xiǎn)RL
Type的row,不過遇到過xCode不自動(dòng)提示補(bǔ)全,,自己寫的話,,會(huì)無(wú)效,所以還是比較信任源碼~
直接在xCode中操作添加URL Types
再后來xCode的工程屬性Info頁(yè)簽下面有專門的URL Types條目添加URL
Types,,在Identifier中填入BundleID,,URL Schemes中填入對(duì)應(yīng)的Scheme。
Scheme的作用在之前facebook的使用中已經(jīng)領(lǐng)悟了一部分,,但是還有其他強(qiáng)大的功能,,比如你想要在iOS設(shè)備的safari中輸入一個(gè)URL(后面你會(huì)知道,就是你自己定義的URL
Schemes)就能直接打開你的設(shè)備,,就和啟動(dòng)眾多系統(tǒng)應(yīng)用一樣?。]錯(cuò),,你的DIAO絲程序也能像掛著蘋果老爹光環(huán)的“高帥富”應(yīng)用一樣啟動(dòng),。
系統(tǒng)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
想要實(shí)現(xiàn)上面的功能,在應(yīng)用中僅僅加入scheme是不夠的,,還需要針對(duì)該scheme做對(duì)應(yīng)的處理,,有點(diǎn)類似廣播通訊的原理,輸入scheme后發(fā)出廣播,,你需要寫接收該廣播以及處理的代碼,。
- 不要實(shí)現(xiàn)applicationDidFinishLaunching:方法
- 實(shí)現(xiàn)application:didFinishLaunchingWithOptions:方法,并在其中檢查url,,如果能處理該url則返回YES,,否則不做處理返回NO,。
- 實(shí)現(xiàn)application:handleOpenURL:,處理url,,成功返回YES,,否則返回NO。
在iOS4中,,URL分以下兩種方式傳入app中
- 如果是啟動(dòng)程序,,則application:didFinishLaunchingWithOptions:被執(zhí)行,返回YES當(dāng)且僅當(dāng)application:handleOpenURL:執(zhí)行返回YES,。
- 如果程序由后臺(tái)掛起變?yōu)榛顒?dòng),則application:didFinishLaunchingWithOptions:不會(huì)被執(zhí)行,,但是application:handleOpenURL:會(huì)被執(zhí)行,。
處理代碼如下:
- (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即為調(diào)用者發(fā)送給接收者的Bundle
ID,,比如MobileSafari就是com.apple.mobilesafari
annotation
A property-list object supplied by the source application to
communicate information to the receiving application.
調(diào)用者發(fā)給接收者的plist對(duì)象
如果該程序沒有被安裝,,那么在Safari中打開我們希望能跳轉(zhuǎn)到下載界面。需要實(shí)現(xiàn)這個(gè)功能,,我們可以利用JS的window.location和setTimeout函數(shù),。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www./TR/html4/strict.dtd">
<html>
<body>
<script>
window.location = "URL Scheme:";
setTimeout( function(){ window.location="http://App Store地址"; } , 1500);
</script>
</body>
</html>
將該代碼保存為index.html,放于網(wǎng)站上,,利用Safari打開該文件,,則可以實(shí)現(xiàn)如果安裝了該應(yīng)用,則打開,,否則能夠直接跳轉(zhuǎn)到App
Store的App下載頁(yè)面,。
注意
JS中的URL
Scheme不要包含非轉(zhuǎn)義字符,比如'-./'等,,如果有非轉(zhuǎn)義字符則需要轉(zhuǎn)義后輸入到Safari,,直接在Safari中輸入U(xiǎn)RL
Scheme打開應(yīng)用,如果提示
Safari打不開該網(wǎng)頁(yè),,因?yàn)檫@是一個(gè)本地文件
那么很有可能因?yàn)槟愕腢RL Scheme中包含了非轉(zhuǎn)義字符,,最好全為英文字母數(shù)字最好。
代碼如何調(diào)用
NSURL *url = [NSURL URLWithString:@"URL Scheme://"];
[[UIApplication sharedApplication] openURL:url];
|