В этой серии статей мы говорили о 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 с помощью новых модификаторов представлений. Надеюсь, вам понравился этот пост.