2010-05-24 15 views
38

Tengo una aplicación de compra en la aplicación para iPhone.¿Cómo acceder al precio de un producto en SKPayment?

Quiero mostrar el precio en la moneda local de los usuarios en un UILabel. Para esto necesito el precio & moneda en una variable.

¿Cómo puedo obtener el precio incluyendo la moneda con SKPayment? (Si SKPayment es correcto para este uso.)

estoy una instancia del producto usando:

SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"Identifier"]; 

Gracias a todos de antemano por su respuesta!

Respuesta

116

Hay un problema con sólo usar NSLocaleCurrencySymbol + price.stringValue: no maneja las peculiaridades de los diferentes lugares, por ejemplo. si ponen el símbolo de moneda delante o no. Noruega, Dinamarca, Suecia y Suiza pusieron su moneda después, por ejemplo. 17.00Kr. Además, la mayoría (?) De los países europeos usan ',' en lugar de '.' para decimales, ej. "2,99 €" en lugar de "2,99 €".

Un mejor plan es usar NSNumberFormatter. El "priceLocale" que devolvió SKProduct, como demostró Ed, es la clave. Le da a NSNumberFormatter la inteligencia para formatear un precio correctamente.

También puede hacerlo mucho más fácil al agregar una nueva propiedad a SKProduct utilizando una categoría Objective-C. Añadir los dos archivos siguientes 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 simplemente poder usar product.priceAsString en el código.

+1

que es una hermosa solución, gracias por agregar esto! Cambié la respuesta a tu solución. – favo

+4

¿Alguna idea de cómo probar esto con diferentes monedas? – knagode

+0

De alguna manera esto está devolviendo "US $ " para mí. Noté esto cuando me actualicé a iOS6, ¿alguna idea de por qué? – schystz

9

La forma correcta para determinar alguno de los datos es el uso de un objeto SKProduct, obtenidos del objeto SKProductResponse regresado al delegado después de una llamada a - (void) start en una 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; 
    } 
} 
+5

¡gracias! lo usé así: myLabel.text = [NSString stringWithFormat: NSLocalizedString (@ "bla costs are% @% @", nil), [priceLocale objectForKey: NSLocaleCurrencySymbol], [price stringValue]]; – favo

+1

¡gracias a los dos! pero para ser un 101% correcto, debe usar: 'NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init];' '[numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4];' '[numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];' 'myLabel.text = [NSString stringWithFormat: NSLocalizedString (@ "% @% @", nil), [numberFormatter stringFromNumber: _price], [_priceLocale objectForKey: NSLocaleCurrencySymbol]]; 'para arreglar el separador decimal para diferentes regiones, como 2.50 $ para EE. UU. y 2,50 € para europeo – zero3nna

+0

@ Zero3nna en EE. UU. Pones los $ delante del número, esto lo pone detrás de lo cual nos está buscando muy extraño. –

2

Aquí está la versión rápida de la respuesta anterior utilizando 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 
    } 
} 
1

Aquí está la solución de 3 Swift.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 
    } 
} 
0
  • Obras en Swift y Objective-C
  • desenvolver fuerza es Nunca su amigo.
  • Utilización de las propiedades calculadas crea un código más limpio para el escenario de Objective-C, ya que no necesita [];)

    @objc extensión pública 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 se olvide de import StoreKit

Cuestiones relacionadas