通过注册的URL Scheme向目标APP传递参数
2015-11-30 11:25
323 查看
http://www.superqq.com/blog/2015/07/15/tong-guo-url-schemechuan-di-can-shu/
通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义URL来传递参数了。
昨天我们在AppDelegate调用了UIApplicationDelegate的代理方法:
我们来看看苹果给这个方法的注释:
这个方法在未来将被废弃,可以用application:openURL:sourceApplication:annotation:来代替。
昨天我们在iOSStrongDemo注册的URL
Scheme还记得是什么吗?你应该还有印象的就是iOS开发的ID:iOSDevTip。
假设我们想要传递两个参数分别是名字name和手机号phone,格式如下:
有没有似曾相识的感觉。我们用get方式请求一个接口是不是就是这样的。
当APP被启动是,会调用代理方法application:openURL:sourceApplication:annotation:。参数URL就是启动APP的URL,参数sourceApplication就是来源APP的Bundle ID。
我们依然通过Safari来测试,在Safari的地址栏中输入:iOSDevTip://?name=ligang&phone=13888888888
即可打开APP,看看参数是否传递过来:
最后我们看一下打印:
sourceApplication打印出来是com.apple.mobilesafari,从这里可以看出来,是从Safari启动我们的APP的。
我们虽然自定义了URL Scheme,但是我们不能阻止别人通过自定义的URL Scheme来打开我们的应用。怎么解决呢?
我们可以指定相应的sourceApplication,也就是相应的Bundle ID,通过Bundle ID来决定是否可以打开我们的APP:
这样我们就可以通过Bundle ID来决定是否允许打开我们的APP,demo下载地址:iOSStrongDemo
通过注册的URL Scheme向目标APP传递参数
通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义URL来传递参数了。昨天我们在AppDelegate调用了UIApplicationDelegate的代理方法:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url { // 接受传过来的参数 NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦" message:text delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES; }
我们来看看苹果给这个方法的注释:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url; // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
这个方法在未来将被废弃,可以用application:openURL:sourceApplication:annotation:来代替。
URL传参格式
昨天我们在iOSStrongDemo注册的URLScheme还记得是什么吗?你应该还有印象的就是iOS开发的ID:iOSDevTip。
假设我们想要传递两个参数分别是名字name和手机号phone,格式如下:
iOSDevTip://?name=ligang&phone=13888888888
有没有似曾相识的感觉。我们用get方式请求一个接口是不是就是这样的。
被启动的APP处理传过来的参数
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSLog(@"sourceApplication: %@", sourceApplication); NSLog(@"URL scheme:%@", [url scheme]); NSLog(@"URL query: %@", [url query]); // 接受传过来的参数 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦" message:[url query] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES; }
当APP被启动是,会调用代理方法application:openURL:sourceApplication:annotation:。参数URL就是启动APP的URL,参数sourceApplication就是来源APP的Bundle ID。
我们依然通过Safari来测试,在Safari的地址栏中输入:iOSDevTip://?name=ligang&phone=13888888888
即可打开APP,看看参数是否传递过来:
最后我们看一下打印:
2015-07-15 22:38:25.655 iOSStrongDemo[9983:2894855] sourceApplication: com.apple.mobilesafari 2015-07-15 22:38:28.664 iOSStrongDemo[9983:2894855] URL scheme:iosdevtip 2015-07-15 22:38:28.665 iOSStrongDemo[9983:2894855] URL query: name=ligang&phone=13888888888
sourceApplication打印出来是com.apple.mobilesafari,从这里可以看出来,是从Safari启动我们的APP的。
我们虽然自定义了URL Scheme,但是我们不能阻止别人通过自定义的URL Scheme来打开我们的应用。怎么解决呢?
我们可以指定相应的sourceApplication,也就是相应的Bundle ID,通过Bundle ID来决定是否可以打开我们的APP:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSLog(@"sourceApplication: %@", sourceApplication); NSLog(@"URL scheme:%@", [url scheme]); NSLog(@"URL query: %@", [url query]); if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"]){ // 接受传过来的参数 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦" message:[url query] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES; }else{ return NO; } }
这样我们就可以通过Bundle ID来决定是否允许打开我们的APP,demo下载地址:iOSStrongDemo
相关文章推荐
- RAD Studio 10 免费培训之自定义 ListView 的 Appearance——讲义及范例程序下载
- iOS图片编辑(CIFilter)
- iOS 如何通过 找到QQ 微信 支付宝等常用App的 URl schemes
- Swift UIview的 层次交换 和部分动画的详解
- ios 开发日记 23 - Reveal使用步骤
- Android Studo 使用 JNI报错:java.lang.UnsatisfiedLinkError: Couldn't load XXX from loader dalvik.system.PathClassLoader
- iOS URL Scheme 使用详解
- Android intent常见应用总结
- Nagios监控ActiveMQ插件开发和部署注意事项
- Uni2D 学习
- 移动端-K线图-开发
- android studio更改包名
- iOS获取设备型号、设备类型等信息
- 基于js实现微信发送好友如何分享到朋友圈、微博
- android 中关于Phone的ACTION_CALL、ACTION_CALL_PRIVILEGED、ACTION_DIAL的区别
- Android Exception:错误:非法字符:\65279
- android学习笔记:layer-list
- Unity3d学习11
- Android-Android API 版本判断
- 安全高效多渠道打包App