前言
资源有限>_<。。。作为Android开发的我不得不操起了ios的板斧~ ,这篇文章算是学习篇吧。不对之处,多多包涵~ 欢迎指正
废话不多说,今天我们来实现IOS平台上从外部浏览器唤起本地cordova app的功能~
首先,ios浏览器唤起app的实现方式有多中:
- 1、通常的,通过自定义scheme唤起;
- 2、iOS9 官方推荐使用Universal Links 唤起。
【注意】:由于Universal Linkes是官方推出的,所以较自定义scheme唤起app有一定的优势,推荐使用。但是因为项目在Android平台使用了scheme的方式来进行唤起app的功能实现,为了平台的统一维护,因此ios暂时使用本方案实现,以后有可能技术更换,所以各位看官可以优先考虑Universal Linkes实现方案。
本文章暂时介绍custom scheme的实现方案,下面开始方案的具体实现:
具体实现
iOS中,通过URL Scheme进行浏览器唤起本地app,这个URL Scheme是你定义的协议,这个URL包含了app的URL Scheme,并且请求系统打开它,这样就实现了app的唤起。特别地,iOS9之后,新增了白名单概念,下面具体再讲。
* 注册自定义scheme
什么是URL Schemes?
URL Schemes是苹果给出的用来跳转到系统应用或者跳转到别人的应用的一种机制。同时还可以在应用之间传数据。
通过对比网页链接来理解 iOS 上的 URL Schemes,应该就容易多了。
URL Schemes 有两个单词:
* URL,我们都很清楚,[http://www.apple.com]
就是个 URL,我们也叫它链接或网址;
* Schemes,表示的是一个 URL 中的一个位置——最初始的位置,即 ://
之前的那段字符。比如 [http://www.apple.com]
这个网址的 Schemes是 http。
根据我们上面对 URL Schemes 的使用,我们可以很轻易地理解,在以本地应用为主的 iOS 上,我们可以像定位一个网页一样,
用一种特殊的 URL 来定位一个应用甚至应用里某个具体的功能。而定位这个应用的,就应该是这个应用的 URL 的 Schemes 部分,
也就是开头儿那部分。
步骤:选中项目-->TARGETS-->Info-->在URL Scheme添加你的自定义scheme,可以添加多个。。。
- image.png
注册完成,build项目,此时项目的info.plist文件如下(也可在此处注册scheme,效果相同):
-
image.png
注 : URL Scheme就是自定义的协议,稍后通过它实现唤起app的功能,打开注册scheme的APP格式为: URL Scheme://URL identifier,直接调用URL Scheme也可打开程序, URL identifier是可选的。
代理回调,传递数据
例如:url为 https://www.baidu.com/s?ie=UTF-8&wd=ios#/home
* https就是协议,也就是scheme
* www.baidu.com 是域名
* /s是路径
* ?后面的是query,也就是查询参数。这个url有两个参数,分别是`ie=UTF-8`和`wd=ios`
* #后面的是fragment,也就是带的额外碎片信息。
在App的AppDelegate.m中,实现application: openURL:(NSURL *)url sourceApplication: annotation:回调
/**
*拦截来自网页的自定义scheme URL,唤起指定页面
* test:///?page=/index.html#/home
*/
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//判断scheme
if([url.scheme isEqualToString:@"test"] != NSNotFound){
//判断是否需要跳转到指定页面
if([url query]){
//获取指定页面12
NSString *fragment = [url fragment];
self.viewController.startPage = [@"index.html#" stringByAppendingString:fragment];
NSURL *url = [self.viewController performSelector:@selector(appUrl)];
if (url)
{
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
[((CDVViewController *)self.viewController).webViewEngine loadRequest:request];
}
}
}
return YES;
}
完整的url信息都传过来了,我们就可以利用这个url里面的路径和参数等信息了,想干嘛就干嘛。这就实现了从浏览器向App传递数据了或打开指定页面了。
这里我们通过获取url携带的指定页,后通过拼接[@"index.html#" stringByAppendingString:fragment];将指定的启动页赋值给viewController.startPage。创建NSURLRequest传入启动url,通过loadRequest启动。
//获取指定页面12
NSString *fragment = [url fragment];
self.viewController.startPage = [@"index.html#" stringByAppendingString:fragment];
NSURL *url = [self.viewController performSelector:@selector(appUrl)];
if (url)
{
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
[((CDVViewController *)self.viewController).webViewEngine loadRequest:request];
}
-
在浏览器中输入注册的scheme
image.png -
确定
image.png -
点击Open,成功打开我的页面
我的
备注:
苹果一共给了3个openURL的回调。
分别是:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can't open for some reason
为什么会有3个呢?这3个回调又有什么区别?(为方面讲解,分别设置ABC3个回调)
3个回调的功能基本一样,都是在别人通过URL Schemes打开应用的时候会执行的。
不同之处:
A回调是在iOS2.0的时候推出的,参数只有url。
B回到是在iOS4.2的时候推出的,参数有url sourceApplication annotation.
C回调是iOS9.0的时候推出的,参数有url options。options有下面几个key
// Keys for application:openURL:options:
// value is an NSString containing the bundle ID of the originating application
UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsSourceApplicationKey NS_AVAILABLE_IOS(9_0);
// value is a property-list typed object corresponding to what the originating application passed in UIDocumentInteractionController's annotation property
UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsAnnotationKey NS_AVAILABLE_IOS(9_0);
// value is a bool NSNumber, set to YES if the file needs to be copied before use
UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsOpenInPlaceKey NS_AVAILABLE_IOS(9_0);
这几个回调是有优先级的。C>B>A。也就是说,如果你3个回调都实现了,那么程序只会执行C回调。其他回调是不会执行的。(当然,iOS9以下只会执行B回调)。
References :
【iOS开发】 Universal Links(通用链接)
【iOS开发】打开另一个APP(URL Scheme与openURL)
网友评论