一、实现目标
就是点击上面蓝色背景的APP(去哪儿)的按钮然后跳转到白色背景APP(支付宝)里面。
二、具体实现
2.1 因为是去哪儿跳转到支付宝,支付宝需要进行scheme的设置,所以我们在支付宝工程设置里面进行scheme的配置
在info的界面下,我们打开URL Type的标签,我们在这里面配置scheme。这里解释一下什么是scheme,其实scheme就相当于网页URL中的http协议,我在这里写的scheme就作为我们这两个APP交流的协议。另一个APP如果想跳转到这个APP 的某个界面,就需要遵守这个协议,这个我们稍后会在另一个APP中实现如何实现遵守这个协议。回到这个页面下,有两个参数需要我们进行设置: identifier,URL Scheme。前者随便写什么都可以,后者也是随便写什么都可以,但是最好和当前APP有关,并且尽量短一些。设置好之后,运行一下,确保设置成功配置上。
2.2 现在支付宝的协议已经定义好了,现在我们需要在去哪儿APP中实现点击按钮跳转到支付宝APP中。
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (IBAction)jump:(id)sender {
//1、使用openURL跳转
//2、创建一个nsurl对象
NSURL * url = [NSURL URLWithString:@"ZFB123://QNE123"];//定义了一个协议
[[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionsSourceApplicationKey:@YES} completionHandler:nil];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
@end
我们在去哪儿APP中实现了点击按钮跳转的方法:
1. 首先我们创建了一个NSURL对象,这个对象是使用了其类方法创建的,对于此类方法的参数,我们来考察一下
@“ZFB123://QNE123”,"ZFB123"就是我们之前给支付宝定义的scheme,"://"表明这个符号前面的是协议,就是scheme,
而后面的"QNE123"是为了实现当从去哪儿跳转到支付宝还能从支付宝跳转回来传递给支付宝的参数,这个参数根据我们前
面的经验,就应该是去哪儿的scheme.这样才可以实现从支付宝又可以跳回去哪儿。
2. 然后我们调用了一个方法: [[UIApplication sharedApplication] openURL: options: completionHandler:];
首先[UIApplication sharedApplication]可以当前这个APP对象,然后openURL就写我们之前创建的那个URL对象。
然后编译运行一下。这样就可以了
2.3 当去哪儿跳转过来之后支付宝如何知道
我们来到支付宝的AppDelegate.m文件中,这里都是一些代理方法,然后我们重新写一个代理方法:
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
//外部的程序跳转过来,就会触发这个方法
NSLog(@"%@",url);
//@"http://www.baidu.com?wd=pxd"];
//url.scheme获取url的协议
//url.host获取主机名
//url.relativePath 路径
//url.query 获取参数(就是查询字符串)
NSString * qnrScheme = url.host;
NSURL * url2 = [NSURL URLWithString:[NSString stringWithFormat:@"%@://",qnrScheme]];
[[UIApplication sharedApplication]openURL:url2 options:nil completionHandler:nil];
return YES;
}
当外部程序跳转过来就会触发这个方法(钩子函数),我们可以将这个url打印出来看一下
没错就是我们在去哪儿中写的URL字符串,在这里我们可以用URL的属性将URL各个不同的部分提取出来,scheme就是协议就是 :// 的部分,host 就是其后面的域名部分,relativePath就是相对路径,query就是我们从去哪儿传递给支付宝的参数,就像查询字符串一样,但是不同软件的它的相关调用格式是不相同的,这个就要具体参考不同APP的文档了。
三、遇到的问题
我在实际操作的时候出现了点击按钮没有反应的情况,然后看到模拟器中只有一个APP去哪儿,这样就说明没有反应的原因,因为没有支付宝这个APP其scheme就是空的,因为这个APP根本就没有在模拟器中安装。这个时候我们需要进行以下修改
在这个工程页面中修改Bundle Identifier的值,随意修改,只要修改和支付宝的相应值不相同即可,然后重新编译运行一下发现模拟器中有这两个APP就可以了。