如何检查iOS设备上是否安装了应用程序?

4

我正在开发一款iOS应用程序。其中,我有一个UITableView模块,在其中显示一些应用程序名称列表,这些名称来自于我的服务器。这些是我们公司的应用程序,因此我不知道服务器会返回多少个应用程序。当用户单击UITableViewCell时,我需要检查该设备上是否已经安装了该应用程序,如果未安装,则用户需要通过该应用程序的应用商店链接去下载安装。我查看了一些教程,其中提到可以使用URL schemes实现此场景。但是,由于这些应用程序来自于服务器,我没有这些URL schemes。此外,我还尝试了以下方法:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms://itunes.com/apps/nameOfMyApp"]]; 
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"nameOfMyAppOrurl:"]];

但是没有任何帮助我解决这个问题。如果有人对这个问题有想法,请提供有价值的建议。

2
自定义URL方案是您的目标。请查看此问题以获取更多信息:https://dev59.com/B2025IYBdhLWcg3w4aCu - Inder Kumar Rathore
4个回答

4
你需要为清单中的每个应用程序设置一个应用URL方案,没有其他方法可以检查该应用程序是否已安装。

我猜测你从服务器获得的清单将是JSON格式,类似于:

{
   "name" : "My Cool APP",
   "scheme" :"mycoolapp:",
   "itunes": "http:///...../"
}

那么只需像这样做:
    if ([[UIApplication sharedApplication] canOpenURL:scheme]) {
        [[UIApplication sharedApplication]openURL:scheme];
    }
    else {
        [[UIApplication sharedApplication]openURL:itunesURL];
    }

2

使用自定义URL方案是解决此问题的首选方式。您需要知道每个应用程序的所有URL方案(这意味着所有应用程序都应该配置一个)以检查其可用性。对于您的特定情况,您将需要后端支持,即服务器应为每个应用程序提供方案(服务器也应该知道这些方案)。

另一种选择是在钥匙串中使用共享数据,这里有一个关于通过钥匙串在应用程序之间共享数据的答案。您应该考虑一个解决方案,但只要您可以在已知的应用程序组之间共享数据,就可以在该技术的基础上实现某些东西。请注意,第二种解决方案要求您拥有所有应用程序(或能够影响其配置)。


1

0

您还可以为公司的应用程序分配URL Scheme,并使用以下代码检查它们是否已安装:

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"myAppURLScheme://"]])
{
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myAppURLScheme://"]];
}
else
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"App not installed on Device"  delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Open link", nil];
    [alert show];
}

还要查看此 URL Scheme 教程


嗨Meet,感谢您的快速回复。我有一个疑问,如何将应用程序名称传递给应用程序的plist以创建自定义URL方案? - Anilkumar iOS - ReactNative
@Anilkumar,打开你的Xcode代码,进入Targets。在下面的“Info”选项卡中,设置URL类型,提供捆绑标识符和所需的URL方案。还要检查我在答案中提供的URL方案教程链接。 - Meet
bundle id没问题,但我如何在运行时添加appnameinfo.plist以用于url scheme呢?因为我正在运行时从服务器获取应用名称,希望您能理解我的问题。 - Anilkumar iOS - ReactNative
@Anilkumar,你不需要在运行时添加URL scheme。我说的是使用上述代码来检查是否支持打开应用程序的URL Scheme。假设你正在获取 "testAppOne://" URL Scheme,它也是你公司的一个应用程序。你所需要做的就是使用上述代码检查设备上是否安装了特定的应用程序。我不明白为什么你要求设置动态URL Scheme。请注意,你不能设置动态URL Scheme。 - Meet
执行此代码 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myAppURLScheme://"]]; 后,是否会打开该应用程序?我希望应用程序不会被打开。 - N Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接