Spec-Zone.ru › Qt 5.14

Начало работы с Qt Purchasing в QML

Это руководство предполагает, что вы зарегистрировали продукты в приложении в внешнем магазине. Дополнительную информацию о регистрации продуктов см. в Регистрация продуктов в Google Play и Регистрация продуктов в App Store

Подготовка приложения

Используйте следующее import утверждение в файлах QML для доступа к типам QML Qt Purchasing:

import QtPurchasing 1.14

Добавьте следующее утверждение в ваш .pro файл для связи с библиотекой Qt Purchasing:

QT += purchasing

Регистрация продуктов

Прежде чем вы сможете работать с продуктами в своем коде, они должны быть зарегистрированы в графике QML. Начните с создания элемента Store, а затем создайте каждый продукт как дочерний элемент этого элемента.

Store {
    Product {
        identifier: "consumableProduct"
        type: Product.Consumable

        // ...
    }

    Product {
        identifier: "unlockableProduct"
        type: Product.Unlockable

        // ...
    }
}

Как видите, существуют расходные продукты и продукты, открывающие возможности. Первые могут быть приобретены неограниченное количество раз одним и тем же пользователем, а вторые — только один раз.

Описание продукта

Для каждого продукта необходимо заполнить identifier, прежде чем продукт можно будет запросить из внешнего магазина. Вы также всегда должны добавить обработчик onPurchaseSucceeded и onPurchaseFailed, если вы намерены предоставить возможность покупки продуктов. Если вы также используете функцию восстановления, добавьте обработчик onPurchaseRestored для продуктов, открывающих возможности.

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

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

Store {
    id: store
    Product {
        id: healthPotionProduct
        identifier: "healthPotion"
        type: Product.Consumable

        property bool purchasing: false

        onPurchaseSucceeded: {
            if (!hasAlreadyStoredTransaction(transaction.orderId)) {
                ++healthPotions
                if (!addHealthPotionToPersistentStorage(transaction.orderId)) {
                    popupErrorDialog(qsTr("Unable to write to persistent storage. Please make sure there is sufficient space and restart."))
                } else {
                    transaction.finalize()
                }
            }

            // Reset purchasing flag
            purchasing = false
        }

        onPurchaseFailed: {
            popupErrorDialog(qsTr("Purchase not completed."))
            transaction.finalize()

            // Reset purchasing flag
            purchasing = false
        }
    }
}

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

Покупка продукта

Чтобы приобрести продукт, вызовите метод purchase() объекта. Это запускает платформенно-специфичный асинхронный процесс покупки продукта, например, путем запроса пароля пользователя и подтверждения покупки. В большинстве случаев следует убедиться, что пользовательский интерфейс приложения не принимает ввод во время обработки запроса на покупку, так как это не обрабатывается автоматически на всех платформах.

В следующем примере добавлена кнопка, которая используется с примером продукта в предыдущем разделе:

Rectangle {
    id: button
    width: 100
    height: 50

    Text {
        anchors.centerIn: parent
        text: qsTr("Buy health potion for only " + healthPotionProduct.price + "!")
    }

    MouseArea {
        enabled: !healthPotionProduct.purchasing && healthPotionProduct.status === Product.Registered
        anchors.fill: parent
        onClicked: {
            healthPotionProduct.purchasing = true
            healthPotionProduct.purchase()
        }
    }
}

При нажатии кнопки запускается процесс покупки. В какой-то момент в будущем будет вызван обработчик onPurchaseFailed (например, если пользователь отменит транзакцию) или обработчик onPurchaseSucceeded.

Примечание: Кнопка включена только в том случае, если статус продукта установлен как Registered. Процесс регистрации продукта асинхронный, поэтому попытки покупки продукта до его успешной регистрации всегда будут неудачными.

Восстановление ранее приобретенных продуктов

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

Чтобы начать процесс восстановления покупок, вызовите метод restorePurchases() в объекте Store. Это приведет к вызову обработчика onPurchaseRestored для каждого продукта, открывающего возможности, в приложении, который ранее был куплен текущим пользователем.

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

Store {
    id: store

    // ... other products

    Product {
        id: dlcForestOfFooBarProduct
        identifier: "dlcForestOfFooBar"
        type: Product.Unlockable

        property bool purchasing: false

        onPurchaseSucceeded: {
            if (!hasMap("forestOfFooBar.map")) {
                if (!downloadExtraMap("forestOfFooBar.map")) {
                    popupErrorDialog(qsTr("Unable to download The Forest of FooBar map. Please make sure there is sufficient space and restart."))
                } else {
                    transaction.finalize()
                }
            }

            // Reset purchasing flag
            purchasing = false
        }

        onPurchaseFailed: {
            popupErrorDialog(qsTr("Purchase not completed."))
            transaction.finalize()

            // Reset purchasing flag
            purchasing = false
        }

        onPurchaseRestored: {
            if (!hasMap("forestOfFooBar.map")) {
                if (!downloadExtraMap("forestOfFooBar.map")) {
                    popupErrorDialog(qsTr("Unable to download The Forest of FooBar map. Please make sure there is sufficient space and restart."))
                } else {
                    transaction.finalize()
                }
            }
        }
    }
}

Если пользователь купит загружаемый контент, а затем установит игру на другое устройство или удалит и переустановит игру, вы можете предоставить способ восстановления покупки, например, следующую кнопку:

Rectangle {
    id: restoreButton
    width: 100
    height: 50

    Text {
        anchors.centerIn: parent
        text: "Restore previously purchased content"
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            store.restorePurchases()
        }
    }
}

Восстановление покупок всегда должно выполняться как реакция на пользовательский ввод, так как на некоторых платформах может появиться диалоговое окно с паролем. Вызов метода restorePurchases() запускает процесс восстановления асинхронно. В какой-то момент в будущем, если продукт был ранее приобретен, будет вызван обработчик onPurchaseRestored.

Примечание: Хотя функция работает в соответствии с документацией на Android, эта функциональность технически не требуется там. Причина в том, что устройство Android управляет всеми покупками, открывающими возможности, без вмешательства приложения. Если приложение удалено и повторно установлено (или установлено на другое устройство) на Android, то для каждого ранее приобретенного продукта, открывающего возможности, при запуске приложения будет вызван onPurchaseSucceeded.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qtpurchasing-gettingstarted-qml.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API