从另一个应用程序打开TestFlight应用并深度链接到特定应用程序

28

我该如何在我的iOS应用程序中查找另一个应用程序的scheme并深度链接到它?

更具体地说,我想在特定条件下(由我的代码设置)深度链接到Testflight应用程序。 我假设用户已安装了Testflight(这可能是一个错误的假设,但我们可以接受这个假设)。

我知道在Android上,您可以查询应用程序并发送意图来深度链接到其他人的应用程序。 在iOS上等效的方法是什么?


有没有React Native的解决方案可以实现同样的功能呢?Linking.canOpenURL(config.testFlightUrl) .then(supported => { if (!supported) { console.log("无法打开链接"); } else { return Linking.openURL(config.testFlightUrl); } }) .catch(err => console.error("无法打开链接", err)); - Sriram C G
6个回答

45

你需要做两件事情。首先,检查是否安装了TestFlight。然后创建一个新链接到你的应用程序。

NSURL *customAppURL = [NSURL URLWithString:@"itms-beta://"];
if ([[UIApplication sharedApplication] canOpenURL:customAppURL]) {

    // TestFlight is installed

    // Special link that includes the app's Apple ID
    customAppURL = [NSURL URLWithString:@"https://beta.itunes.apple.com/v1/app/978489855"]; 
    [[UIApplication sharedApplication] openURL:customAppURL];
}

这个特殊的URL https://beta.itunes.apple.com 将会在TestFlight中直接打开。

最后,如果你使用的是iOS 9或之后的版本,需要对你的Info.plist进行修改才能让canOpenURL:方法正常工作。

如果你的应用程序链接于iOS 9.0或之后的版本,你必须声明要传递给此方法的URL schemes。你需要在Xcode项目的Info.plist文件中使用LSApplicationQueriesSchemes数组来做到这一点。对于每个你想要你的应用程序使用此方法的URL scheme,请将其作为字符串添加到此数组中。

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>itms-beta</string>
</array>

1
我该如何获取自定义应用程序URL?我的应用程序已上传到TestFlight,但我找不到获取URL的方法。 - Paragon
5
这只是简单的https://beta.itunes.apple.com/v1/app/加上应用程序的ID。请注意,这并没有在任何地方记录下来,随时可能会更改。 - picciano
这将打开Testflight并显示我们的Beta应用程序图标(带有一个打开链接),但是如何通过链接直接打开Beta应用程序呢? - Mark Shust at M.academy
1
似乎在iOS 10.3上无法正常工作?它可以正确地打开TestFlight页面的Safari,但无法打开TestFlight应用程序... - Altimac
5
@Altimac,看起来直接深度链接现在可用了。使用以下协议直接调用应用程序:itms-beta://beta.itunes.apple.com/v1/app/978489855 - dberwick
显示剩余2条评论

9

从查看plist文件中,TestFlight的URL模式为"itms-beta://"。目前我还无法实现深度链接,我已经尝试传递苹果ID,并在前缀中加上appleid =和问号,但都未成功。接下来我将尝试使用bundle ID。

要在用户设备上打开TestFlight应用程序,您可以使用以下方法:

NSURL *customAppURL = [NSURL URLWithString:@"itms-beta://"];
if ([[UIApplication sharedApplication] canOpenURL:customAppURL]) {
    [[UIApplication sharedApplication] openURL:customAppURL];
}

8

Swift 3/4解答:

if let customAppURL = URL(string: "itms-beta://"){
    if(UIApplication.shared.canOpenURL(customAppURL)){
        UIApplication.shared.open(customAppURL, options: [:], completionHandler: nil)
    }
}

6
大多数由苹果提供的内置应用程序都可以响应自定义URL方案;例如,地图、邮件、YouTube、iTunes和应用商店应用程序都会在响应自定义URL时打开。但是,还有许多已发布URL方案的第三方应用程序,您可以在自己的应用程序中使用。您可以在以下网站上搜索应用程序方案:
  1. http://handleopenurl.com/

  2. http://wiki.akosma.com/IPhone_URL_Schemes - 这两个网站都有很好的URL方案列表

一旦获取了自定义URL方案,就可以使用相同的方案进行深度链接到该应用程序。
NSURL *customAppURL = [NSURL URLWithString:@"urlscheme://"];
//Eg: NSURL *whatsappURL = [NSURL URLWithString:@"whatsapp://send?text=Hello%20World!"];
if ([[UIApplication sharedApplication] canOpenURL:whatsAppURL]) {
    [[UIApplication sharedApplication] openURL:whatsAppURL]]];
}

13
这份信息很好,但它没有尝试回答问题,这个问题是关于TestFlight应用程序的自定义URL方案。 - rmaddy
1
两个链接都返回404。 - MQoder

2

另一种调用任一应用程序的方式:

- (IBAction)go:(id)sender {
    NSString *cnnAppURL = @"cnn://";
    NSString *mapsAppURL = @"maps://";

    BOOL canOpenURL = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:cnnAppURL]];

    NSString *url = canOpenURL ? cnnAppURL : mapsAppURL;
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];


}

请阅读 "UseYourLoaf's" 最近关于使用 canOpenURLURL schemes 的博客文章,该内容与新的安全问题和解决方案有关。引用内容如下:
“这很有用,但是包括 Twitter 和 Facebook 在内的开发人员使用此机制来发现设备上安装的应用程序列表,以便他们可以提供“定制内容”。苹果认为这是一种隐私侵犯,因此在 iOS 9 中限制了查询 URL schemes 的功能。如果您构建并链接到 iOS 9 SDK,则需要将您的应用程序将要查询的 schemes 加入白名单中。重要的是要理解,这个策略也可能影响尚未使用 iOS 9 SDK 重建的旧应用程序。”
请阅读此链接,了解与 canOpenURL 函数相关的问题。
请阅读 @picciano 的最后一条信息 - 如果不修改应用程序的 plist,则无法使用此功能。

2

最佳响应的Swift更新。

我想补充说明的是,它仍然适用于iOS 16。
并且即使没有安装TestFlight,打开URL也是相关的(它将在Safari中打开,并建议安装TestFlight)。

// Special scheme specific to TestFlight
let presenceCheck = URL(string: "itms-beta://")!
// Special link that includes the app's ID
let deepLink = URL(string: "https://beta.itunes.apple.com/v1/app/<app-id>")!
let app = UIApplication.shared
if app.canOpenURL(presenceCheck) {
    app.open(deepLink)
}

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