Spec-Zone.ru › Qt 5.9

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

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

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

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

import QtPurchasing 1.0

Добавьте следующее утверждение в ваш .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.9/qtpurchasing-gettingstarted-qml.html

Spec-Zone.ru

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