【问题标题】:How to detect the active iTunes store on the iPhone/iPod Touch/iPad?如何检测 iPhone/iPod Touch/iPad 上的活动 iTunes 商店?
【发布时间】:2011-02-02 04:31:51
【问题描述】:

我希望能够确定用户从我的应用程序中连接到哪个商店,以便我可以将他们引导到适合他们的设备和商店的某些内容。有谁知道如何获取这些信息?

基本上,如果用户在英国并连接到英国商店,我希望我的函数/方法返回 GB,如果在韩国,我希望 KR、Australia = AU 等。任何帮助将不胜感激。

【问题讨论】:

    标签: iphone objective-c itunes itunes-store


    【解决方案1】:

    获取用户所在地区的国家代码的方法是可行的……但前提是用户的 iTunes 商店与其所在地区相同。情况并非总是如此。

    如果您创建应用内购买项目,您可以使用 Apple 的 StoreKit API 来找出用户的实际 iTunes 国家/地区,即使该国家/地区与他们的设备区域设置不同。以下是一些对我有用的代码:

    - (void) requestProductData
    {
        SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers:
                                     [NSSet setWithObject: PRODUCT_ID]];
        request.delegate = self;
        [request start];
    }
    
    - (void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
    {
        NSArray *myProducts = response.products;
        for (SKProduct* product in myProducts) {
            NSLocale* storeLocale = product.priceLocale;
            storeCountry = (NSString*)CFLocaleGetValue((CFLocaleRef)storeLocale, kCFLocaleCountryCode);
            NSLog(@"Store Country = %@", storeCountry);
        }
    
        [request release];
    
        // If product request didn't work, fallback to user's device locale
        if (storeCountry == nil) {
            CFLocaleRef userLocaleRef = CFLocaleCopyCurrent();
            storeCountry = (NSString*)CFLocaleGetValue(userLocaleRef, kCFLocaleCountryCode);
        }
    
        // Now we're ready to start creating URLs for the itunes store
        [super start];
    }
    

    【讨论】:

    • 对我来说派对有点晚了,我自己现在没有机会使用它。如果其他人验证这确实有效,并且您可以获得一些赞成票,我会将其重新标记为答案。现在是很久以前的事了,但我很确定 StoreKit API 那时还不存在。
    • 这行得通。我不使用相同的代码,但从product.priceLocale 读取 iTunes Store 货币代码的想法绝对有效。
    • 等一下.. 这只有在你真的确实有应用内购买时才有效,对吗?如果你不这样做怎么办?还有其他方法吗?
    • @abbood 你不能创建一个 IAP 并仅将其用于此目的而不向用户显示它吗?
    • 我们的经验是,Apple 不会批准使用这种技术检测领土/地区但不会向用户显示应用内购买的应用。如果您向用户显示应用内购买并且想要检测领土/地区,那么这是一种有效的技术。 Apple 评论者建议,如果您试图根据地区限制应用程序的某些方面,另一种选择是使用地理位置。但是,您需要获得 Apple 的批准才能使用它,因为它也违反了关于使用位置数据的审查指南。
    【解决方案2】:

    从 iOS 13.0 开始,Apple 引入了SKStorefront API。

    它允许您检查用户连接到的当前 AppStore 国家/地区。

    SKStorefront:包含 Apple App Store 店面位置和唯一标识符的对象。

    概述

    您通过 App Store Connect 创建的应用内产品可在每个拥有 App Store 的地区销售。您可以使用店面信息来确定客户所在的地区,并提供适合该地区的应用内商品。您必须维护自己的产品标识符列表以及要在其中提供它们的店面。

    主题

    • countryCode:代表与 App Store 店面关联的国家/地区的三字母代码。
    • 标识符:Apple 定义的唯一标识 App Store 店面的值。

    https://developer.apple.com/documentation/storekit/skstorefront

    【讨论】:

    • 小心,因为他们还说,“店面信息不得用于开发或增强用户资料,或出于广告或营销目的跟踪客户。”跨度>
    • 如何找回它?
    • 总是为我返回美国,即使是从配置了本地苹果 id 的英国设备,按照上述方式,我最终请求美国产品并且总是失败,因为实际商店是 GB,也许它是沙盒的东西,有人在生产中使用过吗?
    【解决方案3】:

    到目前为止,您可以使用两种方法,各有优缺点:

    店面

    ->SDK >= 13

    ->代表与 App Store 店面关联的国家/地区的三个字母代码

    if let storeFront = SKPaymentQueue.default().storefront{
        print("StoreFront CountryCode = ", storeFront.countryCode)
    }
    else {
        print("StoreFront NOT Available")
    }
    

    SKCloudServiceController

    -> 适用于 iOS 9.3。

    -> 需要权限。在 tvOS 上它可能会变得混乱,因为我找不到更改设置中的权限的方法...

    -> 权限文本相当混乱。

    let skCloudServiceController = SKCloudServiceController()
    SKCloudServiceController.requestAuthorization { (status) in
        guard status == .authorized else {
            return
        }
    
        skCloudServiceController.requestStorefrontCountryCode(completionHandler: { (countryCode, error)  in
            if let error = error {
                print("Failure: ", error)
            }
                else if let countryCode = countryCode {
                print("Country code: ", countryCode)
            }
        })
    }
    

    不要忘记将其包含在您的 .plist 文件中:

    <key>NSAppleMusicUsageDescription</key>
    <string>Store information</string>
    

    【讨论】:

      【解决方案4】:

      获得此功能的一个困难方法是为每个应用商店国家/地区设置一个应用。每个应用程序都拥有自己的国家/地区商店信息。这假设用户只停留在一家商店,这对大多数人来说应该是正确的。

      【讨论】:

      • 不是我正在寻找的解决方案类型,尽管在绑定中,我会这样做。我确信有一个更简单的方法,我只是不知道它是什么。
      【解决方案5】:

      我建议你试试 iTunes deep links。例如,http://itunes.com/apps/appname 应该将用户带到她花钱的本地 App Store。

      【讨论】:

      • 好的,但是我如何检测商店是什么。因此,例如,我可以显示类似“您的 App Store 是……”之类的内容
      • @Costique,您答案中的第一个链接无效。
      【解决方案6】:

      我需要相同的功能。目前我正在考虑使用 NSLocale 中的数据作为默认值进行读取,但在 settings.app 中添加一个设置供用户自定义,如果它不匹配。

      这个函数取自an answer to another question of mine

      - (NSString *)getUserCountry
      {
          NSLocale *locale = [NSLocale currentLocale];
          return [locale objectForKey: NSLocaleCountryCode];
      }
      

      【讨论】:

      • 也想到了设置。但我并不特别喜欢这样的想法,例如,在美国有很多天生讲西班牙语的人,他们的语言环境可能与他们使用的商店完全不同。我想我已经接近自己的答案了,如果它成功了,我会发布。
      • 我认为我的一个问题的答案可能会引起人们的兴趣:stackoverflow.com/questions/2639684/… ThierryB 的getUserCountry 方法不会为美国用户返回美国,无论他们的语言设置为什么?跨度>
      • 谢谢,我很早就试过了,但它没有按我预期的方式工作,或者返回了错误的结果。话虽如此,我实际上不记得在手机上做过(在模拟器中做过),所以当我整理我该死的配置文件并可以再次在手机上调试时,我会玩一玩。
      • 好的,似乎已经奏效了(getUserCountry),所以请竖起大拇指。它的问题当然是如果有人(比如英国人)在澳大利亚这样的地方过着外籍人士的生活,并且即使他们的商店是 AU 也将国家代码设置为 GB。但除非我能想出更好的方法,否则必须这样做,再加上更改商店的选项。
      • 很抱歉对这个答案投了反对票,但这不正确。 [NSLocale currentLocale] 确实为您提供 iTunes Store 区域设置,它为您提供设备区域设置,这不是一回事。事实上,我使用了[NSLocale currentLocale] 并因此遇到了错误,直到我通过从 SKProduct 的priceLocale 属性中读取正确的商店区域设置来修复它。我住在澳大利亚,但仍在使用我的美国 iTunes 帐户,所以对我来说这两个语言环境也不同。
      【解决方案7】:

      你应该使用

      [[userDefaults dictionaryRepresentation] objectForKey:@"NSLocaleCode"];
      

      这将返回一个语言代码,如 en_US 或 en_UK 或 en_AU 甚至 zh_CN、zh_MY、jp_JP 等。

      解析您支持的正确代码并相应地引导它们。

      【讨论】:

      • 感谢 Mugunth,但 locale 和 store 不一定等同于同一件事。我需要一种优雅的方式来找出用户被定向到的商店。 IE。他们在哪家商店花钱。不要以为 NSAppStore 有 userdefaults 吗?
      • 投了反对票,因为这提供用户的 iTunes Store 的区域设置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2011-08-22
      • 2011-11-09
      • 1970-01-01
      • 2014-12-12
      • 2011-03-17
      相关资源
      最近更新 更多