Расширенная функциональность
Чтение квитанции о приложении
На устройстве хранится Квитанция приложения. локальное хранилище и может быть прочитано следующим образом:
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
строка получения = builder.Configure<IAppleConfiguration>().appReceipt;
Проверка ограничений на оплату
Покупки в приложении могут быть ограничены в настройках устройства, что можно проверить следующим образом:
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
bool canMakePayments = builder.Configure<IAppleConfiguration>().canMakePayments;
Восстановление транзакций
На платформах Apple пользователи должны вводить свой пароль для получения предыдущих транзакций, поэтому ваше приложение должно предоставить пользователям кнопку, позволяющую им это сделать. Во время этого процесса метод ProcessPurchase
вашего IStoreListener
будет вызываться для любых элементов, которыми уже владеет пользователь.
/// <summary>
/// Your IStoreListener implementation of OnInitialized.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
extensions.GetExtension<IAppleExtensions> ().RestoreTransactions (result => {
if (result) {
// This does not mean anything was restored,
// merely that the restoration process succeeded.
} else {
// Restoration failed.
}
});
}
Обновление квитанции о приложении
Apple предоставляет механизм для получения новой квитанции приложения со своих серверов, который обычно используется, когда квитанция в настоящее время не кэшируется в локальном хранилище; SKReceiptRefreshRequest.
Обратите внимание, что пользователю будет предложено ввести пароль.
Unity IAP делает этот метод доступным следующим образом:
/// <summary>
/// Your IStoreListener implementation of OnInitialized.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
extensions.GetExtension<IAppleExtensions> ().RefreshAppReceipt (receipt => {
// This handler is invoked if the request is successful.
// Receipt will be the latest app receipt.
Console.WriteLine(receipt);
},
() => {
// This handler will be invoked if the request fails,
// such as if the network is unavailable or the user
// enters the wrong password.
});
}
Попросить купить
В iOS 8 появилась новая функция родительского контроля под названием Попросить купить.
Покупки с запросом на покупку откладываются до одобрения родителей. В этом случае Unity IAPсокращение от Unity In App Purchase
See in Словарь отправляет вашему приложению уведомление следующим образом:
/// This is called when Unity IAP has finished initialising.
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
extensions.GetExtension<IAppleExtensions>().RegisterPurchaseDeferredListener(product => {
Console.WriteLine(product.definition.id);
});
}
Включить симуляцию «Попроси купить» в магазине приложений «Песочница»
Приведенный ниже образец класса демонстрирует, как получить доступ к IAppleExtensions
, чтобы включить симуляцию с запросом на покупку в магазине приложений для песочницы:
using UnityEngine;
using UnityEngine.Purchasing;
public class AppleSimulateAskToBuy : MonoBehaviour {
public void SetSimulateAskToBuy(bool shouldSimulateAskToBuy) {
if (Application.platform == RuntimePlatform.IPhonePlayer) {
IAppleExtensions extensions = IAPButton.IAPButtonStoreManager.Instance.ExtensionProvider.GetExtension<IAppleExtensions>();
extensions.simulateAskToBuy = shouldSimulateAskToBuy;
}
}
}
Когда покупка одобрена или отклонена, вызываются обычные методы вашего магазина ProcessPurchase
или OnPurchaseFailed
.
Квитанции о транзакциях
Иногда расходуемые покупки с запросом на покупку не отображаются в квитанции приложения, и в этом случае вы не можете подтвердить их с помощью этой квитанции. Однако iOSмобильная операционная система Apple. Подробнее
See in Словарь содержит квитанцию о транзакции, содержащую все покупки, включая «Попросить купить». . Получите доступ к самой последней строке квитанции о транзакции для данного Product
, используя IAppleExtensions
.
Примечание. Квитанции о транзакциях недоступны для сборок Mac. Запрос квитанции о транзакции на сборке Mac приводит к пустой строке.
#if UNITY_PURCHASING
using System;
using UnityEngine;
using UnityEngine.Purchasing;
public class AskToBuy : MonoBehaviour, IStoreListener
{
// Unity IAP objects
private IStoreController m_Controller;
private IAppleExtensions m_AppleExtensions;
public AskToBuy ()
{
var builder = ConfigurationBuilder.Instance (StandardPurchasingModule.Instance ());
builder.AddProduct ("100_gold_coins", ProductType.Consumable, new IDs {
{ "100_gold_coins_google", GooglePlay.Name },
{ "100_gold_coins_mac", MacAppStore.Name }
});
UnityPurchasing.Initialize (this, builder);
}
/// <summary>
/// This will be called when Unity IAP has finished initialising.
/// </summary>
public void OnInitialized (IStoreController controller, IExtensionProvider extensions)
{
m_Controller = controller;
m_AppleExtensions = extensions.GetExtension<IAppleExtensions> ();
// On Apple platforms we need to handle deferred purchases caused by Apple's Ask to Buy feature.
// On non-Apple platforms this will have no effect; OnDeferred will never be called.
m_AppleExtensions.RegisterPurchaseDeferredListener (OnDeferred);
}
/// <summary>
/// This will be called when a purchase completes.
/// </summary>
public PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs e)
{
if (Application.platform == RuntimePlatform.IPhonePlayer ||
Application.platform == RuntimePlatform.tvOS) {
string transactionReceipt = m_AppleExtensions.GetTransactionReceiptForProduct (e.purchasedProduct);
Console.WriteLine (transactionReceipt);
// Send transaction receipt to server for validation
}
return PurchaseProcessingResult.Complete;
}
/// <summary>
/// Called when Unity IAP encounters an unrecoverable initialization error.
///
/// Note that this will not be called if Internet is unavailable; Unity IAP
/// will attempt initialization until it becomes available.
/// </summary>
public void OnInitializeFailed (InitializationFailureReason error)
{
}
/// <summary>
/// Called when a purchase fails.
/// </summary>
public void OnPurchaseFailed (Product i, PurchaseFailureReason p)
{
}
/// <summary>
/// iOS Specific.
/// This is called as part of Apple's 'Ask to buy' functionality,
/// when a purchase is requested by a minor and referred to a parent
/// for approval.
///
/// When the purchase is approved or rejected, the normal purchase events
/// will fire.
/// </summary>
/// <param name="item">Item.</param>
private void OnDeferred (Product item)
{
Debug.Log ("Purchase deferred: " + item.definition.id);
}
}
#endif // UNITY_PURCHASING
В отличие от квитанций о транзакциях, вы не можете проверять квитанции о транзакциях локально. Вместо этого вы должны отправить строку квитанции на удаленный сервер для проверки. Если вы уже используете удаленный сервер для проверки квитанций приложений, отправьте квитанции о транзакциях на ту же конечную точку Apple, чтобы получить ответ JSON.
Пример ответа JSON:
{
"receipt": {
"original_purchase_date_pst": "2017-11-15 15:25:20 America/Los_Angeles",
"purchase_date_ms": "1510788320209",
"unique_identifier": "0ea7808637555b2c633eb07aa1cb0894c821a6f9",
"original_transaction_id": "1000000352597239",
"bvrs": "0",
"transaction_id": "1000000352597239",
"quantity": "1",
"unique_vendor_identifier": "01B57C2E-9E91-42FF-9B0D-4983175D6694",
"item_id": "1141751870",
"original_purchase_date": "2017-11-15 23:25:20 Etc/GMT",
"product_id": "100.gold.coins",
"purchase_date": "2017-11-15 23:25:20 Etc/GMT",
"is_trial_period": "false",
"purchase_date_pst": "2017-11-15 15:25:20 America/Los_Angeles",
"bid": "com.unity3d.unityiap.demo",
"original_purchase_date_ms": "1510788320209"
},
"status": 0
}
Перехват рекламных покупок Apple
Apple позволяет продвигать в -покупки игр через страницу продукта вашего приложения. В отличие от обычных покупок в приложениях, рекламные покупки Apple инициируются непосредственно в App Store на iOS и tvOS. Затем App Store запускает ваше приложение для завершения транзакции или предлагает пользователю загрузить приложение, если оно не установлено.
Метод обратного вызова IAppleConfiguration
SetApplePromotionalPurchaseInterceptor
перехватывает рекламные покупки Apple. Используйте этот обратный вызов, чтобы представить родительские ворота, отправить аналитикуаббревиатуру Unity Analytics
Просмотр в событиях Словарь или выполнение других функций перед отправкой покупки в Apple. Обратный вызов использует Продукт
, который пользователь пытался приобрести. Вы должны вызвать IAppleExtensions.ContinuePromotionalPurchases()
, чтобы продолжить рекламную покупку. Это инициирует любые платежи в очереди.
Если вы не настроите обратный вызов, рекламные покупки обрабатываются немедленно и вызывают ProcessPurchase
с результатом.
Примечание. Вызов этих API на других платформах не имеет никакого эффекта.
private IAppleExtensions m_AppleExtensions;
public void Awake() {
var module = StandardPurchasingModule.Instance();
var builder = ConfigurationBuilder.Instance(module);
// On iOS and tvOS we can intercept promotional purchases that come directly from
// the App Store.
// On other platforms this will have no effect; OnPromotionalPurchase will never be
// called.
builder.Configure<IAppleConfiguration>().
SetApplePromotionalPurchaseInterceptorCallback(OnPromotionalPurchase);
Debug.Log("Setting Apple promotional purchase interceptor callback");
}
public void OnInitialized(IStoreController controller, IExtensionProvider extensions) {
m_AppleExtensions = extensions.GetExtension<IAppleExtensions>();
foreach (var item in controller.products.all) {
if (item.availableToPurchase) {
// Set all these products to be visible in the user's App Store
m_AppleExtensions.SetStorePromotionVisibility(item, AppleStorePromotionVisibility.Show);
}
}
}
private void OnPromotionalPurchase(Product item) {
Debug.Log("Attempted promotional purchase: " + item.definition.id);
// Promotional purchase has been detected.
// Handle this event by, e.g. presenting a parental gate.
// Here, for demonstration purposes only, we will wait five seconds before continuing
// the purchase.
StartCoroutine(ContinuePromotionalPurchases());
}
private IEnumerator ContinuePromotionalPurchases() {
Debug.Log("Continuing promotional purchases in 5 seconds");
yield return new WaitForSeconds(5);
Debug.Log("Continuing promotional purchases now");
m_AppleExtensions.ContinuePromotionalPurchases (); // iOS and tvOS only
}
Тестирование
Для тестирования в магазинах Apple необходимо использовать тестовую учетную запись iTunes connect, которую можно создать в iTunes connect.
Выйдите из App Store на устройстве iOS или ноутбуке, запустите приложение, и вам будет предложено войти в систему при попытке совершить покупку или восстановить транзакции.
Если вы получили сообщение об ошибке инициализации по причине NoProductsAvailable
, следуйте этому контрольному списку:
- Идентификаторы продуктов iTunes Connect должны точно совпадать с идентификаторами продуктов, предоставленными Unity IAP
- Покупки в приложении должны быть включены для вашего приложения в iTunes Connect.
- Продукты должны быть допущены к продаже в iTunes Connect.
- Может пройти много часов, прежде чем новые продукты iTunes Connect станут доступны для покупки.
- Вы должны принять последние соглашения с разработчиками iTunes Connect и иметь активные банковские реквизиты.
Магазин приложений для Mac
При создании сборки Mac для настольных компьютеров необходимо выбрать проверку Mac App Store
в настройках сборки Unity.
После создания приложения необходимо обновить его файл info.plist, указав идентификатор пакета и строки версии. Щелкните правой кнопкой мыши файл .app
и выберите показать содержимое пакета
, найдите файл info.plist.
и измените строку CFBundleIdentifier
на идентификатор пакета вашего приложения.
Затем вы должны подписать, упаковать и установить приложение. Вам нужно будет запустить следующие команды из терминала OSX:
codesign -f --deep -s "3rd Party Mac Developer Application: " your.app/Contents/Plugins/unitypurchasing.bundle
codesign -f --deep -s "3rd Party Mac Developer Application: " your.app
productbuild --component your.app /Applications --sign "3rd Party Mac Developer Installer: " your.pkg
Чтобы подписать пакет, сначала может потребоваться удалить файл Contents.meta, если он существует: your.app/Contents/Plugins/unitypurchasing.bundle/Contents.meta
.
Чтобы правильно установить пакет, необходимо удалить распакованный файл .app перед запуском только что созданного пакета.
Затем вы должны запустить свое приложение из папки «Приложения». В первый раз, когда вы это сделаете, вам будет предложено ввести данные своей учетной записи iTunes, для чего вы должны ввести логин своей тестовой учетной записи пользователя iTunes Connect. После этого вы сможете совершать пробные покупки в тестовой среде.