使用Objective C在iOS中创建自定义URL方案
我在定制的网址方案工作基本上我是新的与我们的功能 我以前做过什么? 我成功地实现了这一点,现在当我在safari上点击这个url时,我创建了一个简单的url“myApp”(myApp://)来启动我的应用程序 我的代码 我用过:使用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
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
我想要什么?
- 基本上,我想实现两件事:
- 当用户点击safari上的链接时,如果设备上安装了应用程序,则应用程序应通过该链接启动。这一点我已成功完成。
- 第二点,我还不能做,在尝试了很多之后,但是我还没有找到任何解决方案,那就是:
- 如果设备上未安装应用程序,则链接应重定向到app store,用户可以在那里安装应用程序。
如果可能的话,请告诉我如何做,请向我提供任何链接、示例或您的答案也可以帮助我。提前感谢您所描述的内容称为深度链接。这是一个非常常见的应用程序功能来实现-大多数应用程序都有它-从概念上讲,它似乎是一件容易构建的事情。然而,正确的判断很复杂,而且有很多边缘情况 您基本上需要完成两件事:
- 如果未安装应用程序,则没有回退。事实上,你得到了一个错误
- 它们通常不会被识别为用户可以单击的链接
http://
链接,然后在目标页面上插入重定向,将用户转发到自定义URI方案,从而打开应用程序。如果重定向失败,那么您可以无缝地将用户重定向到应用商店。这是苹果在iOS 9中打破的部分,以推动通用链接的采用
通用链接是更好的用户体验,因为默认情况下它们是http://
链接,可以避免严重错误。然而,它们很难建立和使用
为了确保用户在安装应用程序后进入应用程序,您需要同时支持通用链接和自定义URI方案,即使如此,仍有许多边缘情况,如和,需要特殊处理
如果应用程序未安装
在这种情况下,用户最终将访问您的http://
回退URL。此时,您有两个选项:
<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