Spec-Zone.ru › Qt 5.9

Тип QML продукта

Продукт для внутриприложной покупки. Подробнее...

Заявление об импорте: import QtPurchasing 1.0
С тех пор: 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()

Сбрасывает состояние этого продукта и повторно пытается запросить его из внешнего рынка.

Этот метод можно использовать, если запрос продукта завершился неудачно по какой-либо причине (например, из-за таймаутов сети).

Этот метод QML был добавлен в QtPurchasing 1.0.2.

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

Spec-Zone.ru

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