歡迎你們關注個人公衆號,我會按期分享一些我在項目中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來
git
文章也會同步更新到個人博客:
ppsheep.comgithub
以前寫了一篇關於APP之間跳轉的文章,期間有同窗說可否出一個相似於微信登陸或者支付寶支付之類的,跳轉到支付寶得到消息再調回源程序,而且帶上信息。今天咱們就再來聊聊,實現這樣一種效果,沒看過以前應用跳轉的,請移步:
ppsheep.com/2016/10/27/…數組
以前咱們說到APP之間的跳轉,其實就是經過一個URL Schemes進行跳轉,APP之間的傳值,其實也是經過這個URL進行傳值。微信
再有咱們想跳回原來程序,那麼咱們還須要知道源程序的URL Schemes,這樣咱們才能跳回到源程序,因此在傳遞參數的時候 咱們還須要把源程序的URL Schemes傳遞過去。app
咱們須要傳遞的參數:ui
還有一個重要的事情,由於咱們須要從APP2跳回APP1,因此咱們還須要設置APP1的URL Schemes,怎麼設置,我這裏就不寫出來了,具體能夠看上一篇跳轉解析url
咱們以前知道 打開另外一個APP,是打開一個URL
APP2://相似於這種,那咱們會想到通常咱們http有一種方式攜帶參數 http://url?name=?&age=?spa
咱們APP之間的傳遞參數方式其實也是這樣的方式code
//獲取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 是: component
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*)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; } 複製代碼
這樣咱們也拿到了APP2跳回來的數據
在iOS10中跳轉的API有更新,具體的變化能夠看API 我這裏就不列出來了
源代碼放在: