Cordova IOS平台开发(custom scheme url在外部浏览器唤起本地应用)

前言

资源有限>_<。。。作为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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容