我知道可以通过注册自定义方案(例如so://)直接链接到iOS中的应用程序,也可以通过iTunes链接到appstore中的应用程序。
在许多情况下,理想的流程是提供一个链接,如果安装了该应用程序,则重定向到该应用程序;如果未安装,则重定向到该商店。这可能吗?如果可以,怎么办?
为了清楚起见,添加的场景是我正在打开iPhone上电子邮件的链接(http),邀请我加入应用程序中的组。如果用户在该设备上安装了该应用程序,则应打开该应用程序,否则http链接应重定向到iTunes。
我知道可以通过注册自定义方案(例如so://)直接链接到iOS中的应用程序,也可以通过iTunes链接到appstore中的应用程序。
在许多情况下,理想的流程是提供一个链接,如果安装了该应用程序,则重定向到该应用程序;如果未安装,则重定向到该商店。这可能吗?如果可以,怎么办?
为了清楚起见,添加的场景是我正在打开iPhone上电子邮件的链接(http),邀请我加入应用程序中的组。如果用户在该设备上安装了该应用程序,则应打开该应用程序,否则http链接应重定向到iTunes。
Answers:
没有办法检查这一点。但是,有一个不错的解决方法。
这个想法基本上是这样的:
最后2个步骤在此SO帖子中进行了解释
我认为更简单的答案是使用以下JavaScript在服务器上设置页面:
(function() {
var app = {
launchApp: function() {
window.location.replace("myapp://");
this.timer = setTimeout(this.openWebApp, 1000);
},
openWebApp: function() {
window.location.replace("http://itunesstorelink/");
}
};
app.launchApp();
})();
这基本上是尝试重定向到您的应用程序,并设置超时以在失败时重定向到应用程序商店。
您甚至可以使代码更加智能,并检查用户代理以查看他们是ios用户,android用户还是web用户,然后适当地重定向它们。
如果你有一个网页,你的电子邮件链接到包含一个网页iframe
与src
设置,为您的应用程序自定义方案,,iOS将自动重定向到在App该位置。如果未安装该应用程序,则不会发生任何事情。这使您可以深度链接到已安装的应用程序(如果未安装),或重定向到应用程序商店(如果未安装)。
例如,如果您安装了twitter应用程序,并导航到包含以下标记的网页,则会立即将您定向到该应用程序。如果您尚未安装Twitter应用程序,则会看到“未安装Twitter应用程序”文本。
<!DOCTYPE html>
<html>
<head>
<title>iOS Automatic Deep Linking</title>
</head>
<body>
<iframe src="twitter://" width="0" height="0"></iframe>
<p>The Twitter App is not installed</p>
</body>
</html>
如果没有安装应用程序,这是一个更彻底的示例,它重定向到应用程序商店:
<!DOCTYPE html>
<html>
<head>
<title>iOS Automatic Deep Linking</title>
<script src='//code.jquery.com/jquery-1.11.2.min.js'></script>
<script src='//mobileesp.googlecode.com/svn/JavaScript/mdetect.js'></script>
<script>
(function ($, MobileEsp) {
// On document ready, redirect to the App on the App store.
$(function () {
if (typeof MobileEsp.DetectIos !== 'undefined' && MobileEsp.DetectIos()) {
// Add an iframe to twitter://, and then an iframe for the app store
// link. If the first fails to redirect to the Twitter app, the
// second will redirect to the app on the App Store. We use jQuery
// to add this after the document is fully loaded, so if the user
// comes back to the browser, they see the content they expect.
$('body').append('<iframe class="twitter-detect" src="twitter://" />')
.append('<iframe class="twitter-detect" src="itms-apps://itunes.com/apps/twitter" />');
}
});
})(jQuery, MobileEsp);
</script>
<style type="text/css">
.twitter-detect {
display: none;
}
</style>
</head>
<body>
<p>Website content.</p>
</body>
</html>
“智能应用横幅”-不确定它们何时显示,但是在找到此帖子后寻找相同的内容,然后是智能应用横幅,这是后续的。
Smart App Banners是您要通过网络体验向应用程序提供的每个页面的页眉中的一行html meta标签:
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
会在页面顶部显示该图标,并在其中显示“打开此页面”以及应用程序或路由到应用程序商店。
iPhone上此页面的元数据看起来像这样(当然是匿名的):
<meta name="apple-itunes-app" content="app-id=605841731, app-argument=lync://confjoin?url=https://meet.rtc.yourcorporatedomain.com/firstName.lastName/conferenceID">
是的,这很容易。这要求您要打开的应用程序具有在plist中声明的url方案:
//if you can open your app
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"yourapp://"]])
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"yourapp://"]];
}
else
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"ituneappstorelink"]];
}
只需几个简单的步骤即可完成此操作
第1步
转到->项目(选择目标)->信息-> URL类型
像这样在Xcode中创建URL方案
这里的URL Scheme是myApp(最好所有字符都小写)。
第2步
如果您打算从URL接收参数/查询字符串,则进行安装委托
这是代码:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
NSLog(@"APP : simple action %@",url.scheme);
if ([url.scheme hasPrefix:@"myapp"]) {
NSLog(@"APP inside simple %@",url.absoluteString);
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url
resolvingAgainstBaseURL:NO];
NSArray *queryItems = urlComponents.queryItems;
NSString * abc = [self valueForKey:@"abc"
fromQueryItems:queryItems];
NSString * xyz = [self valueForKey:@"xyz"
fromQueryItems:queryItems];
NSLog(@"Sid up = %@", abc);
NSLog(@"PID up = %@", xyz);
// you can do anything you want to do here
return YES;
}
return NO;
}
Xcode端工作结束。
第三步
在这里引用@BananaNeil代码,因为我不是前端人员
(function() {
var app = {
launchApp: function() {
window.location.replace("myApp://share?abc=12&xyz=123");
this.timer = setTimeout(this.openWebApp, 1000);
},
openWebApp: function() {
window.location.replace("http://itunesstorelink/");
}
};
app.launchApp();
})();
希望它会帮助大家
这里有很多复杂的边缘情况,所以最简单的解决方案是让其他人来处理这些事情。
这就是https://branch.io/的功能。您可以使用他们的免费计划,通过一些额外功能来实现您想要的一切
我不隶属于Branch.io,但我确实使用他们的产品。
如果有人仍然陷在这个问题中,并且需要最简单的解决方案,那么您会喜欢node-deeplink
1.)如果已安装应用程序:通过深度链接调用应用程序将始终调用根组件的componentDidMount。因此,您可以在此处附加一个侦听器。喜欢:
Linking.getInitialURL()
.then(url => {
if (url) {
this.handleOpenURL({ url });
}
})
.catch(console.error);
Linking.addEventListener('url', this.handleOpenURL);
handleOpenURL(event) {
if (event) {
console.log('event = ', event);
const url = event.url;
const route = url.replace(/.*?:\/\//g, '');
console.log('route = ', route);
if(route.match(/\/([^\/]+)\/?$/)) {
const id = route.match(/\/([^\/]+)\/?$/)[1];
const routeName = route.split('/')[0];
if (routeName === 'privatealbum') {
Actions.privateAlbum({ albumId: id });
}
}
}
}
2.)如果未安装应用程序:只需在服务器和节点深链接中设置一条路由当您的手机中未安装应用程序时软件包将处理Web浏览器与应用程序商店之间的桥接。
这样一来,两个案件都将得到处理。