歡迎大家關注我的公眾號,我會定期分享一些我在專案中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來
文章也會同步更新到我的部落格:
ppsheep.com
之前寫了一篇關於APP之間跳轉的文章,期間有同學說能否出一個類似於微信登入或者支付寶支付之類的,跳轉到支付寶獲得訊息再調回源程式,並且帶上資訊。今天我們就再來聊聊,實現這樣一種效果,沒看過之前應用跳轉的,請移步:
ppsheep.com/2016/10/27/…
之前我們說到APP之間的跳轉,其實就是通過一個URL Schemes進行跳轉,APP之間的傳值,其實也是通過這個URL進行傳值。
再有我們想跳回原來程式,那麼我們還需要知道源程式的URL Schemes,這樣我們才能跳回到源程式,所以在傳遞引數的時候 我們還需要把源程式的URL Schemes傳遞過去。
我們需要傳遞的引數:
- 當前APP的 URL Schemes
- 我們需要傳遞的實際引數
還有一個重要的事情,因為我們需要從APP2跳回APP1,所以我們還需要設定APP1的URL Schemes,怎麼設定,我這裡就不寫出來了,具體可以看上一篇跳轉解析
我們之前知道 開啟另一個APP,是開啟一個URL
APP2://類似於這種,那我們會想到一般我們http有一種方式攜帶引數 http://url?name=?&age=?
我們APP之間的傳遞引數方式其實也是這樣的方式
//獲取APP2的URL Scheme 還需要帶上當前App的APP1
NSString *URLScheme = @"APP2://APP1";
//我們引數需要穿name age
NSString *params = @"name=yq&age=23";
//接下來加上我們需要攜帶的引數
NSString *realURL = [NSString stringWithFormat:@"%@?%@",URLScheme,params];
NSURL *appURL = [NSURL URLWithString:realURL];
//判斷手機中是否安裝了APP2
if ([[UIApplication sharedApplication] canOpenURL:appURL]) {
//開啟APP2ViewController2
[[UIApplication sharedApplication] openURL:appURL];
}else{
NSLog(@"沒有安裝APP2");
}複製程式碼
我們最終的appURL 是:
APP2://APP1?name=yq&age=23複製程式碼
我們在APP2中處理這個跳轉的URL
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
if ([url.absoluteString containsString:@"APP1"]){
NSLog(@"%@",url);
//拿到源程式的
NSString * urlschemes = [[url.absoluteString componentsSeparatedByString:@"//"][1] componentsSeparatedByString:@"?"][0];
//拿到引數
NSRange range = [url.absoluteString rangeOfString:@"?"];
NSString *paramStr = [url.absoluteString substringFromIndex:range.location+1];//去除問號
NSArray *params = [paramStr componentsSeparatedByString:@"&"];
NSLog(@"%@",params);
//跳回源程式
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 延時3s模擬處理後回撥指定的 URL Schemes並傳遞結果
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"APP2://"]]) {
NSLog(@"跳轉成功");
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@://back?name=back&code=200",urlschemes]]];
}else{
NSLog(@"跳轉失敗");
NSLog(@"未安裝應用!");
}
});
}
}複製程式碼
在APP2中 我們拿到了APP1傳遞的引數 放在了params陣列中,同樣的 我們在APP1中再處理從APP2跳回來的資訊
/**
跳轉回來
*/
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<uiapplicationopenurloptionskey,id> *)options{
if ([url.absoluteString containsString:@"back"]) {
//拿到引數
NSRange range = [url.absoluteString rangeOfString:@"?"];
NSString *paramStr = [url.absoluteString substringFromIndex:range.location+1];//去除問號
NSArray *params = [paramStr componentsSeparatedByString:@"&"];
NSLog(@"%@",params);
}
return YES;
}