SlideShare une entreprise Scribd logo
1  sur  18
In-App Purchases
и с чем их едят...
Что такое In-App
   Purchases?
Типы

• Consumables
• UnConsumables
• Subscriptions
Основы
Встроенная модель
 • Позволяет разблокировать features
   внутри приложения
 • Все features должны быть встроены в
   само приложение


StoreKit не отвечает за все манипуляции после
            подтверждения покупки
Серверная модель


• Позволяет «отправлять» features с
  сервера
• «Мы в ответе за тех кого приручили»
Принципы работы
Как это работает?
Получение информации о продуктах
Продажи
Примеры кода
1.                                Доступен ли магазин
     if ([[SKPaymentQueue defaultQueue] canMakePayments])
     {
         ... // Тут показываем пользователю магазин
     }
     else
     {
         ... // Магазин недоступен - делаем что-либо другое
     }




2.               Получаем информацию о продуктах
     - (void) requestProductData
     {
        SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet
     setWithObject: kMyFeatureIdentifier]];
        request.delegate = self;
        [request start];
     }
     - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse
     *)response
     {
        NSArray *myProduct = response.products;
        // Показываем графический интерфейс тут
        [request autorelease];
     }
3.              Добавляем собственный Observer
     MyStoreObserver *observer = [[MyStoreObserver alloc] init];
     [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];




4.                                  Добавляем в queue
     - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
     {
        for (SKPaymentTransaction *transaction in transactions)
        {
           switch (transaction.transactionState)
           {
              case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
              case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
              case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
              default:
                break;
           }
        }
     }
5.                                 Завершаем транзакцию
     - (void) completeTransaction: (SKPaymentTransaction *)transaction
     {
        // Приложение использует вот эти две собственных функции.
        [self recordTransaction: transaction];
        [self provideContent: transaction.payment.productIdentifier];
        // Убираем транзакцию из queue.
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
     }


6.                          Восстановленная транзакция
     - (void) restoreTransaction: (SKPaymentTransaction *)transaction
     {
        [self recordTransaction: transaction];
        [self provideContent: transaction.originalTransaction.payment.productIdentifier];
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
     }




7.                                 Неуспешная транзакция
     - (void) failedTransaction: (SKPaymentTransaction *)transaction
     {
        if (transaction.error.code != SKErrorPaymentCancelled)
        {
            // Тут показываем ошибку в UI
        }
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
     }
8.                                    Последние штрихи

 SKPayment *payment = [SKPayment paymentWithProductIdentifier:kMyFeatureIdentifier];
 [[SKPaymentQueue defaultQueue] addPayment:payment];




                                                        или

 SKMutablePayment *payment = [SKMutablePayment paymentWithProductIdentifier:kMyFeatureIdentifier];
 payment.quantity = 3;
 [[SKPaymentQueue defaultQueue] addPayment:payment];
Немного JSON

                HTTP POST.
https://buy.itunes.apple.com/verifyReceipt
   {
       "receipt-data" : "(NSData*)transactionReceipt + base64"
   }




                          Ответ сервера


       {
           "status" : 0
           "receipt" : { ... }
       }
JSON
quantity
Кол-во приобретенных продуктов

product_id
Идентификатор купленного продукта. То же самое мы получаем при productIdentifier из SKPayment.

transaction_id
Идентификатор транзакции. То же самое мы получаем из transactionIdentifier нашей транзакции.

purchase_date
Время и дата покупки. То же самое мы получаем из transactionDate нашей транзакции.

original_transaction_id
Индетификатор изначальной транзакции.

original_purchase_date
Время и дата оригинальной транзакции.

app_item_id
Идентификатор приложения от Apple. Недоступен в режиме Sandbox.

version_external_identifier
Ревизия приложения. Недоступно в режиме Sandbox.

bid
Bundle нашего приложения.
bvrs
Версия нашего приложения.
Всем Спасибо.
      Вопросы?



       Контакты
skype: soul.odessa
email: soul.odessa@gmail.com
icq: 207627325

Contenu connexe

Tendances

Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
Paul Stashevsky
 
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiРазработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Softengi
 

