Тип QML продукта
Продукт для внутриприложной покупки. Подробнее...
| Оператор импорта: | import QtPurchasing 1.14 |
| С момента: | QtPurchasing 1.0 |
Свойства
- description : строка
- identifier : строка
- price : строка
- status : перечисление
- store : объект
- title : строка
- type : строка
Сигналы
- onPurchaseFailed(transaction)
- onPurchaseRestored(transaction)
- onPurchaseSucceeded(transaction)
Методы
- purchase()
- resetStatus()
Подробное описание
Продукт содержит информацию о продукте на внешней торговой площадке. После установки свойств identifier и type продукт будет запрошен с внешней торговой площадки. Затем будут установлены свойства, такие как price, и можно будет приобрести продукт. Свойство status содержит информацию о процессе регистрации.
Примечание: Невозможно изменить идентификатор и тип после их установки и регистрации продукта.
Документация свойств
description : string
Это свойство содержит описание продукта после успешного запроса с внешней торговой площадки. Заголовок локализован, если внешняя торговая площадка определила описание в текущем языке пользователя.
identifier : string
Это свойство содержит идентификатор продукта на внешней торговой площадке. Он должен соответствовать идентификатору, использованному для предварительной регистрации продукта.
При установке и идентификатора и type продукт запрашивается с внешней торговой площадки, и его другие свойства обновляются асинхронно. На этом этапе идентификатор и тип больше нельзя изменить.
Следующий пример запрашивает продукт "myUnlockableProduct" с внешней торговой площадки.
Store {
Product {
identifier: "myUnlockableProduct"
type: Product.Unlockable
// ...
}
} price : string
Это свойство содержит цену продукта после успешного запроса с внешней торговой площадки. Цена — это строка, содержащая валюту и значение, и обычно локализована для текущего пользователя.
Например, следующий пример отображает цену продукта "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 крон" для продукта стоимостью один доллар.
status : перечисление
Это свойство содержит текущий статус продукта в процессе регистрации.
- 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 : объект
Это свойство содержит магазин, содержащий продукт. При создании продукта как дочернего элемента магазина это свойство автоматически устанавливается в родительский элемент, как в следующем примере:
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
}
} title : string
Это свойство содержит заголовок продукта после успешного запроса с внешней торговой площадки. Заголовок локализован, если внешняя торговая площадка определила заголовок в текущем языке пользователя.
type : string
Это свойство содержит тип продукта на внешней торговой площадке.
- Product.Consumable — Продукт является расходным и может быть приобретен более одного раза одним пользователем, при условии, что транзакция по предыдущей покупке завершена.
- Product.Unlockable — Продукт может быть приобретен только один раз пользователем. Если приложение удалено и переустановлено на устройстве (или установлено на новое устройство тем же пользователем), покупки продуктов unlockable можно восстановить, используя метод restorePurchases() магазина.
При установке и идентификатора и identifier продукта запрашивается с внешней торговой площадки, и его другие свойства обновляются асинхронно. На этом этапе идентификатор и тип больше нельзя изменить.
Следующий пример запрашивает продукт "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)
Этот обработчик вызывается при восстановлении ранее купленного продукта unlockable. Это может произойти при вызове функции restorePurchases() в текущем магазине Store. Затем будет вызван обработчик onPurchaseRestored для каждого продукта unlockable, который ранее был куплен пользователем.
Приложения, использующие функцию restorePurchases(), должны включать этот обработчик во все продукты unlockable. В обработчике приложение должно убедиться, что информация о покупке сохранена, и вызвать 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.14/qml-qtpurchasing-product.html