Как получить доступ к цене продукта в SKPayment?
У меня есть приложение In-App-Purchase для iPhone.
Я хочу отобразить цену в местной валюте пользователей в UILabel. Для этого мне нужна цена и валюта в переменной.
Как я могу получить цену, включая валюту, с помощью SKPayment? (Если SKPayment является правильным для этого использования.)
Я создаю экземпляр продукта, используя:
SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"Identifier"];
Спасибо вам заблаговременно за ваши отзывы!
Ответы
Ответ 1
Проблема с использованием NSLocaleCurrencySymbol + price.stringValue: она не обрабатывает особенности разных локалей, например. вставили ли они символ валюты или нет. Норвегия, Дания, Швеция и Швейцария все закладывают свою валюту после, например. 17.00Kr. Кроме того, большинство (?) Европейских стран используют ',' вместо '.' для десятичных знаков, например. "2,99 €", а не "2,99 евро".
Лучше всего использовать NSNumberFormatter. "PriceLocale", который SKProduct вернул, как показал Эд, является ключевым. Это дает NSNumberFormatter для смартфонов правильно отформатировать цену.
Вы также можете сделать это намного проще, добавив новое свойство в SKProduct с помощью категории Objective-C. Добавьте в свой проект следующие два файла:
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
Затем #import "SKProduct+priceAsString.h"
в вашем коде, и вы должны просто использовать product.priceAsString
в коде.
Ответ 2
Правильный способ определить любую из этих сведений - использовать объект SKProduct
, полученный из объекта SKProductResponse
, возвращенный делегату после вызова - (void) start
в инициализированном SKProductsRequest
. Что-то вроде этого:
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;
}
}
Ответ 3
Здесь приведенная выше версия ответа с использованием 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
}
}
Ответ 4
Вот решение для 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
}
}