协慌网

登录 贡献 社区

如何在应用商店上链接到应用

我正在创建 iPhone 游戏的免费版本。我想在免费版本中包含一个按钮,该按钮可以将人们带到应用商店中的付费版本。如果我使用标准链接

http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=300136119&mt=8

iPhone 首先打开 Safari,然后打开应用程序商店。我使用了其他直接打开应用商店的应用,所以我知道这是可能的。

有任何想法吗?应用商店的 URL 方案是什么?

答案

于 2016-02-02 编辑

从 iOS 6 开始,引入了SKStoreProductViewController 类。您可以在不离开应用程序的情况下链接应用程序。 Swift 3.x / 2.xObjective-C 中的代码段在此处

SKStoreProductViewController对象提供了一个商店,该商店允许用户从 App Store 购买其他媒体。例如,您的应用程序可能会显示商店,以允许用户购买其他应用程序。


摘自Apple 开发者的新闻和公告

使用 iTunes 链接直接将客户吸引到 App Store 上的应用程序使用 iTunes 链接,您可以为客户提供一种简便的方法,可以直接从您的网站或市场营销活动访问 App Store 上的应用程序。创建 iTunes 链接很简单,可以将客户定向到单个应用程序,所有应用程序或指定公司名称的特定应用程序。

要将客户发送到特定的应用程序: http://itunes.com/apps/appname

要将客户发送到您在 App Store 上拥有的应用程序列表,请执行以下操作: http://itunes.com/apps/developername

要将客户发送到 URL 中包含您的公司名称的特定应用程序: http://itunes.com/apps/developername/appname


补充笔记:

您可以将http://替换为itms://itms-apps://以避免重定向。

请注意itms://将把用户发送到iTunes 商店,itms-apps://会将用户发送到App Store!

有关命名的信息,请参阅 Apple QA1633:

https://developer.apple.com/library/content/qa/qa1633/_index.html

编辑(截至 2015 年 1 月):

itunes.com/apps 链接应更新为 appstore.com/apps。请参阅上面的 QA1633(已更新)。新的QA1629建议了以下步骤和代码,用于从应用程序启动商店:

  1. 在计算机上启动 iTunes。
  2. 搜索您要链接的项目。
  3. 右键单击或按住 Control 单击 iTunes 中的项目名称,然后从弹出菜单中选择 “复制 iTunes Store URL”。
  4. 在您的应用程序中, NSURL对象,然后将此对象传递给UIApplicationopenURL :方法以在 App Store 中打开您的项目。

样例代码:

NSString *iTunesLink = @"itms://itunes.apple.com/app/apple-store/id375380948?mt=8";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];

iOS10 +:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink] options:@{} completionHandler:nil];

斯威夫特 4.2

let urlStr = "itms-apps://itunes.apple.com/app/apple-store/id375380948?mt=8"
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(URL(string: urlStr)!, options: [:], completionHandler: nil)
        
    } else {
        UIApplication.shared.openURL(URL(string: urlStr)!)
    }

如果要直接在 App Store 中打开应用程序,则应使用:

itms-apps:// ...

这样,它将直接在设备中打开 App Store 应用程序,而不是先转到 iTunes,然后仅打开 App Store(仅使用 itms:// 时)。

希望能有所帮助。


编辑:2017 年 4 月。itms-apps:// 实际上在 iOS10 中可以再次使用。我测试了

编辑:2013 年 4 月。这不再适用于 iOS5 及更高版本。只需使用

https://itunes.apple.com/app/id378458261

并且没有更多的重定向。

从 iOS 6 开始,使用SKStoreProductViewController类以正确的方式进行操作。

Swift 5.x

func openStoreProductWithiTunesItemIdentifier(_ identifier: String) {
    let storeViewController = SKStoreProductViewController()
    storeViewController.delegate = self

    let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier]
    storeViewController.loadProduct(withParameters: parameters) { [weak self] (loaded, error) -> Void in
        if loaded {
            // Parent class of self is UIViewContorller
            self?.present(storeViewController, animated: true, completion: nil)
        }
    }
}
private func productViewControllerDidFinish(viewController: SKStoreProductViewController) {
    viewController.dismiss(animated: true, completion: nil)
}
// Usage:
openStoreProductWithiTunesItemIdentifier("1234567")

Swift 3.x

func openStoreProductWithiTunesItemIdentifier(identifier: String) {
    let storeViewController = SKStoreProductViewController()
    storeViewController.delegate = self

    let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier]
    storeViewController.loadProduct(withParameters: parameters) { [weak self] (loaded, error) -> Void in
        if loaded {
            // Parent class of self is UIViewContorller
            self?.present(storeViewController, animated: true, completion: nil)
        }
    }
}

func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
    viewController.dismiss(animated: true, completion: nil)
}
// Usage:
openStoreProductWithiTunesItemIdentifier(identifier: "13432")

您可以像下面这样获取应用程序的 iTunes 项目标识符:(而不是静态的)

斯威夫特 3.2

var appID: String = infoDictionary["CFBundleIdentifier"]
var url = URL(string: "http://itunes.apple.com/lookup?bundleId=\(appID)")
var data = Data(contentsOf: url!)
var lookup = try? JSONSerialization.jsonObject(with: data!, options: []) as? [AnyHashable: Any]
var appITunesItemIdentifier = lookup["results"][0]["trackId"] as? String
openStoreProductViewController(withITunesItemIdentifier: Int(appITunesItemIdentifier!) ?? 0)

斯威夫特 2.x

func openStoreProductWithiTunesItemIdentifier(identifier: String) {
    let storeViewController = SKStoreProductViewController()
    storeViewController.delegate = self

    let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier]
    storeViewController.loadProductWithParameters(parameters) { [weak self] (loaded, error) -> Void in
        if loaded {
            // Parent class of self is UIViewContorller
            self?.presentViewController(storeViewController, animated: true, completion: nil)
        }
    }
}

func productViewControllerDidFinish(viewController: SKStoreProductViewController) {
    viewController.dismissViewControllerAnimated(true, completion: nil)
}
// Usage
openStoreProductWithiTunesItemIdentifier("2321354")

目标 - C

static NSInteger const kAppITunesItemIdentifier = 324684580;
[self openStoreProductViewControllerWithITunesItemIdentifier:kAppITunesItemIdentifier];

- (void)openStoreProductViewControllerWithITunesItemIdentifier:(NSInteger)iTunesItemIdentifier {
    SKStoreProductViewController *storeViewController = [[SKStoreProductViewController alloc] init];

    storeViewController.delegate = self;

    NSNumber *identifier = [NSNumber numberWithInteger:iTunesItemIdentifier];

    NSDictionary *parameters = @{ SKStoreProductParameterITunesItemIdentifier:identifier };
    UIViewController *viewController = self.window.rootViewController;
    [storeViewController loadProductWithParameters:parameters
                                   completionBlock:^(BOOL result, NSError *error) {
                                       if (result)
                                           [viewController presentViewController:storeViewController
                                                              animated:YES
                                                            completion:nil];
                                       else NSLog(@"SKStoreProductViewController: %@", error);
                                   }];

    [storeViewController release];
}

#pragma mark - SKStoreProductViewControllerDelegate

- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
    [viewController dismissViewControllerAnimated:YES completion:nil];
}

您可以这样获得kAppITunesItemIdentifier (应用程序的 iTunes 项目标识符):(而不是静态的)

NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSString * appITunesItemIdentifier =  lookup[@"results"][0][@"trackId"]; 
    [self openStoreProductViewControllerWithITunesItemIdentifier:[appITunesItemIdentifier intValue]];