1,应用程序互相跳转
要打开本机上的其他应用程序,需要设置schemes,自定义的协议头,可以打开其他的应用程序,如果要返回调用的应用程序,需要知道调用我们的应用程序的scheme,schemes其实就相当于url
设置要打开的程序的schemes,链接要打开的程序的schemes
2,设置schemes
被跳转的应用设置schemes:项目 -> info -> URL Types -> URL Scheme
3,跳转
要跳转的应用配置plist,设置schemes白名单,里面有才可以跳
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
array里是每个schemes
跳转的代码
NSURL *url = [NSURL URLWithString:@"dididi://"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}else
{
NSLog(@"无法跳转");
}
注意跳转时schemes加://
4,被跳转的应用被拉起时的代理方法
-(BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
NSLog(@"%@ %@",url,options[UIApplicationOpenURLOptionsSourceApplicationKey]);
return YES;
}
options[UIApplicationOpenURLOptionsSourceApplicationKey],代表是谁拉起的这个应用,但是是唯一的,不能区分不同的逻辑。所有可以使用同一个应用可以配置不同的scheme,来拉起同一个应用,根据scheme来判断是从哪个逻辑拉起的,来指向被拉起应用的不同界面或者执行不同的方法。这里有两种方法来处理。
5,跳转到拉起应用指定的界面
5.1判断指定协议的方式(协议不同),注意判断的时候scheme要加://,如dididi1://,同一个应用一般用协议加地址的方式,这里只是介绍一下这个方法。
-(BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
NSLog(@"%@ %@",url,options[UIApplicationOpenURLOptionsSourceApplicationKey]);
if ([@"dididi1://" isEqualToString:url.absoluteString ]) {
UIStoryboard *board = [UIStoryboard storyboardWithName: @"Main" bundle: nil];
ViewController1 * VC = [board instantiateViewControllerWithIdentifier: @"ViewController1"];
[[UIApplication sharedApplication].keyWindow setRootViewController:VC];
}
return YES;
}
5.2同一个应用的不同界面一般用判断指定协议头+地址的方式或者只判断地址),如dididi://1,1就是地址,url.scheme拿到协议头(如http),url.host拿到url中的地址,注意不要://
优点:只需要配置一个scheme
// 协议+地址方式
if ([@"dididi" isEqualToString:url.scheme]) {
if ([@"1" isEqualToString:url.host]) {
UIStoryboard *board = [UIStoryboard storyboardWithName: @"Main" bundle: nil];
ViewController1 * VC = [board instantiateViewControllerWithIdentifier: @"ViewController1"];
[[UIApplication sharedApplication].keyWindow setRootViewController:VC];
}else if([@"2" isEqualToString:url.host]){
UIStoryboard *board = [UIStoryboard storyboardWithName: @"Main" bundle: nil];
ViewController1 * VC = [board instantiateViewControllerWithIdentifier: @"ViewController2"];
[[UIApplication sharedApplication].keyWindow setRootViewController:VC];
}else{
UIStoryboard *board = [UIStoryboard storyboardWithName: @"Main" bundle: nil];
ViewController1 * VC = [board instantiateInitialViewController];
[[UIApplication sharedApplication].keyWindow setRootViewController:VC];
}
}
6,传递参数
NSURL *url = [NSURL URLWithString:@"dididi://1?wangyiDemo"];
?后面的参数,可以是跳转的应用的scheme,用于跳转回来,也可以是其他东西
//地址方式
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSURL *url = [NSURL URLWithString:@"dididi://1?wangyiDemo"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}else
{
NSLog(@"无法跳转");
}
}
被拉起的应用接受参数
url.query 就是?后面的内容
注意:
1,跳转别人一定要设置白名单
2,被跳转一定要设置scheme
详细的demo在GitHubhttps://github.com/CDLOG/AppJumpDemo
网友评论