Tendances (14)

Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.js
 
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
CocoaHeads Moscow. Владислав Дугнист. «Dependency Injection с Blood Magic»
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 
Rambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOSRambler.iOS #3: Dependency Injection в iOS
Rambler.iOS #3: Dependency Injection в iOS
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переиграл
 
Rambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и SwiftRambler.iOS #5: VIPER и Swift
Rambler.iOS #5: VIPER и Swift
 
сервисы в Angular js
сервисы в Angular jsсервисы в Angular js
сервисы в Angular js
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
VIQA - Тестирование UI с помощью Виртуального интеллекта
VIQA - Тестирование UI с помощью Виртуального интеллектаVIQA - Тестирование UI с помощью Виртуального интеллекта
VIQA - Тестирование UI с помощью Виртуального интеллекта
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
 
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiРазработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеровRambler.iOS #8: Как не стать жертвой бэкендеров
Rambler.iOS #8: Как не стать жертвой бэкендеров
 

Similaire à In-App-Purchases и с чем их едят

Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Глеб Тарасов
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Глеб Тарасов
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Ivan Tsyganov
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
Igor ostuchenko-analytics-110317084549-phpapp01
Igor ostuchenko-analytics-110317084549-phpapp01Igor ostuchenko-analytics-110317084549-phpapp01
Igor ostuchenko-analytics-110317084549-phpapp01
Павел Иванов
 
Tag Management (рекламный контейнер)
Tag Management (рекламный контейнер)Tag Management (рекламный контейнер)
Tag Management (рекламный контейнер)
Michail Гаркунов
 
Аспектно-Ориентированный Подход
Аспектно-Ориентированный ПодходАспектно-Ориентированный Подход
Аспектно-Ориентированный Подход
akopium
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
Magecom Ukraine
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Глеб Тарасов
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-Онлайн
DevDay
 

Similaire à In-App-Purchases и с чем их едят (20)

Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
 
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
Объять необъятное, или как использовать несколько MVVM фреймворков в одном XA...
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
Mobilefest2012
Mobilefest2012Mobilefest2012
Mobilefest2012
 
Google play billing v3.0
Google play billing v3.0Google play billing v3.0
Google play billing v3.0
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
Igor ostuchenko-analytics-110317084549-phpapp01
Igor ostuchenko-analytics-110317084549-phpapp01Igor ostuchenko-analytics-110317084549-phpapp01
Igor ostuchenko-analytics-110317084549-phpapp01
 
MSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложностиMSI In-Store Pickup Функционал & сложности
MSI In-Store Pickup Функционал & сложности
 
Tag Management (рекламный контейнер)
Tag Management (рекламный контейнер)Tag Management (рекламный контейнер)
Tag Management (рекламный контейнер)
 
Аспектно-Ориентированный Подход
Аспектно-Ориентированный ПодходАспектно-Ориентированный Подход
Аспектно-Ориентированный Подход
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
 
Фреймворк-невиидмка
Фреймворк-невиидмкаФреймворк-невиидмка
Фреймворк-невиидмка
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Knockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-ОнлайнKnockout.JS на примере 2ГИС-Онлайн
Knockout.JS на примере 2ГИС-Онлайн
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
C# Web. Занятие 02.
C# Web. Занятие 02.C# Web. Занятие 02.
C# Web. Занятие 02.
 

Plus de Pavel Bashmakov

The road from the services to the products
The road from the services to the productsThe road from the services to the products
The road from the services to the products
Pavel Bashmakov
 
Mobile Apps - Новые Медиа
Mobile Apps - Новые МедиаMobile Apps - Новые Медиа
Mobile Apps - Новые Медиа
Pavel Bashmakov
 
Stanfy - Mobile Apps as Newest Media
Stanfy - Mobile Apps as Newest MediaStanfy - Mobile Apps as Newest Media
Stanfy - Mobile Apps as Newest Media
Pavel Bashmakov
 
Владимир Пузанов - JailBreak: Разработка без лимитов
Владимир Пузанов - JailBreak: Разработка без лимитовВладимир Пузанов - JailBreak: Разработка без лимитов
Владимир Пузанов - JailBreak: Разработка без лимитов
Pavel Bashmakov
 
Павел Тайкало - Использование CoreData в iPhone приложения
Павел Тайкало - Использование CoreData в iPhone приложенияПавел Тайкало - Использование CoreData в iPhone приложения
Павел Тайкало - Использование CoreData в iPhone приложения
Pavel Bashmakov
 
Taras Kornichuk - Ценности социальной игровой платформы для разработчиков и и...
Taras Kornichuk - Ценности социальной игровой платформы для разработчиков и и...Taras Kornichuk - Ценности социальной игровой платформы для разработчиков и и...
Taras Kornichuk - Ценности социальной игровой платформы для разработчиков и и...
Pavel Bashmakov
 

Plus de Pavel Bashmakov (20)

The road from the services to the products
The road from the services to the productsThe road from the services to the products
The road from the services to the products
 
Портирование успешных iPhone приложений на Android\Bada платформы
Портирование успешных iPhone приложений на Android\Bada платформыПортирование успешных iPhone приложений на Android\Bada платформы
Портирование успешных iPhone приложений на Android\Bada платформы
 
Мобильные приложения как инструмент доступа к пользователям современных мобил...
Мобильные приложения как инструмент доступа к пользователям современных мобил...Мобильные приложения как инструмент доступа к пользователям современных мобил...
Мобильные приложения как инструмент доступа к пользователям современных мобил...
 
Разработка мобильных приложений
Разработка мобильных приложенийРазработка мобильных приложений
Разработка мобильных приложений
 
Android Platform Architecture
Android Platform ArchitectureAndroid Platform Architecture
Android Platform Architecture
 
Android Game Fox Hunter - Start
Android Game Fox Hunter - StartAndroid Game Fox Hunter - Start
Android Game Fox Hunter - Start
 
About Stanfy
About StanfyAbout Stanfy
About Stanfy
 
Mobile Apps - Новые Медиа
Mobile Apps - Новые МедиаMobile Apps - Новые Медиа
Mobile Apps - Новые Медиа
 
Mobile Apps - New Media
Mobile Apps - New MediaMobile Apps - New Media
Mobile Apps - New Media
 
Клиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhoneКлиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhone
 
OpenGL ES 1.1 и 2.0 для разработки iPhone игр
OpenGL ES 1.1 и 2.0 для разработки iPhone игрOpenGL ES 1.1 и 2.0 для разработки iPhone игр
OpenGL ES 1.1 и 2.0 для разработки iPhone игр
 
Использование современных мобильных техноолгий в медиабизнесе
Использование современных мобильных техноолгий в медиабизнесеИспользование современных мобильных техноолгий в медиабизнесе
Использование современных мобильных техноолгий в медиабизнесе
 
Stanfy - Mobile Apps as Newest Media
Stanfy - Mobile Apps as Newest MediaStanfy - Mobile Apps as Newest Media
Stanfy - Mobile Apps as Newest Media
 
Владимир Пузанов - JailBreak: Разработка без лимитов
Владимир Пузанов - JailBreak: Разработка без лимитовВладимир Пузанов - JailBreak: Разработка без лимитов
Владимир Пузанов - JailBreak: Разработка без лимитов
 
Павел Тайкало - Использование CoreData в iPhone приложения
Павел Тайкало - Использование CoreData в iPhone приложенияПавел Тайкало - Использование CoreData в iPhone приложения
Павел Тайкало - Использование CoreData в iPhone приложения
 
Taras Kornichuk - Ценности социальной игровой платформы для разработчиков и и...
Taras Kornichuk - Ценности социальной игровой платформы для разработчиков и и...Taras Kornichuk - Ценности социальной игровой платформы для разработчиков и и...
Taras Kornichuk - Ценности социальной игровой платформы для разработчиков и и...
 
Использование iPhone приложений в Бизнесе, Маркетинге и PR
Использование iPhone приложений в Бизнесе, Маркетинге и PRИспользование iPhone приложений в Бизнесе, Маркетинге и PR
Использование iPhone приложений в Бизнесе, Маркетинге и PR
 
