Connect with us

Разработка

Осваиваем StoreKit 2: модификаторы представлений в SwiftUI

В целом, представления StoreKit полностью справляются с загрузкой и покупками в приложении. Но иногда для реагирования необходимо знать текущий шаг в потоке.

Опубликовано

/

     
     

В этой серии статей мы говорили о StoreKit 2. На этой неделе мы завершим цикл, рассмотрев набор модификаторов представлений, которые StoreKit 2 предоставляет нам для использования в представлениях SwiftUI.

В целом, представления StoreKit полностью справляются с загрузкой и покупками в приложении. Но иногда для реагирования необходимо знать текущий шаг в потоке. Например, может потребоваться отключить платный экран, когда пользователь завершает покупку, или показать индикатор загрузки в ожидании результата работы сервера App Store.

struct PaywallView: View {
    @Environment(\.dismiss) private var dismiss
    
    var body: some View {
        SubscriptionStoreView(groupID: "598392E1")
            .onInAppPurchaseStart { product in
                print(product.displayName)
            }
            .onInAppPurchaseCompletion { product, result in
                dismiss()
            }
    }
}

StoreKit 2 предоставляет нам модификаторы представления onInAppPurchaseStart и onInAppPurchaseCompletion для обработки начала и завершения любой покупки в иерархии представлений с помощью представлений StoreKit. Оба модификатора принимают closure для выполнения и имеют в качестве параметров продукт и результат покупки.

Еще одним модификатором представления, упрощающим нашу работу, является модификатор subscriptionStatusTask. Он позволяет нам постоянно наблюдать за состоянием определенной группы подписок. Он обновляет информацию при каждом изменении состояния подписки.

struct ContentView: View {
    @State private var paywallShown = false
    @State private var isPro = false
    
    var body: some View {
        RootView()
            .sheet(isPresented: $paywallShown) {
                PaywallView()
            }
            .subscriptionStatusTask(for: "598392E1") { taskState in
                if let value = taskState.value {
                    isPro = !value
                        .filter { $0.state != .revoked && $0.state != .expired }
                        .isEmpty
                } else {
                    isPro = false
                }
            }
    }
}

Как видно из приведенного примера, мы используем модификатор представления subscriptionStatusTask для наблюдения за состоянием конкретной группы подписок. Как вы могли заметить, мы предоставляем замыкание, обрабатывающее изменение статуса подписки, и в качестве параметра оно принимает массив статусов подписки. Массив вместо одного значения используется потому, что пользователь может как приобрести подписку, так и иметь доступ к ней через семейный шаринг.

Модификатор представления subscriptionStatusTask работает только с подписками. StoreKit 2 предоставляет модификатор представления currentEntitlementTask для расходуемых и нерасходуемых покупок. Он работает аналогично модификатору представления subscriptionStatusTask, но вместо этого предоставляет опциональную транзакцию конкретного продукта.

struct ContentView: View {
    @State private var paywallShown = false
    @State private var isPro = false
    
    var body: some View {
        RootView()
            .sheet(isPresented: $paywallShown) {
                PaywallView()
            }
            .currentEntitlementTask(for: "1232") { taskState in
                if let verification = taskState.transaction,
                   let transaction = try? verification.payloadValue {
                    isPro = transaction.revocationDate == nil
                } else {
                    isPro = false
                }
            }
    }
}

Модификатор представления currentEntitlementTask позволяет нам предоставить closure, принимающее опциональную транзакцию, обернутую в тип VerificationResult. Необязательной она является потому, что для данного товара транзакция может отсутствовать. Всякий раз, когда пользователь приобретает или отказывается от покупки товара, StoreKit 2 запускает подключенное замыкание.

Еще один модификатор представления, который предоставляет нам StoreKit 2, — это модификатор storeProductsTask. Он позволяет загрузить список товаров и наблюдать за ними. Он запускает предоставленное замыкание при каждом изменении любого товара в коллекции.

struct ContentView: View {
    @State private var paywallShown = false
    
    var body: some View {
        RootView()
            .sheet(isPresented: $paywallShown) {
                PaywallView()
            }
            .storeProductTask(for: "12763") { taskState in
                print(taskState.product?.displayName)
            }
    }
}

Сегодня мы узнали, как работать со StoreKit 2 из представлений SwiftUI с помощью новых модификаторов представлений. Надеюсь, вам понравился этот пост.

Другие статьи о StoreKit 2

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.

Наши партнеры:

LEGALBET

Мобильные приложения для ставок на спорт
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: