iOS 应用间跳转

在当前App中打开其他App

URL Scheme:http://sspai.com/31500

“scheme://[host?query]”

打电话、发短信、打开网页、打开App都需要不同的协议scheme,
如果想打开别人开发的App只需要知道目标App对应的URL Schemes即可,如果是想打开自己开发的App,则还需要先定义出URL Schemes(TARGETS—>Info—> URL Types —> +)

这里写图片描述
对于iOS9.0之后要想打开App需要在Info.plist中设置一下LSApplicationQueriesSchemes(Array)白名单:允许打开的URL Scheme, 将要打开的App的URL Schemes添加到数组中
这里写图片描述

// 打电话:@"tel://10086"
// 发短信:@"sms://10086"
// 打开网页:@"http://www.baidu.com"
// 打开其他App:@“URL Schemes://”,例如 @"weixin://"  @"xiaoshe://"
// 打开指定App的指定界面:@"URL Schemes://界面[?query]"  微信朋友圈:@"weixin://dl/moments"
NSString *urlScheme = @"weixin://";
NSURL *url = [NSURL URLWithString:urlScheme];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url];
}

打开其他App指定的界面

例如微信中的:微信的朋友圈
开发中一般都是打开微信等App指定界面,开发中只需要在Info.plist中配置一下URL Scheme的白名单LSApplicationQueriesSchemes即可,然后指定url即可(微信已经公布出来了)。但是如果是打开自己公司开发的其他App是怎么实现的呢?

首先打开指定的页面是在目标App(要打开的App)中实现的,目标App可以监听openURL动作,然后解析url,根据不同的url值将根视图控制器设置对应的页面

新闻App

  1. 定义出新闻App对应的URL Types
    这里写图片描述
  2. 跳转xiaoshe App的代码,注意url上增加“friendscircle”:要打开的界面和 “news”:当前应用对应的URL Schemes
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor grayColor];
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSString *url = @"xiaoshe://friendscircle?news";
    NSURL *url = [NSURL URLWithString:url];

    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }
}

@end

xiaoshe App: AppDelegate : 通过代理方法监听URL的打开,然后解析url,根据不同的界面值跳转到不同的页面并记录来源的URL Scheme

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property(nonatomic, copy)NSString *urlScheme;

@end

//---------------------------------------------------------
#import "AppDelegate.h"
#import "AppDelegate+PrivateMethod.h"
#import "FriendCircleViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)app handleOpenURL:(nonnull NSURL *)url {
    [self openURL:url];
    return YES;
}

// iOS9.0之后适配
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
    [self openURL:url];

    return YES;
}

- (void)openURL:(NSURL *)url{
    self.urlScheme = url.query;
    if ([url.host isEqualToString:@"friendscircle"]) {
        // 朋友圈界面
        UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
        [navigationController popToRootViewControllerAnimated:false];

        [navigationController pushViewController:[[FriendCircleViewController alloc] init] animated:YES];
    }
}
@end

FriendCircleViewController : 通过在AppDelegate中记录的来源的URL Scheme,再重新打开一下就相当于返回到源App了,同样也要在Info.plist中增加键LSApplicationQueriesSchemes,增加news

#import "FriendCircleViewController.h"
#import "AppDelegate.h"
@interface FriendCircleViewController ()

@end

@implementation FriendCircleViewController
- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)returnApp:(id)sender {
    AppDelegate *appDelegate = (AppDelegate *)([UIApplication sharedApplication].delegate);
    NSString *scheme = appDelegate.urlScheme;
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@://", scheme]];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }
}
@end

跳转到iOS系统中的界面,同样也需要设置URL Tyeps中的URL Schemes:prefs、在Info.plist中增加白名单。

最常见的应用场景:当为iphone安装搜狗输入法或百度输入法的时候,输入法程序会引导你去一步一步设置你的键盘输入法,一般每一个步骤都有一个按钮,比如 打开系统设置>通用>键盘>键盘>添加新键盘>选择搜狗输入法。

以下是对应的url
// About — prefs:root=General&path=About
// Accessibility — prefs:root=General&path=ACCESSIBILITY
// AirplaneModeOn— prefs:root=AIRPLANE_MODE
// Auto-Lock — prefs:root=General&path=AUTOLOCK
// Brightness — prefs:root=Brightness
// Bluetooth — prefs:root=General&path=Bluetooth
// Date& Time — prefs:root=General&path=DATE_AND_TIME
// FaceTime — prefs:root=FACETIME
// General— prefs:root=General
// Keyboard — prefs:root=General&path=Keyboard
// iCloud — prefs:root=CASTLE iCloud
// Storage & Backup — prefs:root=CASTLE&path=STORAGE_AND_BACKUP
// International — prefs:root=General&path=INTERNATIONAL
// Location Services — prefs:root=LOCATION_SERVICES
// Wi-Fi — prefs:root=WIFISetting—prefs:root=INTERNET_TETHERING
// Wallpaper — prefs:root=Wallpaper
// VPN — prefs:root=General&path=Network/VPN
// Twitter — prefs:root=TWITTER Usage — prefs:root=General&path=USAGE
// Store — prefs:root=STORE
// SoftwareUpdate— prefs:root=General&path=SOFTWARE_UPDATE_LINK
// Sounds — prefs:root=Sounds
// Siri — prefs:root=General&path=Assistant
// Safari — prefs:root=Safari
// Reset — prefs:root=General&path=Reset
// Profile — prefs:root=General&path=ManagedConfigurationList
// Phone — prefs:root=Phone Photos — prefs:root=Photos
// Notification — prefs:root=NOTIFICATIONS_ID
// Notes — prefs:root=NOTES
// Nike + iPod — prefs:root=NIKE_PLUS_IPOD
// Network — prefs:root=General&path=Network
// Music VolumeLimit— prefs:root=MUSIC&path=VolumeLimit
// Music Equalizer — prefs:root=MUSIC&path=EQ
// Music — prefs:root=MUSIC

这里写图片描述
这里写图片描述

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//    NSString *urlScheme = @"xiaoshe://friendscircle?news";
    NSString *urlScheme = @"prefs:root=General&path=About";
    NSURL *url = [NSURL URLWithString:urlScheme];

    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值