【发布时间】:2011-02-02 04:31:51
【问题描述】:
我希望能够确定用户从我的应用程序中连接到哪个商店,以便我可以将他们引导到适合他们的设备和商店的某些内容。有谁知道如何获取这些信息?
基本上,如果用户在英国并连接到英国商店,我希望我的函数/方法返回 GB,如果在韩国,我希望 KR、Australia = AU 等。任何帮助将不胜感激。
【问题讨论】:
标签: iphone objective-c itunes itunes-store
我希望能够确定用户从我的应用程序中连接到哪个商店,以便我可以将他们引导到适合他们的设备和商店的某些内容。有谁知道如何获取这些信息?
基本上,如果用户在英国并连接到英国商店,我希望我的函数/方法返回 GB,如果在韩国,我希望 KR、Australia = AU 等。任何帮助将不胜感激。
【问题讨论】:
标签: iphone objective-c itunes itunes-store
获取用户所在地区的国家代码的方法是可行的……但前提是用户的 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];
}
【讨论】:
product.priceLocale 读取 iTunes Store 货币代码的想法绝对有效。
从 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
【讨论】:
到目前为止,您可以使用两种方法,各有优缺点:
店面
->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>
【讨论】:
获得此功能的一个困难方法是为每个应用商店国家/地区设置一个应用。每个应用程序都拥有自己的国家/地区商店信息。这假设用户只停留在一家商店,这对大多数人来说应该是正确的。
【讨论】:
我建议你试试 iTunes deep links。例如,http://itunes.com/apps/appname 应该将用户带到她花钱的本地 App Store。
【讨论】:
我需要相同的功能。目前我正在考虑使用 NSLocale 中的数据作为默认值进行读取,但在 settings.app 中添加一个设置供用户自定义,如果它不匹配。
这个函数取自an answer to another question of mine。
- (NSString *)getUserCountry
{
NSLocale *locale = [NSLocale currentLocale];
return [locale objectForKey: NSLocaleCountryCode];
}
【讨论】:
getUserCountry 方法不会为美国用户返回美国,无论他们的语言设置为什么?跨度>
[NSLocale currentLocale] 确实不为您提供 iTunes Store 区域设置,它为您提供设备区域设置,这不是一回事。事实上,我使用了[NSLocale currentLocale] 并因此遇到了错误,直到我通过从 SKProduct 的priceLocale 属性中读取正确的商店区域设置来修复它。我住在澳大利亚,但仍在使用我的美国 iTunes 帐户,所以对我来说这两个语言环境也不同。
你应该使用
[[userDefaults dictionaryRepresentation] objectForKey:@"NSLocaleCode"];
这将返回一个语言代码,如 en_US 或 en_UK 或 en_AU 甚至 zh_CN、zh_MY、jp_JP 等。
解析您支持的正确代码并相应地引导它们。
【讨论】: