В прошлой статье мы познакомились с основами StoreKit 2 и узнали, как легко мы можем монетизировать наши приложения. В этой мы продолжим тему, узнав о представлениях StoreKit в SwiftUI. StoreKit 2 представляет дефолтные представления SwiftUI, позволяющие нам быстро создавать пейволы или экраны для магазинов цифровых товаров.
StoreKit 2 предоставляет тип ProductView, позволяющий легко отображать и обрабатывать покупки в приложении для одного продукта. Для этого достаточно разместить в иерархии представлений экземпляр ProductView с определенным идентификатором товара.
struct ContentView: View { var body: some View { ProductView(id: "55667744") } }
Как видно из приведенного примера, мы можем вызвать экземпляр ProductView одной строкой кода, но за этой строкой скрывается вся сложность загрузки и покупки товаров в App Store. StoreKit предоставляет нам набор стилей для отображения продукта в различных видах. Мы можем использовать модификатор вида productViewStyle, чтобы использовать определенный стиль. По умолчанию StoreKit использует автоматический стиль, но мы можем использовать стили large, regular или compact.
struct ContentView: View { var body: some View { ProductView(id: "55667744") .productViewStyle(.compact) } }
Можно также включить показ изображения, если оно загружено на серверы App Store. Инициализатор ProductView имеет еще один параметр, называемый prefersPromotionalIcon. Его можно использовать для отображения иконки продвигаемого товара.
struct ContentView: View { var body: some View { ProductView(id: "55667744", prefersPromotionalIcon: true) } }
Если вместо изображения для товара требуется нарисовать пользовательское представление SwiftUI, то это возможно с помощью перегрузки другого инициализатора ProductView.
ProductView(id: "55667744") { _ in Image(systemName: "crown") .resizable() .scaledToFit() } placeholderIcon: { ProgressView() } .productViewStyle(.large)
Как видно из приведенного примера, можно обрабатывать различные состояния загрузки рекламного изображения и при необходимости заменять его собственным представлением SwiftUI.
Другой вариант — построить полностью индивидуальное представление товара, введя собственный стиль. В этом случае мы должны создать тип, соответствующий протоколу ProductViewStyle.
struct CustomProductStyle: ProductViewStyle { func makeBody(configuration: Configuration) -> some View { switch configuration.state { case .loading: ProgressView() case .success(let product): Button { configuration.purchase() } label: { VStack { Text(verbatim: product.displayName) .font(.headline) Text(verbatim: product.displayPrice) } } .buttonStyle(.borderedProminent) default: Text("Something goes wrong...") } } } struct ContentView: View { var body: some View { ProductView(id: "55667744") .productViewStyle(CustomProductStyle()) } }
Тут мы определяем тип CustomProductStyle в соответствии с протоколом ProductViewStyle. Протокол ProductViewStyle имеет единственное требование — это функция makeBody. Функция makeBody имеет параметр типа ProductViewStyleConfiguration, предоставляющий нам всю необходимую информацию о товаре, состоянии загрузки и функциональности покупки.
Мы можем использовать различные стили продукта для построения нужной нам схемы. Давайте сделаем пейвол, отображающий варианты подписки и пожизненных покупок в приложении.
struct ContentView: View { var body: some View { ScrollView { ProductView(id: "55667744") { _ in Image(systemName: "crown") .resizable() .scaledToFit() } placeholderIcon: { ProgressView() } .productViewStyle(.large) VStack(spacing: 16) { ForEach(["123456789", "987654321"], id: \.self) { id in ProductView(id: id) .productViewStyle(.compact) } } .padding() } } }
Как видите, мы реализуем различные варианты отображения для списка доступных покупок всего в нескольких строках кода. А созданный нами пользовательский интерфейс поддерживает покупки и автоматически отслеживает возврат средств. Но представления StoreKit в SwiftUI на этом не заканчиваются. Он также дает нам представление StoreView, отображающее коллекцию товаров в различных макетах в зависимости от доступного пространства.
struct ContentView: View { var body: some View { ScrollView { ProductView(id: "55667744") { _ in Image(systemName: "crown") .resizable() .scaledToFit() } placeholderIcon: { ProgressView() } .productViewStyle(.large) StoreView( ids: [ "123456789", "987654321" ] ) .productViewStyle(.compact) } } }
StoreView отображает макет коллекции товаров. Например, в tvOS StoreView использует сетку для отображения товаров. Вы можете настроить внешний вид продуктов, отображаемых в StoreView, применив к нему модификатор вида productViewStyle.
struct ContentView: View { var body: some View { ScrollView { ProductView(id: "55667744") { _ in Image(systemName: "crown") .resizable() .scaledToFit() } placeholderIcon: { ProgressView() } .productViewStyle(.large) StoreView( ids: [ "123456789", "987654321" ] ) .productViewStyle(.compact) .storeButton(.visible, for: .restorePurchases) } } }
Кроме того, StoreView предоставляет набор кнопок, таких как кнопки восстановления транзакций или отмены, прямо “из коробки”. Вы можете управлять видимостью конкретной кнопки с помощью модификатора вида storeButton.
Сегодня мы познакомились с представлениями SwiftUI, которые StoreKit 2 предоставляет нам для создания пейволов в наших приложениях. Надеюсь, вам понравился этот пост. Спасибо, что прочитали, и до новых встреч!