J'ai un achat intégré pour une application iPhone.
Je veux afficher le prix dans la devise locale des utilisateurs dans un Uilabel. Pour cela, j'ai besoin du prix et de la monnaie dans une variable.
Comment puis-je obtenir le prix, y compris la devise à l'aide de la SKPAYment? (Si le skfayment est correct pour cette utilisation.)
Je suis instanciant du produit en utilisant:
SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"Identifier"];
Merci à l'avance pour vos commentaires!
Il y a un problème avec juste en utilisant nslocalecurencysymbol + prix.stringvalue: il ne gère pas les particularités de différents locaux, par exemple. s'ils mettent le symbole monétaire devant ou non. La Norvège, le Danemark, la Suède et la Suisse ont tous mis leur monnaie après, par exemple. 17.00KR. Aussi, la plupart (?) Les pays européens utilisent "," au lieu de "." Pour les décimales, par exemple. "2,99 €" plutôt que "2,99 €".
Un meilleur plan est d'utiliser Nsnumberformater. Le "Pricelocale" que le Skroproduct est retourné, comme édité de démontrage, est la clé. Il donne à Nsnumberformatter les smarts de formater un prix correctement.
Vous pouvez également rendre cela beaucoup plus facile en ajoutant une nouvelle propriété à Skroproduct à l'aide d'une catégorie Objective-C. Ajoutez les deux fichiers suivants à votre projet:
Skroproduct + Priceasstring.h:
#import <Foundation/Foundation.h> #import <StoreKit/StoreKit.h> @interface SKProduct (priceAsString) @property (nonatomic, readonly) NSString *priceAsString; @end
Skroproduct + Priceasstring.M:
#import "SKProduct+priceAsString.h" @implementation SKProduct (priceAsString) - (NSString *) priceAsString { NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; [formatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; [formatter setLocale:[self priceLocale]]; NSString *str = [formatter stringFromNumber:[self price]]; [formatter release]; return str; } @end
Puis, #import "SKProduct+priceAsString.h"
Dans votre code et vous devriez simplement être capable d'utiliser product.priceAsString
dans du code.
Le moyen correct de déterminer l'une de ces informations est d'utiliser un objet SKProduct
, extrait de l'objet SKProductResponse
renvoyé au délégué après un appel à - (void) start
sur une SKProductsRequest
. Quelque chose comme ça:
SKProductsRequest *req = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"Identifier"]];
req.delegate = self;
[req start];
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse: (SKProductsResponse *)response {
[request autorelease];
if (response.products.count) {
SKProduct *product = [response.products objectAtIndex:0];
NSLocale *priceLocale = product.priceLocale;
NSDecimalNumber *price = product.price;
NSString *description = product.localizedDescription;
}
}
Voici le Swift version de la réponse ci-dessus à l'aide d'un extension
:
extension SKProduct {
func priceAsString() -> String {
let formatter = NSNumberFormatter()
formatter.formatterBehavior = .Behavior10_4
formatter.numberStyle = .CurrencyStyle
formatter.locale = self.priceLocale
return formatter.stringFromNumber(self.price)! as String
}
}
Voici la solution pour Swift 3.0
extension SKProduct {
func priceAsString() -> String {
let formatter = NumberFormatter()
formatter.formatterBehavior = .behavior10_4
formatter.numberStyle = .currency
formatter.locale = self.priceLocale
return formatter.string(from: self.price)! as String
}
}
L'utilisation de propriétés calculées crée un code de nettoyage pour le scénario de l'objectif-C, car il n'a pas besoin de [];)
@OBJC Extension publique Skroproduct {
var priceAsString: String? {
let formatter = NumberFormatter()
formatter.formatterBehavior = .behavior10_4
formatter.numberStyle = .currency
formatter.locale = self.priceLocale
formatter.string(from: self.price)
return formatter.string(from: self.price)
}
}
Remarque: N'oubliez pas import StoreKit