【iOS开发】打开另一个APP(URL Scheme与openURL)

阅读:344 2019-03-19 14:43:18 来源:新网

平常我们做ios开发,会经常遇到打开其他的app的功能。本篇文章讲的就是打开别人的app的一些知识。我们的目标是:

建立一个workspace来存放我们的工程

建立一个名为myapp的ios工程。这个myapp是“我的app”,用来打开另一个app的。添加工程到我们刚才创建的openapp.xcworkspace。并且在工程的main.storyboard添加一个button,待会儿我们会用来写方法。

myapp工程

建立一个名为wxapp的ios工程。这个工程是我们模拟的“微信app”,是被人打开的那个app。为了区分两个应用,我们在main.storyboard上加一个label,“我是微信app”。

在workspace建立wxapp工程

wxapp

好了,准备工作就这么简单。

想要打开别人的app或者让别人打开我们的app,那就需要通过urlschemes了。

urlschemes是苹果给出的用来跳转到系统应用或者跳转到别人的应用的一种机制。同时还可以在应用之间传数据。

通过对比网页链接来理解ios上的urlschemes,应该就容易多了。urlschemes有两个单词:

为了能让别的app(包括我们刚才创建的myapp)能够打开wxapp,我们需要为wxapp添加一个urlschemes。步骤:选中wxapp工程->info->urltypes->点击“+”->在urlschemes栏填上weixin

添加一个urlschemes

备注:一个应用是可以有多个urlschemes的。你可以再次点击“+”来添加一个urlschemes

我们看看info.plist文件里面是怎样的。

info.plist文件里面的urlschemes

然后我们run一下wxapp。(注意一下你run的target是哪个)

在模拟器run一下wxapp

这样,wxapp就向系统“注册”了一个urlschemes,其他的应用可以通过openurl:方法来打开wxapp了。

现在我们在myapp里面打开wxapp。方法非常简单。在viewcontroller里面添加一个方法

-(ibaction)openwxapp:(uibutton*)sender{[selfdemo1];}-(void)demo1{//创建一个url,这个url就是wxapp的url,记得加上://nsurl*url=[nsurlurlwithstring:@"weixin://"];//打开url[[uiapplicationsharedapplication]openurl:url];}

然后run一下myapp

runmyapp

运行了之后点击“打开微信”button,会弹出“myapp”想要打开“wxapp”提示框,点确认之后就可以跳转到wxapp了。

点击“打开微信”button

打开了wxapp

ios9之后,在一个应用跳转到了另一个应用之后,左上角会有个返回到上一个应用的按钮。这样,我们在myapp里面点击“打开微信”按钮,跳转到wxapp之后,再点击“backtomyapp”,又回到myapp了。闲着无聊就可以反复点击这两个按钮来两个应用间跳转了,哈哈。

值得一说的是,这个urlschemes并不是唯一的。也就是说,多个应用之间设置的urlschemes是可以相同的。那么问题来了,假如两个应用的urlschemes相同的话,使用openurl:方法会打开哪个应用呢?楼主亲自用手机试了一下。步骤是:

没错,注册了urlschemes的应用,用safari浏览器也是可以打开的。我就经常用这个来验证应用是否设置了我想要的urlschemes在safari打开wxapp,直接在safari的地址栏输入weixin://,enter就可以打开了

用safari打开wxapp

用safari打开wxapp

-(ibaction)openwxapp:(uibutton*)sender{//[selfdemo1];[selfdemo2];}//先判断再打开wxapp-(void)demo2{//创建一个url,这个url就是wxapp的url,记得加上://nsurl*url=[nsurlurlwithstring:@"weixin://"];//先判断是否能打开该urlif([[uiapplicationsharedapplication]canopenurl:url]){//打开url[[uiapplicationsharedapplication]openurl:url];}else{//给个提示或者做点别的事情nslog(@"u四不四洒,没安装wxapp,怎么打开啊!");}

但是我们发现用了canopenurl:方法之后,并没有如我们想像中打开了wxapp。一看,xcode控制台提示:

xcode控制台错误提示

为什么会这样呢?因为ios9的时候苹果加强了权限,只有在info.plist文件中加入了urlschemes白名单才能使用canopenurl:方法来判断是否能打开该url。该白名单的上限是50个。也就是说,你最多只能使用canopenurl:方法判断50个urlschemes。当然,平常我们都用不了那么多,就算是集成分享功能,50个肯定够了。

备注:只是对canopenurl:方法有限制,openurl:方法是没有限制的。

言归正传,我们需要在myapp的info.plist里面将weixin设置为白名单。步骤:点击info.plist->右键->openas->sourcecode->添加下面的代码

lsapplicationqueriesschemesweixin

这样就可以了。

urlschemes除了可以用来打开app之外,还可以用来在两个app之间传递少量的数据。在百度上搜索“ios”,会生成一个url,下面来以这个url来大概介绍url的组成。

url为:https://www.baidu.com/s?ie=utf-8&wd=ios

我们ios的urlschemes中也是差不多的。而且,在openurl的时候,如果url中带有参数,只要urlschemes是正确的,那同样可以打开app,而且,后面的参数也会带到我们打开的app那里。咱们做个demo就一目了然了。在myapp中,写个demo3方法,url为weixin://www.shixueqian.com/abc?title=hello&content=helloworld

-(ibaction)openwxapp:(uibutton*)sender{//[selfdemo1];//[selfdemo2];[selfdemo3];}//使用urlschemes传递数据-(void)demo3{//创建一个url,这个url就是wxapp的url,记得加上://nsurl*url=[nsurlurlwithstring:@"weixin://www.shixueqian.com/abc?title=hello&content=helloworld"];//打开url[[uiapplicationsharedapplication]openurl:url];}

在wxapp的appdelegate.m中,实现application:openurl:(nsurl*)urlsourceapplication:annotation:回调

-(bool)application:(uiapplication*)applicationopenurl:(nsurl*)urlsourceapplication:(nsstring*)sourceapplicationannotation:(id)annotation{nslog(@"url=====%@nsourceapplication=======%@nannotation======%@",url,sourceapplication,annotation);returnyes;}

run了之后,我们发现,我们依旧可以通过点击openurl:方法打开wxapp。而且在wxapp被打开的时候,会执行application:openurl:(nsurl*)urlsourceapplication:annotation:回调方法。在这个回调方法中,我们可以得到myapp传过来的url等信息。控制台打印如下:

log结果

完整的url信息都传过来了,我们就可以利用这个url里面的路径和参数等信息了,想干嘛就干嘛。这就实现了从myapp向wxapp传递数据了。

备注:苹果一共给了3个openurl的回调。分别是:

-(bool)application:(uiapplication*)applicationhandleopenurl:(nsurl*)urlns_deprecated_ios(2_0,9_0,"pleaseuseapplication:openurl:options:")__tvos_prohibited;-(bool)application:(uiapplication*)applicationopenurl:(nsurl*)urlsourceapplication:(nullablensstring*)sourceapplicationannotation:(id)annotationns_deprecated_ios(4_2,9_0,"pleaseuseapplication:openurl:options:")__tvos_prohibited;-(bool)application:(uiapplication*)appopenurl:(nsurl*)urloptions:(nsdictionary*)optionsns_available_ios(9_0);//noequiv.notification.returnnoiftheapplicationcan'topenforsomereason

为什么会有3个呢?这3个回调又有什么区别?(为方面讲解,分别设置abc3个回调)

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服