Подтвердить что ты не робот

Как получить доступ к цене продукта в SKPayment?

У меня есть приложение In-App-Purchase для iPhone.

Я хочу отобразить цену в местной валюте пользователей в UILabel. Для этого мне нужна цена и валюта в переменной.

Как я могу получить цену, включая валюту, с помощью SKPayment? (Если SKPayment является правильным для этого использования.)

Я создаю экземпляр продукта, используя:

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

Спасибо вам заблаговременно за ваши отзывы!

4b9b3361

Ответ 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
  }
}