Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Objective C在iOS中创建自定义URL方案_Ios_Objective C_Url_Url Scheme - Fatal编程技术网

使用Objective C在iOS中创建自定义URL方案

使用Objective C在iOS中创建自定义URL方案,ios,objective-c,url,url-scheme,Ios,Objective C,Url,Url Scheme,我在定制的网址方案工作基本上我是新的与我们的功能 我以前做过什么? 我成功地实现了这一点,现在当我在safari上点击这个url时,我创建了一个简单的url“myApp”(myApp://)来启动我的应用程序 我的代码 我用过: - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)an

我在定制的网址方案工作基本上我是新的与我们的功能

我以前做过什么? 我成功地实现了这一点,现在当我在safari上点击这个url时,我创建了一个简单的url“myApp”(myApp://)来启动我的应用程序

我的代码 我用过:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
我想要什么?
  • 基本上,我想实现两件事:
  • 当用户点击safari上的链接时,如果设备上安装了应用程序,则应用程序应通过该链接启动。这一点我已成功完成。
  • 第二点,我还不能做,在尝试了很多之后,但是我还没有找到任何解决方案,那就是:
  • 如果设备上未安装应用程序,则链接应重定向到app store,用户可以在那里安装应用程序。

如果可能的话,请告诉我如何做,请向我提供任何链接、示例或您的答案也可以帮助我。提前感谢

您所描述的内容称为深度链接。这是一个非常常见的应用程序功能来实现-大多数应用程序都有它-从概念上讲,它似乎是一件容易构建的事情。然而,正确的判断很复杂,而且有很多边缘情况

您基本上需要完成两件事:

  • 如果安装了应用程序:打开应用程序并将用户路由到其中的正确内容
  • 如果未安装应用程序:将用户转发到应用程序商店,以便下载。理想情况下,下载后还可以将用户路由到应用程序内的正确内容(这称为“延迟深度链接”)
  • 虽然不是必需的,但您可能还希望跟踪所有这些活动,以便查看哪些活动有效

    如果应用程序已安装 您现有的自定义URI方案属于此类别。然而,苹果认为定制URI方案不是一项好技术,因此不推荐使用iOS9,而支持使用

    苹果在这方面是正确的。自定义URI方案有许多问题,但其中最大的问题是:

    • 如果未安装应用程序,则没有回退。事实上,你得到了一个错误
    • 它们通常不会被识别为用户可以单击的链接
    为了解决这些问题,以前可以使用常规的
    http://
    链接,然后在目标页面上插入重定向,将用户转发到自定义URI方案,从而打开应用程序。如果重定向失败,那么您可以无缝地将用户重定向到应用商店。这是苹果在iOS 9中打破的部分,以推动通用链接的采用

    通用链接是更好的用户体验,因为默认情况下它们是
    http://
    链接,可以避免严重错误。然而,它们很难建立和使用

    为了确保用户在安装应用程序后进入应用程序,您需要同时支持通用链接和自定义URI方案,即使如此,仍有许多边缘情况,如和,需要特殊处理

    如果应用程序未安装 在这种情况下,用户最终将访问您的
    http://
    回退URL。此时,您有两个选项:

  • 立即将用户直接转发到应用商店
  • 将用户发送到您的移动网站(然后使用类似于a的方式让他们可以选择进入应用商店)
  • 大多数大品牌更喜欢第二种选择。小型应用程序通常采用第一种方法,尤其是在没有网站的情况下

    要将用户转发到应用商店,可以使用如下Javascript重定向:

    <script type="text/javascript">
      window.onload = function() {
        window.location = "https://itunes.apple.com/app/id1121012049";
      };
    </script>
    
    
    window.onload=函数(){
    window.location=”https://itunes.apple.com/app/id1121012049";
    };
    
    直到最近,还可以使用HTTP重定向来提高速度,但是,这不再有效

    延迟深度链接 不幸的是,无论是在iOS还是Android上,都没有本地的方法来完成这最后一部分。要实现这一点,您需要一个远程服务器来关闭循环。你可以,但你真的不应该,因为很多原因,尤其是你有更重要的事情要做

    底线 深度链接非常复杂。如今,大多数应用程序都不会试图通过构建内部系统来进行设置。免费托管的深度链接服务,如(完全公开:我与它们一起工作,它们太棒了)和Firebase Dynamic Links可以为您处理所有这些,并确保您始终掌握最新标准和边缘案例


    请参阅我制作的视频概述,了解您需要了解的所有信息

    在AppDelegate.m中称之为:

    -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options;{
        NSLog(@"url recieved: %@", url);
        NSLog(@"query string: %@", [url query]);
        NSLog(@"host: %@", [url host]);
        NSLog(@"url path: %@", [url path]);
        NSDictionary *dict = [self parseQueryString:[url query]];
        NSLog(@"query dict: %@", dict);
        if ([[url host] isEqualToString:@"login"]) {
            [self setupHomeScreen:NO type:@"" entityId:@""];
            [self _endSession];
            return YES;
        } else if ([[url host] isEqualToString:@"smartoffice"]) {
    
            NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
            NSRange needle = [url.absoluteString rangeOfString:@"?" options:NSCaseInsensitiveSearch];
            NSString *data = nil;
    
            if(needle.location != NSNotFound) {
                NSUInteger start = needle.location + 1;
                NSUInteger end = [url.absoluteString length] - start;
                data = [url.absoluteString substringWithRange:NSMakeRange(start, end)];
            }
    
            for (NSString *param in [data componentsSeparatedByString:@"&"]) {
                NSArray *keyvalue = [param componentsSeparatedByString:@"="];
                if([keyvalue count] == 2){
                    [result setObject:[keyvalue objectAtIndex:1] forKey:[keyvalue objectAtIndex:0]];
                }
            }
            NSString *entityID = ([result objectForKey:@"secondparameter"]);
            NSString *type = [result objectForKey:@"parameter"];
            [self setupHomeScreen:YES type:type entityId:entityID];
            //[self setupHomeScreen:YES type:@"TASK" entityId:@"160315"];
            return result;
        } else {
            NSLog(@"myApp is not installed");
            [self setupHomeScreen:NO type:@"0" entityId:@"0"];
        }
        return NO;
    }
    
    -(BOOL)应用程序:(UIApplication*)应用程序openURL:(NSURL*)url选项:(NSDictionary*)选项;{
    NSLog(@“接收的url:%@”,url);
    NSLog(@“查询字符串:%@,[url查询]);
    NSLog(@“主机:%@,[url主机]);
    NSLog(@“url路径:%@,[url路径]);
    NSDictionary*dict=[self-parseQueryString:[url-query]];
    NSLog(@“查询目录:%@”,目录);
    如果([[url主机]IsequalString:@“登录”]){
    [自设置主屏幕:无类型:@“entityId:@]”;
    [self_endSession];
    返回YES;
    }else if([[url主机]IsequalString:@“smartoffice”]){
    NSMutableDictionary*result=[[NSMutableDictionary alloc]init];
    NSRange needle=[url.absoluteString rangeOfString:@“?”选项:NSCaseInsensitiveSearch];
    NSString*数据=nil;
    if(针位置!=NSNotFound){
    NSU整数开始=针位置+1;
    NSUInteger end=[url.absoluteString length]-开始;
    数据=[url.absoluteString substringWithRange:NSMakeRange(开始,结束)];
    }
    for(在[data componentsSeparatedByString:@“&”]中的NSString*参数){
    NSArray*keyvalue=[param componentsSeparatedByString:@“=”];
    如果([k