Url Scheme实现APP间通信、分享

示例总效果.gif

简介:

URL Scheme就是一个可以让app相互之间可以跳转的对外接口。通过给APP定义一个唯一的URL路径来从外部快速的打开这个指定的APP,每个app的URL Scheme都是不一样的,如果存在一样的URL Scheme,那么系统就会响应先安装那个app的URL Scheme,因为后安装的app的URL Scheme被覆盖掉了,是不能被调用的。

应用:

第三方分享的SDK就是通过这种方式来实现分享的,我们将需要分享的数据传递给SDK,SDK通过OpenURL来打开第三方应用传递数据,返回时SDK来处理OpenUrl的参数,实现查看分享的回调。 从浏览器中某一页面的点击事件可以打开对应客户端的某一个界面,就是通过协议 URL Scheme:// + 参数 来完成唤醒跳转客户端界面的。 调用微信、支付宝等客户端完成支付的功能。 三方应用调用系统所带的地图软件。

示例:

接下来就以我之前写的UIActivityViewController系统原生分享-仿简书分享iOS开源小项目-WSL两个Demo为例,让我们看下怎么可以让UIActivityViewController系统原生分享-仿简书分享唤起iOS开源小项目-WSL并进行通信、分享:也就是说让 WSL 像微信、QQ、新浪一样支持第三方社交分享。

一、配置WSL的应用信息,添加Url Scheme

要跳转到别人的app,就要知道别人的app的跳转协议是什么,需要传入什么参数,如果我们希望别人打开我们的app,也需要在info.plist中配置跳转协议,然后再重写AppDelegate中的 openUrl方法来处理逻辑参数。

  • WSL 添加Url Scheme
    添加URL Scheme.png
  • 重写WSL中AppDelegate中的openUrl方法,当WSL被唤起时会执行openUrl方法,我们可以在方法里根据传入的参数的做出处理。如果只想允许在特定情况下才能被唤起,比如说分享,就可以对传入的openUrl加以验证,符合要求return YES ,否则返回NO。
/**
 iOS 9.0 以下
 */
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
    NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"URL scheme:%@", [url scheme]);
    NSLog(@"URL query: %@", [url query]);
    return YES;
}
/**
 iOS 9.0 之后
三方唤起本程序后执行的方法
 return YES 表示允许唤起本程序
 */
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options{  
    NSLog(@"URL scheme:%@", [url scheme]);
    //参数
    NSLog(@"URL host:%@", [url host]);
    UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"分享" message:[url host] delegate:self cancelButtonTitle:nil otherButtonTitles:@"分享完成", nil];
    [alertView show];
    return YES;
}                            
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
   //返回URL scheme = wsl123456的主应用
    NSURL * url = [NSURL URLWithString:@"wsl123456://success"];
    [[UIApplication sharedApplication] openURL:url options:nil completionHandler:^(BOOL success) {
    }];
}
  • 通过浏览器打开唤起WSL,测试一下,输入的地址是" WSLAPP://wslmeiksjkfdfkfkfhskfhskfhskj "(Url Scheme://+ 参数字符串),参数可以为空。
通过浏览器打开唤起WSL
二、在UIActivityViewController系统原生分享中添加事件,通过Url Scheme来唤起WSL,并传参
- (IBAction)shareToWSL:(id)sender {
    
    //不带参数
     NSString * wslUrlScheme = @"WSLAPP://";
    //如果参数含有特殊字符或汉字,需要转码,否则这个URL不合法,就会唤起失败;参数字符串的格式可以自定义,只要便于自己到时候解析就行
    NSString * parameterStr = [@"name=wsl&weight=保密" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    //不带参数
    //    NSURL * url = [NSURL URLWithString:wslScheme];
    //带参数
    //WSLAPP://name=wsl&weight=保密
    NSURL * url = [NSURL URLWithString:[wslUrlScheme stringByAppendingString:parameterStr]];
    
    //iOS 10以下
//    [[UIApplication sharedApplication] openURL:url];
    //iOS 10以上
    [[UIApplication sharedApplication] openURL:url options:nil completionHandler:^(BOOL success) {
    }];
}
三、唤起WSL之后需要做的处理

唤起WSL之后,WSL根据传入的参数进行界面数据的处理,处理完成之后,我们需要自动返回主应用UIActivityViewController系统原生分享,同时传递数据处理的结果。相当于WSL回调唤起UIActivityViewController系统原生分享,过程同一、二步。

给UIActivityViewController系统原生分享也添加Url Scheme
重写UIActivityViewController系统原生分享的openUrl方法

以上就是通过Url Scheme实现APP间相互跳转、传递数据、通信、分享功能的过程。

经过以上操作内容,小伙伴们是不是对其中的步骤有种似曾相识的感觉呢?没错,集成的第三方分享SDK就是通过这种方式来实现分享的,只不过它们把数据、方法都封装到了SDK中。

加油
赞个

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏進无尽的文章

基础篇-UIApplication、UIWindow以及程序的启动流程看我就够了

这篇文章主要介绍下有关UIApplication、UIWindow以及程序的启动流程,通过这篇文章,相信你会更加理解iOS 的应用启动过程以及app应用级别的相...

12920
来自专栏小蠢驴iOS专题

手把手教你使用Bugly收集线上崩溃信息

1.4K30
来自专栏iOS开发日记

iOS开发系列——第一个iOS程序和运行过程

这里我想强调一下,前面的知识是你日后开发IOS的基础,没有那些知识你开发IOS会很痛苦,现在很多开发人员做开发都是一知半解,程序质量确实令人担忧,所以还是希望大...

41560
来自专栏非典型技术宅

iOS四大对象之AppDelegate及UIApplicationMain函数/程序启动过程1. AppDelegate应用程序代理2. UIApplicationMain函数/程序启动过程

15850
来自专栏一“技”之长

iOS网络编程之五——请求回执类NSURLResponse属性简介

        NSURLResponse类中存放请求的回执信息,在发送网络请求时,如果请求成功,首先会接收到服务端的回执信息,直接开始接收具体的返回数据。NS...

8530
来自专栏哈雷彗星撞地球

SDWebImageV3.7.5源码解析

SDWebImage更新到如今这个版本,过程做了许多改进,性能已经非常的好了。以前就粗略的看过SDWebImage的源码,但是未做记录整理。再次阅读还是受益良多...

10130
来自专栏MixLab科技+设计实验室

设计师编程指南之Sketch插件开发 7 GUI

往期文章索引: 1 / 入门基本概念、page的相关操作 2 / artboard 、NSFileManager 和 NSString 关于文件及文件夹的相关操...

38540
来自专栏一“技”之长

Swift学习第二练——Swift项目时光电影

    很早以前的一个OC的练习项目,用swift重新写了一遍,因为xcode版本的更新对swift的兼容度也在不断改变,此版本适用于xcode6.1。

10150
来自专栏iOS开发攻城狮的集散地

Url Scheme实现APP间通信、分享

22250
来自专栏Rindew的iOS技术分享

iOS初步集成极光推送后你还要做这些事

37550

扫码关注云+社区

领取腾讯云代金券