确定应用程序是不是存在并在 iOS 上启动该应用程序
Posted
技术标签:
【中文标题】确定应用程序是不是存在并在 iOS 上启动该应用程序【英文标题】:Determine if an app exists and launch that app on iOS确定应用程序是否存在并在 iOS 上启动该应用程序 【发布时间】:2011-08-10 10:01:22 【问题描述】:有没有办法检查 ios 以查看是否已安装并启动另一个应用程序?如果没记错的话,这在早期版本中是不可能的,但是这已经改变了吗?
【问题讨论】:
我认为这一定是可能的——我这么说是因为如果安装了 Facebook SDK 实现将启动 Facebook 应用程序,否则它将回退到 Safari。您确实需要了解其他应用的一些信息,因为使用 Facebook,您需要将一些注册信息添加到您自己的应用中。 是的,我想如果您知道应用标识符,您可以检查并以某种方式启动它。但我找不到任何对此的参考。我希望有人试过这个。 很简单,例如:NSURL *urlApp = [NSURL URLWithString:@"fb://"]; BOOL canOpenFBApp = [[UIApplication sharedApplication] canOpenURL:urlApp]; printf("\n canOpenFBApp:%i \n",canOpenFBApp); 【参考方案1】:可行,但很棘手。
使用自定义 URL 方案启动已安装的应用程序,如 FB 或 Twitter 应用程序。这些既可以在其他应用程序中使用,也可以在网站上使用。
Here's an article about how to do this with your own app.
但是,查看 URL 是否存在可能会很棘手。 Boxcar 是检测已安装应用程序的一个很好的应用程序示例。这里的问题是 Boxcar 对自定义 URL 有深入的了解。我相当 (99%) 确定存在 canOpenURL:
,因此提前了解您想要定位的应用程序的自定义方案可以让这很容易实现。
Here's a partial list 一些您可以检查的更流行的 URL。
有一种方法可以找到自定义应用 URL:https://www.amerhukic.com/finding-the-custom-url-scheme-of-an-ios-app
但如果你想扫描应用程序并推断其 URL,则无法在非 JB 设备上完成。
Here's a blog post 谈论 Bump 的人们如何处理问题。
【讨论】:
您可以查看 iHasApps 以获取用户设备上的应用列表。 感谢 Doug 提供这些链接。我对这篇文章有类似的问题。我在post 中提到了你(如果你不想在那里被提及,请编辑它)。 链接已失效。 Here's an article about how to do this with your own app.【参考方案2】:有一个类似下面的脚本。
<script type="text/javascript">
function startMyApp()
document.location = 'yourAppScheme://';
setTimeout( function()
if( confirm( 'You do not seem to have Your App installed, do you want to go download it now?'))
document.location = 'http://itunes.apple.com/us/app/yourAppId';
, 300);
</script>
从网络 (<a href="#" onclick="startMyApp()">Try to start MyApp</a>
) 调用此脚本,您可以确定您的应用程序是否安装在设备上。
如果应用程序安装在设备上并在其中注册了“yourAppScheme”,则该应用程序将启动。 如果未安装应用程序,您可以建议用户从 iTunes 安装此应用程序。
【讨论】:
但如果应用程序不存在,您仍然会看到来自 safari 的错误消息。 如果未安装应用程序,有谁知道如何避免来自 safari 的错误消息? 这似乎是一个 hack,而且也是一个不稳定的......重定向后 (document.location
) JS 应该停止执行,所以 setTimeout
中的函数不应该被执行。并不是说我知道更好的方法(除非iOS Smart App Banners 足以满足您的需求)。希望被证明是错误的。
@johndodo 这正是重点。如果重定向成功,JavaScript 将停止执行,从而避免超时阻塞(但是,它确实应该检查当前时间与启动时间,因为当用户稍后返回 Safari 时它将继续执行)。另一方面,如果重定向失败,用户将看到两条消息:已经提到的 Safari 提供的第一条丑陋的消息,然后是第二条用户提供的且有点抱歉的消息来解释第一条消息。这并不理想,但至少不像刚刚看到第一个错误那样令人困惑。
这不起作用,即使在意图重定向之后也总是执行 setTimeout【参考方案3】:
我最近遇到了这个问题,这是我想出的解决方案。请注意,仍然没有可靠的方法来检测应用程序是否启动。
我从我的服务器提供一个页面,该页面在检测到用户代理时重定向到特定于 iPhone 的变体。该页面的链接只能通过电子邮件/短信或 Facebook 共享。
页面呈现引用文档的最小版本,然后在加载后自动尝试使用隐藏的
如果 URL 方案已注册,应用程序将打开,用户将能够做他们需要做的一切。无论哪种方式,页面都会在底部显示一条类似这样的消息:“应用程序启动了吗?如果没有,您可能还没有安装它......”并带有指向商店的链接。
【讨论】:
这仍然会显示丑陋的“Safari无法打开页面,因为地址无效。” - 如果未安装应用程序,则发出警报,对吗?我真的很想找到一种方法来通过该警报。建议在短时间内自动重定向或显示确认的解决方案对我的项目来说不够好。【参考方案4】:检查是否安装了应用程序(例如清除):
BOOL installed = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"clearapp://"]];
打开该应用程序:
BOOL success = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"clearapp://"]];
【讨论】:
正是我想要的! 这里是文档:developer.apple.com/library/prerelease/ios/documentation/UIKit/…: 查找应用的自定义网址:amerhukic.com/finding-the-custom-url-scheme-of-an-ios-app【参考方案5】:如果未安装应用程序,则隐藏错误消息
在Branch,我们使用下面的代码形式——请注意,iframe 适用于更多浏览器。只需替换您应用的 URI 和您的 App Store 链接即可。
<!DOCTYPE html>
<html>
<body>
<script type="text/javascript">
window.onload = function()
// Deep link to your app goes here
document.getElementById("l").src = "my_app://";
setTimeout(function()
// Link to the App Store should go here -- only fires if deep link fails
window.location = "https://itunes.apple.com/us/app/my.app/id123456789?ls=1&mt=8";
, 500);
;
</script>
<iframe id="l" style="visibility:hidden"></iframe>
</body>
</html>
还有第二种可能性,首先依赖于 cookie,而 javascript 重定向仅作为后备。逻辑如下:
当没有应用程序的用户首先点击指向您应用程序的链接时,他或她会被直接重定向到 App Store。这是通过指向您的应用程序的链接来实现的,该链接实际上是您的服务器上使用重定向动态生成的页面。您创建一个 cookie 并在您的后端记录 IP 地址、操作系统、操作系统版本等的“数字指纹”。
当用户安装并打开应用程序时,您会收集另一个“数字指纹”并将其发送到您的后端。现在您的后端知道该链接已安装在对与您的应用关联的链接的任何后续访问中,您的服务器会根据随请求发送的 cookie 确保动态生成的重定向页面指向应用,而不是应用商店。
这避免了丑陋的重定向,但涉及大量工作。
【讨论】:
通用链接即将推出 :) 这里的 my_app 是appname
还是 appID
?【参考方案6】:
据我了解,由于隐私问题,您无法查看设备上是否安装了应用。解决这个问题的方法是尝试启动应用程序,如果它没有启动让用户点击后备网址。为了防止发生移动 Safari 错误,我发现将其放在 iframe 中有助于解决问题。
这是我使用的一个 sn-p 代码。
<form name="mobileForm" action="mobile_landing.php" method="post">
<input type="hidden" name="url" value="<?=$web_client_url?>">
<input type="hidden" name="mobile_app" value="<?=$mobile_app?>">
<input type="hidden" name="device_os" value="<?=$device_os?>">
</form>
<script type="text/javascript">
var device_os = '<? echo $device_os; ?>';
if (device_os == 'ios')
var now = new Date().valueOf();
setTimeout(function ()
if (new Date().valueOf() - now > 100)
return;
document.forms[0].submit(); , 5);
var redirect = function (location)
var iframe = document.createElement('iframe');
iframe.setAttribute('src', location);
iframe.setAttribute('width', '1px');
iframe.setAttribute('height', '1px');
iframe.setAttribute('position', 'absolute');
iframe.setAttribute('top', '0');
iframe.setAttribute('left', '0');
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
;
setTimeout(function()
window.close()
, 150 );
redirect("AppScheme");
【讨论】:
以上是关于确定应用程序是不是存在并在 iOS 上启动该应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Java:如何创建一个仅在其实例不存在时才启动并在实例存在时调用该实例的应用程序?