Тип QML продукта
Продукт для внутриприложений покупок. Подробнее...
| Заявление импорта: | import QtPurchasing 1.13 |
| С момента: | QtPurchasing 1.0 |
Свойства
- описание : строка
- идентификатор : строка
- цена : строка
- статус : перечисление
- магазин : объект
- название : строка
- тип : строка
Сигналы
- onPurchaseFailed(transaction)
- onPurchaseRestored(transaction)
- onPurchaseSucceeded(transaction)
Методы
- purchase()
- resetStatus()
Подробное описание
Продукт содержит информацию о продукте на внешнем рынке. После установки идентификатора идентификатора и типа типа продукта, он будет запрошен на внешнем рынке. Затем будут установлены такие свойства, как цена, и будет возможность приобрести продукт. Свойство статус содержит информацию о процессе регистрации.
Примечание: Невозможно изменить идентификатор и тип после их установки и регистрации продукта.
Документация по свойствам
описание : строка
Это свойство содержит описание продукта после его успешного запроса с внешнего рынка. Название локализовано, если внешний рынок определил описание на локальном языке текущего пользователя.
идентификатор : строка
Это свойство содержит идентификатор продукта на внешнем рынке. Он должен соответствовать идентификатору, используемому для регистрации продукта на внешнем рынке заранее.
Когда установлены и идентификатор, и тип, продукт запрашивается на внешнем рынке, а другие его свойства обновляются асинхронно. В этот момент идентификатор и тип больше нельзя изменять.
Следующий пример запрашивает продукт разблокирования с именем "myUnlockableProduct" на внешнем рынке.
Store {
Product {
identifier: "myUnlockableProduct"
type: Product.Unlockable
// ...
}
} цена : строка
Это свойство содержит цену продукта после успешного запроса с внешнего рынка. Цена — это строка, содержащая валюту и значение, обычно локализованная для текущего пользователя.
Например, следующий пример отображает цену продукта разблокирования с именем "myUnlockableProduct":
Store {
Product {
id: myUnlockableProduct
identifier: "myUnlockableProduct"
type: Product.Unlockable
// ...
}
}
Text {
text: myUnlockableProduct.status === Product.Registered
? "Price is " + myUnlockableProduct.price
: "Price unknown at the moment"
} При запуске в норвежской локализации этот код может, например, отобразить "Цена составляет 6,00 крон" для продукта стоимостью один доллар.
статус : перечисление
Это свойство содержит текущий статус продукта в процессе регистрации.
- Product.Uninitialized — начальный статус, до установки свойства identifier.
- Product.PendingRegistration — указывает, что продукт в настоящее время запрашивается на внешнем рынке. Продукт получает этот статус при установке идентификатора.
- Product.Registered — указывает, что продукт был успешно найден на внешнем рынке. Теперь можно запросить его цену и приобрести продукт.
- Product.Unknown — продукт не был найден на внешнем рынке. Это может быть, например, из-за опечатки в идентификаторе продукта.
Store {
Product {
identifier: "myConsumableProduct"
type: Product.Consumable
onStatusChanged: {
switch (status) {
case Product.PendingRegistration: console.debug("Registering " + identifier); break
case Product.Registered: console.debug(identifier + " registered with price " + price); break
case Product.Unknown: console.debug(identifier + " was not found in the market place"); break
}
}
// ...
}
} магазин : объект
Это свойство содержит магазин, содержащий продукт. Когда продукт создается как дочерний элемент магазина, это свойство автоматически устанавливается в родительский элемент, как в следующем примере:
Store {
Product {
// No need to set the store explicitly here, as it will automatically be
// bound to the parent
identifier: "myConsumableProduct"
type: Product.Consumable
}
Product {
// No need to set the store explicitly here, as it will automatically be
// bound to the parent
identifier: "myUnlockableProduct"
type: Product.Unlockable
}
} Однако в некоторых продвинутых случаях, например, при создании продуктов на основе модели, также возможно создать продукт в любом месте документа QML и явно установить магазин, как в следующем примере:
ListModel {
id: productModel
ListElement {
productIdentifier: "myConsumableProduct"
productType: Product.Consumable
}
ListElement {
productIdentifier: "myUnlockableProduct"
productType: Product.Unlockable
}
}
Store {
id: myStore
}
Instantiator {
model: productModel
delegate: Product {
identifier: productIdentifier
type: productType
store: myStore
}
} название : строка
Это свойство содержит название продукта после успешного запроса с внешнего рынка. Название локализовано, если внешний рынок определил название на языке текущего пользователя.
тип : строка
Это свойство содержит тип продукта на внешнем рынке.
- Product.Consumable — продукт является расходуемым и может быть приобретен более одного раза одним пользователем, при условии, что транзакция предыдущей покупки завершена.
- Product.Unlockable — продукт может быть приобретен только один раз пользователем. Если приложение удалено и установлено заново на устройстве (или установлено на новом устройстве тем же пользователем), покупки продуктов разблокирования могут быть восстановлены с помощью метода restorePurchases() магазина.
Когда установлены и идентификатор идентификатора, и тип, продукт запрашивается на внешнем рынке, а другие его свойства обновляются асинхронно. В этот момент идентификатор и тип больше нельзя изменять.
Следующий пример запрашивает продукт разблокирования с именем "myUnlockableProduct" на внешнем рынке.
Store {
Product {
identifier: "myUnlockableProduct"
type: Product.Unlockable
// ...
}
} Документация по сигналам
onPurchaseFailed(transaction)
Этот обработчик вызывается, когда запрос на покупку продукта не удался. Это обычно происходит, если приложение вызывает purchase() для продукта, и пользователь отменяет покупку. Это также может произойти и в других обстоятельствах, например, при отсутствии подходящего сетевого соединения.
Все продукты должны иметь обработчик onPurchaseFailed.
После выполнения соответствующей реакции функция finalize() должна быть вызвана для объекта transaction. Если этого не сделать, обработчик может быть вызван снова при следующей регистрации продукта.
Следующий пример реагирует на неудачную попытку покупки, вызывая пользовательскую функцию для отображения сообщения пользователю.
Store {
Product {
id: myConsumableProduct
identifier: "myConsumableProduct"
type: Product.Consumable
onPurchaseFailed: {
myDisplayHelper.message("Product was not purchased. You have not been charged.")
transaction.finalize()
}
// ...
}
} onPurchaseRestored(transaction)
Этот обработчик вызывается, когда ранее купленный продукт разблокирования восстановлен. Это может произойти при вызове функции restorePurchases() в текущем магазине Store. Обработчик onPurchaseRestored затем будет вызван для каждого продукта разблокирования, который был ранее куплен пользователем.
Приложения, использующие функцию restorePurchases(), должны включать этот обработчик во все продукты разблокирования. В обработчике приложение должно убедиться, что информация о покупке сохранена, и вызвать finalize() для объекта transaction, если информация была успешно сохранена (или была проверена, что уже сохранена).
Следующий пример вызывает пользовательскую функцию, которая либо сохраняет информацию о покупке, либо проверяет, что она уже сохранена. Когда данные проверены, транзакция завершается. Если проверка не удалась, вызывается другая пользовательская функция для отображения сообщения об ошибке пользователю. Если транзакция не завершена, обработчик будет вызван снова для той же транзакции при следующей регистрации продукта (при запуске приложения).
Store {
Product {
id: myUnlockableProduct
identifier: "myUnlockableProduct"
type: Product.Unlockable
onPurchaseRestored: {
if (myStorage.savePurchaseInformation(identifier)) {
transaction.finalize()
} else {
myDisplayHelper.message("Failed to store purchase information. Is there available storage?")
}
}
// ...
}
} onPurchaseSucceeded(transaction)
Этот обработчик вызывается, когда продукт успешно приобретен. Он срабатывает, когда приложение вызывает purchase() для продукта, и пользователь подтверждает покупку, например, введя свой пароль.
Все продукты должны иметь обработчик onPurchaseSucceeded. Этот обработчик должен, в свою очередь, сохранять информацию о приобретенном продукте, а после успешного сохранения и проверки информации он должен вызвать finalize() для объекта transaction.
Обработчик должен поддерживать вызов несколько раз для одной и той же покупки. Например, выполнение приложения может быть случайно прервано после сохранения информации о покупке, но до завершения транзакции. В этом случае обработчик должен проверить, что информация уже сохранена в постоянном хранилище, а затем завершить транзакцию.
Следующий пример пытается сохранить состояние покупки расходуемого продукта, используя пользовательскую функцию. Он завершает транзакцию только в случае успешного сохранения данных. В противном случае вызывается другая пользовательская функция для отображения сообщения об ошибке пользователю.
Store {
Product {
id: myConsumableProduct
identifier: "myConsumableProduct"
type: Product.Consumable
onPurchaseSucceeded: {
if (myStorage.savePurchaseInformation(identifier)) {
transaction.finalize()
} else {
myDisplayHelper.message("Failed to store purchase information. Is there available storage?")
}
}
// ...
}
} Если транзакция не завершена, обработчик onPurchaseSucceeded будет вызван снова при следующей регистрации продукта (при запуске приложения). Это означает, что если сохранение информации не удалось, у пользователя будет возможность исправить проблему (например, удалить что-то другое, чтобы освободить место для данных), и транзакция будет завершена после перезапуска приложения и решения проблемы.
Примечание: Приобретённый, расходный продукт нельзя приобрести повторно, пока предыдущая транзакция не будет завершена.
Документация по методам
purchase()
Запускает процесс покупки данного продукта. Процесс покупки асинхронный. По завершении процесса вызывается обработчик onPurchaseSucceeded или onPurchaseFailed в объекте с полученной транзакцией.
resetStatus()
Сбрасывает статус этого продукта и повторно пытается запросить его из внешнего рынка.
Этот метод можно использовать, когда запрос продукта не удался по какой-либо причине (например, из-за таймаута сети).
Этот метод был добавлен в QtPurchasing 1.0.2.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qml-qtpurchasing-product.html