Spec-Zone.ru › Qt 5.12

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

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

Заявление импорта: import QtPurchasing 1.12
С момента: 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"
}

При выполнении в норвежской локали этот код, например, может отобразить "Цена составляет kr 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.12/qml-qtpurchasing-product.html

Spec-Zone.ru

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