В приложении купите методы наиболее успешной практики
Этот документ описывает методы наиболее успешной практики для реализации Закупки В приложении в приложениях OS X и iOS.
Методы наиболее успешной практики
Ниже список методов наиболее успешной практики, за которыми разработчики должны следовать при реализации Закупки В приложении.
Добавьте наблюдателя очереди транзакции в запуске приложения
Когда Ваше приложение вызывает, StoreKit присоединяет Вашего наблюдателя к очереди платежа
[[SKPaymentQueue defaultQueue] addTransactionObserver:your_observer]; |
Когда содержание очереди платежа изменяется после возобновления или при выполнении приложения, StoreKit автоматически уведомляет Вашего наблюдателя. Добавление наблюдателя Вашего приложения в запуске гарантирует, что сохранится во время всех запусков Вашего приложения, таким образом позволяя Вашему приложению получить все уведомления очереди платежа.
Рассмотрите случай приложения чей DetailViewController класс создает наблюдателя прямо прежде, чем добавить платежное требование к очереди, как замечено в Перечислении 1. Этот наблюдатель существует пока экземпляр DetailViewController, то, которое создало его, существует. В появлении прерываний, таких как отказ сети, приложение не завершает процесс закупки, и связанная транзакция остается в очереди платежа. Когда приложение возобновляется, оно не имеет никаких наблюдателей, поскольку вышеупомянутый наблюдатель был освобожден, когда Ваше приложение было отправлено в фон. В результате Ваше приложение не уведомить о транзакции в очереди.
Перечисление 1 не следует за методами наиболее успешной практики для реализации наблюдателя транзакции: Когда клиент пытается купить продукт, приложение добавляет наблюдателя к очереди платежа.
@implementation DetailViewController |
.... |
// Called when a customer attempts to purchase a product |
- (IBAction)purchase:(id)sender |
{ |
// Register an observer to the payment queue |
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; |
// Create a payment request |
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:self.product]; |
// Submit the payment request to the payment queue |
[[SKPaymentQueue defaultQueue] addPayment:payment]; |
} |
.... |
@end |
См. Перечисление 2 для примера, правильно регистрирующего наблюдателя очереди транзакции.
Перечисление 2 Следует за методами наиболее успешной практики для регистрации наблюдателя транзакции
@implementation AppDelegate |
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions |
{ |
// Attach an observer to the payment queue |
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; |
return YES; |
} |
// Called when the application is about to terminate |
- (void)applicationWillTerminate:(UIApplication *)application |
{ |
// Remove the observer |
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; |
} |
.... |
@end |
Когда Ваше приложение вызывает, StoreKit удаляет наблюдателя из очереди платежа
[[SKPaymentQueue defaultQueue] removeTransactionObserver:your_observer]; |
Также, StoreKit может попытаться уведомить вышеупомянутого наблюдателя, если он не был удален из очереди платежа, таким образом заставив Ваше приложение отказать, поскольку больше не существует наблюдатель.
Запросите App Store для получения информации о продукте прежде, чем представить хранилище Вашего приложения UI
Ваше приложение должно сначала отправить запрос продукта к App Store прежде, чем решить что продукты вывести на экран для закупки в его пользовательском интерфейсе. Отправление запроса продукта позволяет Вам определять, доступны ли Ваши продукты для продажи в App Store, таким образом препятствуя тому, чтобы Вы вывели на экран продукты, которые не могут быть куплены в Вашем приложении. Посмотрите Информацию о продукте Получения, чтобы изучить, как создать запрос продукта. App Store реагирует на Ваш запрос продукта с SKResponse объект. Используйте products свойство для обновления UI, таким образом гарантируя, что клиентам только подарят продукты, доступные для продажи в App Store.
Перечисление 3 не следует за методами наиболее успешной практики для представления продуктов Закупки В приложении: Приложение запрашивает App Store для получения информации о продукте после представления его для продажи.
// App first displays a product for sale, then queries the App Store about it when a customer attempts to purchase it |
- (IBAction)purchase:(id)sender |
{ |
// Create a set for your product identifier |
NSSet *productSet = [NSSet setWithObject:@"your_product_identifier"]; |
// Create a product request object and initialize it with the above set |
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productSet]; |
request.delegate = self; |
// Send the request to the App Store |
[request start]; |
} |
// Get the App Store's response |
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response |
{ |
// No purchase will take place if there are no products available for sale. |
// As a result, StoreKit won't prompt your customer to authenticate their purchase. |
if ([response.products count] > 0) |
{ |
SKProduct *product = (SKProduct *)[response.products objectAtIndex:0]; |
// The product is available, let's submit a payment request to the queue |
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product]; |
[[SKPaymentQueue defaultQueue] addPayment:payment]; |
} |
} |
См. Перечисление 4 для примера, следующего за методами наиболее успешной практики для представления продуктов Закупки В приложении.
Перечисление 4 Следует за методами наиболее успешной практики для представления продуктов Закупки В приложении
-(void)fetchProductInformationForIds:(NSArray *)productIds |
{ |
// Create a set for your product identifier |
NSSet *mySet = [NSSet setWithObject:your_product_identifier]; |
// Create a product request object and initialize it with the above set |
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:mySet]; |
request.delegate = self; |
// Send the request to the App Store |
[request start]; |
} |
//Get the App Store's response |
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response |
{ |
if ([response.products count] > 0) |
{ |
// Use availableProducts to populate your UI |
NSArray *availableProducts = response.products; |
} |
} |
Обеспечьте UI для восстановления продуктов
Если Ваше приложение продает непотребляемую, автовозобновляемую подписку или продукты подписки невозобновления, то необходимо обеспечить UI, позволяющий им быть восстановленными. Посмотрите Различия Между Типами продукта и Восстановлением Купленных продуктов для получения дополнительной информации.
Обработайте транзакцию
Когда Ваше приложение вызывает, StoreKit добавляет платежное требование к очереди платежа
[[SKPaymentQueue defaultQueue] addPayment:your_payment]; |
Очередь создает объект транзакции обработать этот запрос. StoreKit уведомляет Вашего наблюдателя путем вызова paymentQueue: updatedTransactions: метод, когда состояние этой транзакции изменения. Каждая транзакция имеет четыре возможных состояния как показано в состояниях In-App Purchase Programming Guide> Delivering Products> Table 4-1 Transaction и соответствующих действиях. Удостоверьтесь что Ваш наблюдатель paymentQueue: updatedTransactions: может реагировать на любое из этих состояний в любое время. Реализуйте paymentQueue:updatedDownloads: метод на Вашем наблюдателе, если Ваше приложение обеспечивает продукты, размещенные Apple.
Обеспечьте оплаченное содержание
Поставьте содержание или разблокируйте функциональность своего приложения, когда Ваше приложение получает транзакцию, состояние которой SKPaymentTransactionStatePurchased или SKPaymentTransactionStateRestored. Эти состояния указывают, что платеж был получен для продаваемого продукта. Также, Ваш клиент ожидает быть предоставленным оплаченным содержанием. Если Ваш купленный продукт включает размещенное содержание от App Store, несомненно, вызовут SKPaymentQueue startDownloads: загружать содержание. Посмотрите Функциональность Приложения Разблокирования и Поставку Связанного Содержания для получения дополнительной информации.
Закончите транзакцию
Транзакции остаются в очереди платежа, пока они не удалены. StoreKit вызовет Вашего наблюдателя paymentQueue: updatedTransactions: каждый раз, когда Ваши запуски приложения или резюме от фона, пока они не удалены. К тому эффекту Ваших клиентов можно неоднократно просить аутентифицировать их покупки или препятствоваться покупать Ваши продукты.
Вызвать finishTransaction: на Вашей транзакции для удаления его из очереди. Законченные транзакции не являются восстанавливаемыми. Поэтому обязательно обеспечьте Ваше содержание, загрузите все размещенное Apple содержание продукта или завершите Ваш процесс закупки прежде, чем закончить Вашу транзакцию. Посмотрите Окончание Транзакции для получения дополнительной информации.
Протестируйте свою реализацию Закупки В приложении
Обязательно полностью протестируйте Вашу реализацию Закупки В приложении прежде, чем представить Ваше приложение для анализа. Посмотрите Предложенные Шаги Тестирования для различных сценариев для тестирования Вашей реализации и Часто Задаваемых Вопросов для поиска и устранения неисправностей проблем.
Ссылки
История версии документа
| Дата | Примечания |
|---|---|
| 16.12.2014 | Обновленный раздел «Add a transaction queue observer at application launch». |
| 05.08.2014 | Новый документ, обеспечивающий методы наиболее успешной практики для реализации Закупки В приложении в приложениях OS X и iOS. |