J'essaie d'afficher le prix d'un achat intégré à l'application en utilisant la devise locale, afin d'afficher le dollar correct pour les États-Unis et les États-Unis, ainsi que pour l'euro, la livre sterling, etc.
Je sais que chaque produit SKProduct a un prix qui apparaît pendant la transaction sous forme d'alerte, il apparaît lors de la confirmation de l'achat.
Cependant, je souhaite afficher le prix avant confirmation.
Je pensais faire quelque chose comme ça:
//Products Array
var productsArray: Array<SKProduct!> = []
//Request Products
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
if response.products.count != 0 {
for product in response.products {
print("\(product.localizedTitle)")
productsArray.append(product)
}
}
else {
print("There are no products.")
}
if response.invalidProductIdentifiers.count != 0 {
print("\(response.invalidProductIdentifiers.description)")
}
}
let item = SKProduct
for i in productsArray {
if i.localizedTitle == "com.Company.App.item1"
item = i
}
}
Mais cela ne fonctionne pas car i
Ne semble pas avoir de propriété de prix.
Est-ce que quelqu'un sait comment je peux définir un libellé d'étiquette sur le prix d'un IP en utilisant la devise locale correcte?
Par exemple, £ 1,49 GBP correspond à 1,99 USD en utilisant la matrice de tarification des pommes et la sortie de la valeur doit correspondre à la valeur du prix du produit lors de la confirmation de la transaction.
Swift 4.2 version de la réponse d'Olivier
func priceStringForProduct(item: SKProduct) -> String? {
let price = item.price
if price == NSDecimalNumber(decimal: 0.00) {
return "GET" //or whatever you like really... maybe 'Free'
} else {
let numberFormatter = NumberFormatter()
let locale = item.priceLocale
numberFormatter.numberStyle = .currency
numberFormatter.locale = locale
return numberFormatter.string(from: price)
}
}
vous devez utiliser NSNumberFormatter avec les valeurs de produit pour price et priceLocale pour générer une chaîne correctement formatée, indépendamment de l'emplacement de l'utilisateur. product.price renvoie le prix dans la devise locale sous la forme d'un NSDecimalNumber et product.productLocale renvoie le NSLocale pour la valeur du prix.
par exemple
var item = SKProduct()
for i in productsArray {
if i.productIdentifier == "com.Company.App.item1" {
item = i
if let formattedPrice = priceStringForProduct(item) {
//update ui with price
}
}
}
où priceStringForProduct est une fonction définie ailleurs: -
func priceStringForProduct(item: SKProduct) -> String? {
let numberFormatter = NSNumberFormatter()
let price = item.price
let locale = item.priceLocale
numberFormatter.numberStyle = .CurrencyStyle
numberFormatter.locale = locale
return numberFormatter.stringFromNumber(price)
}
Vous pouvez également vouloir gérer le cas particulier où le prix est 0.0 (niveau gratuit). Dans ce cas, modifiez la fonction priceStringForProduct pour:
func priceStringForProduct(item: SKProduct) -> String? {
let price = item.price
if price == NSDecimalNumber(float: 0.0) {
return "GET" //or whatever you like really... maybe 'Free'
} else {
let numberFormatter = NSNumberFormatter()
let locale = item.priceLocale
numberFormatter.numberStyle = .CurrencyStyle
numberFormatter.locale = locale
return numberFormatter.stringFromNumber(price)
}
}
Modifier: Ajoutez d’autres choses, lorsque vous spécifiez votre produitArray, une façon plus «swifty» de le faire est la suivante:
var productsArray = [SKProduct]()
puis dans votre didRecieveResponse, au lieu de parcourir en boucle les produits, vous pouvez simplement définir productsArray en tant que response.products.
var productsArray = [SKProduct]()
if response.products.count != 0 {
print("\(response.products.map {p -> String in return p.localizedTitle})")
productsArray = response.products
}
Edit: Pour tester un certain nombre de paramètres régionaux, je crée généralement un tableau de NSLocales, puis affiche en boucle le résultat. Il y a un repo avec tous les here de localeIdentifiers
alors:
let testPrice = NSDecimalNumber(float: 1.99)
let localeArray = [NSLocale(localeIdentifier: "uz_Latn"),
NSLocale(localeIdentifier: "en_BZ"),
NSLocale(localeIdentifier: "nyn_UG"),
NSLocale(localeIdentifier: "ebu_KE"),
NSLocale(localeIdentifier: "en_JM"),
NSLocale(localeIdentifier: "en_US")]
/*I got these at random from the link above, pick the countries
you expect to operate in*/
for locale in localeArray {
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .CurrencyStyle
numberFormatter.locale = locale
print(numberFormatter.stringFromNumber(testPrice))
}
Le code de programmation de StoreKit contient cet extrait de code permettant d'afficher le prix dans la devise de l'App Store:
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:product.priceLocale];
NSString *formattedPrice = [numberFormatter stringFromNumber:product.price];
Vous NE DEVEZ PAS afficher le prix dans la devise locale. Vous devez l'afficher dans la devise fournie par le magasin. Si un utilisateur français achète sur l'App Store français, le prix est exprimé en euros et c'est ce que l'utilisateur paye. Si cet utilisateur se rend en Nouvelle-Zélande et change ses paramètres régionaux pour la Nouvelle-Zélande mais reste chez l'app store français, ils sont toujours facturés en euros. Donc, c'est ce que vous devriez afficher.
Vous dites que "1,49 £ correspond à 1,99 $ selon la matrice de tarification d'Apple". Mais 1,49 £ IS PAS 1,99 $. Si, en tant qu'utilisateur britannique, je vais aux États-Unis et que je l'achète au Royaume-Uni, je paie 1,49 £, même si je suis aux États-Unis. Et "1,49 £" est ce que le magasin vous dira.
Swift 3 version du priceStringForProduct:item
d'Olivier
func priceStringForProduct(item: SKProduct) -> String? {
let price = item.price
if price == 0 {
return "Free!" //or whatever you like
} else {
let numberFormatter = NumberFormatter()
let locale = item.priceLocale
numberFormatter.numberStyle = .currency
numberFormatter.locale = locale
return numberFormatter.string(from: price)
}
}