如何在iPhone/iPod Touch/iPad上检测活动的iTunes商店?

24

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

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

7个回答

34

获取用户所在地区的国家代码的方法是可行的...但只有当用户的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];
}

1
对我来说有点晚了,现在我没有机会自己使用这个了。如果有其他人验证了这确实有效,并且你能得到一些赞同票,我会将其重新标记为答案。 虽然现在已经过去很久了,但我相当确定当时还没有StoreKit API。 - pms1969
这个可行。虽然我没有使用相同的代码,但是从product.priceLocale读取iTunes商店货币代码的想法绝对可行。 - Jonas Sourlier
1
等一下..这只有在你实际上拥有应用内购买的情况下才有效,如果没有呢?还有其他方法吗? - abbood
1
@abbood 你不能创建一个IAP并仅将其用于此目的,而不向用户显示吗? - Claes
3
我们的经验是,如果一个应用程序使用这种技术来检测地区,但不向用户展示应用内购买,苹果将不会批准该应用程序。如果您向用户展示应用内购买,并且还想检测地区,则这是一种有效的技术。苹果的审核人员建议,如果您试图基于地区限制应用程序的某些方面,则可以使用地理位置技术作为替代方法。但是,由于它也违反了审核指南中有关位置数据使用的规定,因此您需要获得苹果的批准才能使用该技术。 - Bennett Smith
救了我的命。谢谢。 - jestro

3
自从iOS 13.0,苹果引入了SKStorefront API。
它允许您检查用户所连接的当前AppStore国家/地区。 SKStorefront: 包含Apple App Store storefront的位置和唯一标识符的对象。
概述:通过App Store Connect创建的应用内产品在每个带有App Store的地区均可销售。您可以使用商店信息来确定客户的地区,并提供适合该地区的应用内产品。您必须维护自己的产品标识符列表以及您想要在其中提供这些产品的商店。
主题: - countryCode:表示与App Store storefront相关联的国家的三字代码。 - identifier:由Apple定义的唯一标识App Store storefront的值。

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


1
请注意,因为他们还说:“商店信息不得用于开发或增强用户档案,或跟踪客户进行广告或营销目的。” - Andrew Kirna
你如何检索它? - Reimond Hill
1
无论我使用哪个基于英国的设备配置本地苹果ID,它总是为我返回美国。根据上述情况,我最终请求的是美国产品,但这总是失败的,因为实际商店是英国。也许这是沙盒问题,有人在生产中使用过吗? - Umar Cheema
1
我有同样的问题。无论如何,它都返回美国。 - Robert Gummesson

2

到目前为止,您可以使用两种方法来实现IT技术相关内容,它们分别是:

StoreFront

->SDK >= 13

->代表与App Store storefront相关联的国家的三个字母代码

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

OR

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>

0

我需要相同的功能。目前我考虑使用NSLocale中的数据作为默认值进行读取,但是在设置应用程序中添加一个设置,以便用户可以自定义此设置,如果默认值不匹配。

这个函数来自于我的另一个问题的答案

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

3
考虑到这个设定,但我并不特别喜欢这个想法。例如,在美国有很多以西班牙语为母语的人,他们生活的地区可能与他们使用的商店完全不同。我认为我已经接近答案了,如果行得通的话,我会发布它。原文意思是作者在思考一个设定对于某个情境是否合适的问题,并且提到了美国有很多以西班牙语为母语的人,他们所在的地方可能和他们购物的商店完全不同。作者认为自己已经接近答案,如果成功的话就会发布答案。 - pms1969
1
我认为我一个问题的答案可能会引起兴趣:http://stackoverflow.com/questions/2639684/itunes-music-store-link-maker-how-to-search-from-within-my-app/2668190#2668190无论用户的语言设置如何,ThierryB的getUserCountry方法是否会返回美国用户的US? - prendio2
谢谢,我早就尝试过了,但它并没有按照我预期的方式工作,或者返回了错误的结果。话虽如此,我实际上并不记得在手机上做过这件事(只在模拟器上做过),所以当我解决了我的可恶的配置文件问题并且可以再次在手机上进行调试时,我会再试一下。 - pms1969
好的,看起来已经成功了(getUserCountry),所以我给它点赞。当然,它的问题是如果有人(比如英国人)在澳大利亚等地过着外籍生活,并且将国家代码设置为GB,即使他们的商店是AU,也会出现问题。但除非我能想出更好的方法,否则这就是唯一的选择,再加上更改商店选项。 - pms1969
1
很抱歉我给这个回答点了踩,但是这不是正确的。[NSLocale currentLocale]并不能给你iTunes商店的地区,它只能给你设备的地区,而这两者是不同的。事实上,我使用了[NSLocale currentLocale]并因此遇到了错误,直到我通过读取SKProduct的priceLocale属性来获取正确的商店地区时才解决了问题。我住在澳大利亚,但仍在使用美国iTunes帐户,所以对我来说这两个地区也是不同的。 - Erik van der Neut

0
一个较为麻烦的方法是为每个应用商店国家设置单独的应用程序。每个应用程序都包含其自己的国家商店信息。这意味着用户只使用一个商店,对于大多数人来说这应该是正确的。

虽然我不是很喜欢这种解决方案,但如果情况紧急,我会采用它。我相信有更简单的方法,只是我不知道是什么。 - pms1969

0

1
好的,但是我如何检测商店呢?例如,我可以显示类似于“您的应用商店是...”这样的内容。 - pms1969
@Costique,你回答中的第一个链接无法打开。 - kelin

-4
你应该使用:
[[userDefaults dictionaryRepresentation] objectForKey:@"NSLocaleCode"];

这将返回类似于en_US、en_UK、en_AU,甚至是zh_CN、zh_MY、jp_JP等语言代码。

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


谢谢Mugunth的回答,但是地区和商店不一定代表相同的东西。我需要一种优雅的方法来确定用户被引导到哪个商店。也就是说,他们在哪个商店花费了他们的钱。不过,您是否知道是否有一个NSUserDefaults 适用于NSAppStore? - pms1969
因为这并没有提供用户iTunes商店的区域,所以被投了反对票。 - Erik van der Neut

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