iphone - proximo - ¿Cómo acceder al precio de un producto en SKPayment?
iphone xs precio (5)
Aquí está la solución para 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
}
}
Estoy teniendo una compra in-app para una aplicación de iPhone.
Quiero mostrar el precio en la moneda local de los usuarios en un UILabel. Para esto necesito el precio y la moneda en una variable.
¿Cómo puedo obtener el precio incluyendo la moneda utilizando SKPayment? (Si SKPayment es correcto para este uso.)
Estoy instanciando el producto usando:
SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"Identifier"];
Gracias a todos por adelantado por sus comentarios!
Aquí está la versión Swift de la respuesta anterior con una 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
}
}
Hay un problema con el simple uso de NSLocaleCurrencySymbol + price.stringValue: no maneja las peculiaridades de diferentes locales, por ejemplo. Ya sea que pongan el símbolo de moneda en frente o no. Noruega, Dinamarca, Suecia y Suiza pusieron su moneda después, por ejemplo. 17.00Kr. Además, la mayoría de (?) Países europeos usan '','' en lugar de ''.'' para decimales, por ej. "2,99 €" en lugar de "€ 2,99".
Un plan mejor es usar NSNumberFormatter. La "escala de precios" que devolvió SKProduct, como demostró Ed, es la clave. Le da a NSNumberFormatter la inteligencia para dar formato a un precio correctamente.
También puede hacer esto mucho más fácil agregando una nueva propiedad a SKProduct usando una categoría de Objective-C. Agregue los siguientes dos archivos a su proyecto:
SKProduct + priceAsString.h:
#import <Foundation/Foundation.h> #import <StoreKit/StoreKit.h> @interface SKProduct (priceAsString) @property (nonatomic, readonly) NSString *priceAsString; @end
SKProduct + 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
Luego, #import "SKProduct+priceAsString.h"
en su código, y debería poder usar product.priceAsString
en el código.
La forma correcta de determinar cualquiera de esa información es usar un objeto SKProduct
, recuperado del objeto SKProductResponse
devuelto al delegado después de que una llamada a - (void) start
en un SKProductsRequest
inicializado. Algo como esto:
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;
}
}
- Trabaja en Swift y Objective-C
- La fuerza de desenvolver nunca es tu amiga.
El uso de propiedades computadas crea un código más limpio para el escenario de Objective-C porque no necesita [];)
@objc public extension SKProduct {
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) }
}
NOTA: No olvides import StoreKit