配色: 字号:
iOS保存App中的照片到系统相册或自建相册的方法
2016-12-05 | 阅:  转:  |  分享 
  
iOS中使用URLScheme进行App跳转的教程

这篇文章主要介绍了iOS中使用URLScheme进行App跳转的教程,比如在应用内提示安装另一个应用时就以url打开safari然后打开appstore那样,需要的朋友可以参考下

URLScheme的作用

我们都知道苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URLScheme,URLScheme是为方便app之间互相调用而设计的。我们可以通过系统的OpenURL来打开该app,并可以传递一些参数。

例如:你在Safari里输入www.alipay.com,就可以直接打开你的支付宝app,前提是你的手机装了支付宝。如果你没有装支付宝,应该显示的是支付宝下载界面,点击会跳到AppStore的支付宝下载界面。

URLScheme必须能唯一标识一个APP,如果你设置的URLScheme与别的APP的URLScheme冲突时,你的APP不一定会被启动起来。因为当你的APP在安装的时候,系统里面已经注册了你的URLScheme。

一般情况下,是会调用先安装的app。但是iOS的系统app的URLScheme肯定是最高的。所以我们定义URLScheme的时候,尽量避开系统app已经定义过的URLScheme。

注册URLScheme

1.在info.plist里添加URLtypes

每一个项目里面都会有一个info.plist配置文件。找到info.plist,右键选择AddRow,然后选择URLtypes。如图所示:



2.添加URLSchemes

添加完URLtypes,点击展开。右键选择AddRow,添加URLSchemes:3.设置URLSchemes

设置URLSchemes为iOSDevTip



4.设置URLIdentifier

URLIdentifier是自定义的URLscheme的名字,一般采用反转域名的方法保证该名字的唯一性,比如com.iOSStrongDemo.www



添加成功启动提示

为了方便测试,我们在AppDelegate里面添加一个UIAlertView,当app被成功打开时,会提出提示:

复制代码代码如下:

-(BOOL)application:(UIApplication)applicationhandleOpenURL:(NSURL)url{//接受传过来的参数NSStringtext=[[urlhost]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];UIAlertViewalertView=[[UIAlertViewalloc]initWithTitle:@"打开啦"message:textdelegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];[alertViewshow];returnYES;}

Safari启动自定义的URLSchemesAPP

既然已经配置好URLSchemes,那么我们可以来款速测试一下,我们设置的URLSchemes是否有效。打开Safari,在地址栏里输入:iOSDevTip://



果然成功打开:



也可以在地址栏中输入:iOSDevTip://com.iOSStrongDemo.www。也是可以打开注册了URLSchemes的APP的。

通过另一个APP启动注册了URLSchemes的APP

复制代码代码如下:

NSStringurl=@"iOSDevTip://";//NSStringurl=@"iOSDevTip://com.iOSStrongDemo.www";if([[UIApplicationsharedApplication]canOpenURL:[NSURLURLWithString:url]]){[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:url]];}else{NSLog(@"cannotopenURLschemeiOSDevTip");}

打开注册iOSDevTip的APP格式为:URLScheme://URLidentifier,直接调用URLScheme也可打开程序,URLidentifier是可选的。

通过注册的URLScheme向目标APP传递参数

通过URLScheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URLScheme自定义URL来传递参数了。

昨天我们在AppDelegate调用了UIApplicationDelegate的代理方法:

复制代码代码如下:

-(BOOL)application:(UIApplication)applicationhandleOpenURL:(NSURL)url{//接受传过来的参数NSStringtext=[[urlhost]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];UIAlertViewalertView=[[UIAlertViewalloc]initWithTitle:@"打开啦"message:textdelegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];[alertViewshow];returnYES;}

我们来看看苹果给这个方法的注释:

复制代码代码如下:

-(BOOL)application:(UIApplication)applicationhandleOpenURL:(NSURL)url;//Willbedeprecatedatsomepoint,pleasereplacewithapplication:openURL:sourceApplication:annotation:

这个方法在未来将被废弃,可以用application:openURL:sourceApplication:annotation:来代替。

URL传参格式

昨天我们在iOSStrongDemo注册的URLScheme还记得是什么吗?你应该还有印象的就是iOS开发的ID:iOSDevTip。

假设我们想要传递两个参数分别是名字name和手机号phone,格式如下:

有没有似曾相识的感觉。我们用get方式请求一个接口是不是就是这样的。

被启动的APP处理传过来的参数

复制代码代码如下:

-(BOOL)application:(UIApplication)applicationopenURL:(NSURL)urlsourceApplication:(NSString)sourceApplicationannotation:(id)annowww.visa158.comtation{NSLog(@"sourceApplication:%@",sourceApplication);NSLog(@"URLscheme:%@",[urlscheme]);NSLog(@"URLquery:%@",[urlquery]);

//接受传过来的参数UIAlertViewalertView=[[UIAlertViewalloc]initWithTitle:@"打开啦"message:[urlquery]delegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];[alertViewshow];

returnYES;}

当APP被启动是,会调用代理方法application:openURL:sourceApplication:annotation:。参数URL就是启动APP的URL,参数sourceApplication就是来源APP的BundleID。

我们依然通过Safari来测试,在Safari的地址栏中输入:iOSDevTip://?name=ligang&phone=13888888888



即可打开APP,看看参数是否传递过来:



最后我们看一下打印:

1

2

3 2015-07-1522:38:25.655iOSStrongDemo[9983:2894855]sourceApplication:com.apple.www.hunanwang.netmobilesafari

2015-07-1522:38:28.664iOSStrongDemo[9983:2894855]URLscheme:iosdevtip

2015-07-1522:38:28.665iOSStrongDemo[9983:2894855]URLquery:name=ligang&phone=13888888888 sourceApplication打印出来是com.apple.mobilesafari,从这里可以看出来,是从Safari启动我们的APP的。

我们虽然自定义了URLScheme,但是我们不能阻止别人通过自定义的URLScheme来打开我们的应用。怎么解决呢?

我们可以指定相应的sourceApplication,也就是相应的BundleID,通过BundleID来决定是否可以打开我们的APP:

复制代码代码如下:

-(BOOL)application:(UIApplication)applicationopenURL:(NSURL)urlsourceApplication:(NSString)sourceApplicationannotation:(id)annotation{NSLog(@"sourceApplication:%@",sourceApplication);NSLog(@"URLscheme:%@",[urlscheme]);NSLog(@"URLquery:%@",[urlquery]);

if([sourceApplicationisEqualToString:@"com.3Sixty.CallCustomURL"]){//接受传过来的参数UIAlertViewalertView=[[UIAlertViewalloc]initWithTitle:@"打开啦"message:[urlquery]delegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];[alertViewshow];

returnYES;}else{returnNO;}

}

这样我们就可以通过BundleID来决定是否允许打开我们的APP。























献花(0)
+1
(本文系白狐一梦首藏)