Swift IAP SK产品显示的价格错误

Posted

技术标签:

【中文标题】Swift IAP SK产品显示的价格错误【英文标题】:Swift IAP SKProduct wrong price displayed 【发布时间】:2018-10-10 10:10:22 【问题描述】:

我在 ios 应用中使用应用内购买。我想根据用户/设备以正确的格式显示价格。

这是我的代码:

let price=product.price

let numberFormatter = NumberFormatter()
numberFoxrmatter.formatterBehavior = .behavior10_4   //doesn't change anything if I remove this line
numberFormatter.numberStyle = .currency
numberFormatter.locale = product.priceLocale

let formattedPrice=numberFormatter.string(from: price)

但在某些情况下,货币符号并不好和/或放错了位置。 在我的示例中,价格产品是 $19.9920,99€


例子

来自设备:

product.priceLocale:en_FR@currency=EUR (fixed)

Locale.current:en_FR (current)

产出:20,99 欧元

应该显示:20,99€

来自模拟器:

product.priceLocale:en_FR@currency=EUR (fixed)

Locale.current:en_US (current)

产出:20.99 美元

应显示:20,99 欧元或 19.99 美元


我有几个用户对其他货币有同样的问题,与美元格式不同,符号应该放在价格之后。另一个用户看到的是 $7290 而不是 7290₸(这是完全不同的价格......)。

我很确定这与 语言设置Locale.current 有关。但是,如果我在设备上将我的主要语言更改为法语,我将获得相同的价格“20,99 欧元”。奇怪的是我的Locale.current 切换到en_US (current)

有什么办法解决吗?

另一个我很满意的解决方案:以美元显示每个人的价格,无论用户的语言和货币如何。

【问题讨论】:

商品的价格(例如价值)基于您在 iTunes 中登录的国家/地区,而不是地区。因此,如果您使用美国帐户在 iTunes(沙盒?)中设置,您将看到美国值 我认为最好的选择是显示priceLocale.currencySymbol。该符号在某些情况下会放错位置,但至少它是具有良好货币的良好价格。 【参考方案1】:

试试这个

let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true
currencyFormatter.numberStyle = .currency
// localize to your grouping and decimal separator
currencyFormatter.locale = Locale.current

// We'll force unwrap with the !, if you've got defined data you may need more error checking
let priceString = currencyFormatter.string(from: 9999.99)!
print(priceString) // Displays $9,999.99 in the US locale

例子

currencyFormatter.locale = Locale(identifier: "fr_FR")
if let priceString = currencyFormatter.string(from: 9999.99) 
    print(priceString) // Displays 9 999,99 € in the French locale

更多详情请查看https://supereasyapps.com/blog/2016/2/8/how-to-use-nsnumberformatter-in-swift-to-make-currency-numbers-easy-to-read

【讨论】:

它没有用。而且我认为在某些时候应该考虑priceLocale以避免错误?【参考方案2】:

区域设置是正确输出的关键。 en_FR 读起来像英语和法语地区。这将导致以法语价格为英语使用者的格式化输出 -> 10.00 欧元

使用模拟器并将区域和语言设置为法语并使用 Locale.current。它应该读取 fr_FR 并给出正确的输出。 10,00 欧元

您是否尝试在模拟器上更改语言和区域,这是否会影响 priceLocale?

【讨论】:

我在模拟器上将区域和语言设置为法语; priceLocale 转到fr_FR@currency=EUR (fixed),我得到 20,99 欧元。问题是我不能要求我的用户更改他们的设置,所以我需要找到一个适合所有人的解决方案。从@KerrM 的评论中,我想我会从 priceLocale 显示货币,仅此而已。 为什么要求用户更改首选设置?我认为通过用户设置显示不同的价格格式是正确的。使用 priceLocale 将为您做正确的事情。 我同意凯的观点。这应该不是问题 - 您在评论中描述的内容看起来像是预期的行为。 我以为@Kai 要求我更改设置(地区和语言)。

以上是关于Swift IAP SK产品显示的价格错误的主要内容,如果未能解决你的问题,请参考以下文章

应用商店审核中的 IAP 错误,无法重现

IAP 产品标识符无效

使用 Swift Soup 从任何网站获取产品价格

如何从 API 显示 JSON 数据? [复制]

检索尚未提交的应用内购买产品?

Unity IAP在Apple Testflight中不起作用