Индустрия iPhone приложений
Индустрия iPhone приложенийИндустрия iPhone приложений
Индустрия iPhone приложений
 
Sapka Contest 2009 (RU)
Sapka Contest 2009 (RU)Sapka Contest 2009 (RU)
Sapka Contest 2009 (RU)
 
Sapka Contest 2009 (UA)
Sapka Contest 2009 (UA)Sapka Contest 2009 (UA)
Sapka Contest 2009 (UA)
 

In-App-Purchases и с чем их едят

  • 1. In-App Purchases и с чем их едят...
  • 5. Встроенная модель • Позволяет разблокировать features внутри приложения • Все features должны быть встроены в само приложение StoreKit не отвечает за все манипуляции после подтверждения покупки
  • 6. Серверная модель • Позволяет «отправлять» features с сервера • «Мы в ответе за тех кого приручили»
  • 8.
  • 12. Примеры кода 1. Доступен ли магазин if ([[SKPaymentQueue defaultQueue] canMakePayments]) { ... // Тут показываем пользователю магазин } else { ... // Магазин недоступен - делаем что-либо другое } 2. Получаем информацию о продуктах - (void) requestProductData { SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject: kMyFeatureIdentifier]]; request.delegate = self; [request start]; } - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { NSArray *myProduct = response.products; // Показываем графический интерфейс тут [request autorelease]; }
  • 13. 3. Добавляем собственный Observer MyStoreObserver *observer = [[MyStoreObserver alloc] init]; [[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; 4. Добавляем в queue - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { for (SKPaymentTransaction *transaction in transactions) { switch (transaction.transactionState) { case SKPaymentTransactionStatePurchased: [self completeTransaction:transaction]; break; case SKPaymentTransactionStateFailed: [self failedTransaction:transaction]; break; case SKPaymentTransactionStateRestored: [self restoreTransaction:transaction]; default: break; } } }
  • 14. 5. Завершаем транзакцию - (void) completeTransaction: (SKPaymentTransaction *)transaction { // Приложение использует вот эти две собственных функции. [self recordTransaction: transaction]; [self provideContent: transaction.payment.productIdentifier]; // Убираем транзакцию из queue. [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; } 6. Восстановленная транзакция - (void) restoreTransaction: (SKPaymentTransaction *)transaction { [self recordTransaction: transaction]; [self provideContent: transaction.originalTransaction.payment.productIdentifier]; [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; } 7. Неуспешная транзакция - (void) failedTransaction: (SKPaymentTransaction *)transaction { if (transaction.error.code != SKErrorPaymentCancelled) { // Тут показываем ошибку в UI } [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; }
  • 15. 8. Последние штрихи SKPayment *payment = [SKPayment paymentWithProductIdentifier:kMyFeatureIdentifier]; [[SKPaymentQueue defaultQueue] addPayment:payment]; или SKMutablePayment *payment = [SKMutablePayment paymentWithProductIdentifier:kMyFeatureIdentifier]; payment.quantity = 3; [[SKPaymentQueue defaultQueue] addPayment:payment];
  • 16. Немного JSON HTTP POST. https://buy.itunes.apple.com/verifyReceipt { "receipt-data" : "(NSData*)transactionReceipt + base64" } Ответ сервера { "status" : 0 "receipt" : { ... } }
  • 17. JSON quantity Кол-во приобретенных продуктов product_id Идентификатор купленного продукта. То же самое мы получаем при productIdentifier из SKPayment. transaction_id Идентификатор транзакции. То же самое мы получаем из transactionIdentifier нашей транзакции. purchase_date Время и дата покупки. То же самое мы получаем из transactionDate нашей транзакции. original_transaction_id Индетификатор изначальной транзакции. original_purchase_date Время и дата оригинальной транзакции. app_item_id Идентификатор приложения от Apple. Недоступен в режиме Sandbox. version_external_identifier Ревизия приложения. Недоступно в режиме Sandbox. bid Bundle нашего приложения. bvrs Версия нашего приложения.
  • 18. Всем Спасибо. Вопросы? Контакты skype: soul.odessa email: soul.odessa@gmail.com icq: 207627325