質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

751閲覧

UnityIAP サブスクリプション型アイテム購入 sandboxでのテストで自動継続されたかアプリ起動中に確認できない

taku263-456

総合スコア10

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/11/28 03:07

前提・実現したいこと

現在、UnityIAPを使用して、自動継続型の課金アイテムを購入できるiOSアプリの開発を行っています。
公式のサンプルを参考にして、sandboxでの課金処理の確認まで完了できました。

あとは自動継続のタイミング(1ヶ月を想定しているため、sandboxでは5分後)で継続されたかリアルタイムで確認確認したいです。

発生している問題・エラーメッセージ

【発生している問題】 アプリの起動中に自動継続のタイミングではUnityIAPのpublic PurchaseProcessingResult ProcessPurchase (PurchaseEventArgs args){} が実行されることを想定していたのですが、アプリの起動中にはXcodeのログを見る限り、呼ばれず自動継続されたのか分かりません。 そのため、sandboxを使った課金テストで自動継続されたかリアルタイムで確認する方法を教えてください。 ※ アプリを再起動し、Oninitializeが完了したタイミングで、自動継続された旨の「Finish Transaction~」は表示されますが、 ※ これだとアプリの再起動が必要なうえ、自動継続のレシート検証のタイミングの検討に難儀しています。

該当のソースコード

C#

1public class Purchase : MonoBehaviour, IStoreListener 2{ 3 private static string kProductIDSubscription = "KakinTest_1m"; 4 private static string kProductNameAppleSubscription = "KakinTest_1m"; 5 // シングルトンの生成 6 private static PurchaseManager instance; 7 public static PurchaseManager Instance 8 { 9 get 10 { 11 if (instance == null) 12 { 13 instance = GameObject.FindObjectOfType<PurchaseManager>(); 14 } 15 return instance; 16 } 17 } 18 19 private void Awake() 20 { 21 if (Instance != null && Instance != this) 22 { 23 Destroy(gameObject); 24 } 25 else 26 { 27 instance = this; 28 DontDestroyOnLoad(gameObject); 29 } 30 31 // 購入済みか確認する 32 if (Convert.ToInt32(NCMBUser.CurrentUser["is_Buy"]) == 1) 33 { 34 alreadyBuy = true; 35 } 36 37 if (m_StoreController == null) 38 { 39 InitializePurchasing(); 40 } 41 } 42 43 public void InitializePurchasing() 44 { 45 if (IsInitialized()) 46 { 47 return; 48 } 49 Debug.Log("InitializePurchasing Start!!"); 50 var module = StandardPurchasingModule.Instance(); 51 var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance()); 52 string receipt = builder.Configure<IAppleConfiguration>().appReceipt; 53 54 if (receipt != null) 55 { 56 Debug.Log(receipt); 57 } 58 builder.AddProduct(kProductIDSubscription, ProductType.Subscription, new IDs() 59 { 60 { kProductNameAppleSubscription, AppleAppStore.Name }, 61 }); 62 63 Debug.Log("UnityPurchasing.Initialize Start!!"); 64 65 UnityPurchasing.Initialize(this, builder); 66 } 67 68 private bool IsInitialized() 69 { 70 return m_StoreController != null && m_StoreExtensionProvider != null; 71 } 72 73 public void BuySubscription() 74 { 75 if (alreadyBuy == true) 76 { 77 // 既に購入済みの旨を通知 78 // 購入済みのため何もしない。 79 return; 80 } 81 BuyProductID(kProductIDSubscription); 82 } 83 84 public void BuyProductID(string productId) 85 { 86 // 購入済みの場合、二重課金になるため何もしない 87 if (alreadyBuy == true) 88 { 89 // 既に購入済みの旨を通知 90 // 購入済みのため何もしない。 91 return; 92 } 93 94 // 購入処理の途中でもう一度購入ボタンを押下された場合は何もしない 95 if(nowBuyTransaction == true) 96 { 97 Debug.Log("購入処理中のためしばらくお待ちください。"); 98 return; 99 } 100 101 nowBuyTransaction = true; 102 try 103 { 104 if (IsInitialized()) 105 { 106 Product product = m_StoreController.products.WithID(productId); 107 if (product != null && product.availableToPurchase) 108 { 109 Debug.Log(string.Format("Purchasing product asychronously: '{0}' - '{1}'", product.definition.id, product.definition.storeSpecificId)); 110 // 購入処理開始 111 m_StoreController.InitiatePurchase(product); 112 } 113 // Otherwise ... 114 else 115 { 116 Debug.Log("BuyProductID: FAIL. Not purchasing product, either is not found or is not available for purchase"); 117 // エラーダイアログの表示 118 } 119 } 120 // Otherwise ... 121 else 122 { 123 Debug.Log("BuyProductID FAIL. Not initialized."); 124 } 125 } 126 // 例外ハンドリング 127 catch (Exception e) 128 { 129 Debug.Log("BuyProductID: FAIL. Exception during purchase. " + e); 130 // エラーダイアログの表示 131 } 132 } 133 134 // IStoreListener:各コールバック呼び出し時の処理 135 public void OnInitialized(IStoreController controller, IExtensionProvider extensions) 136 { 137 Debug.Log("OnInitialized: PASS"); 138 m_StoreController = controller; 139 m_StoreExtensionProvider = extensions; 140 m_AppleExtensions = extensions.GetExtension<IAppleExtensions>(); 141 142 Dictionary<string, string> introductory_info_dict = m_AppleExtensions.GetIntroductoryPriceDictionary(); 143 144 Debug.Log("Available items:"); 145 146 foreach (var item in controller.products.all) 147 { 148 if (item.availableToPurchase) 149 { 150 Debug.Log(string.Join(" - ", 151 new[] 152 { 153 item.metadata.localizedTitle, 154 item.transactionID, 155 item.receipt 156 })); 157 if (item.receipt != null) 158 { 159 if (item.definition.type == ProductType.Subscription) 160 { 161 if (CheckIfProductIsAvailableForSubscriptionManager(item.receipt)) 162 { 163 string intro_json = (introductory_info_dict == null || !introductory_info_dict.ContainsKey(item.definition.storeSpecificId)) ? null : introductory_info_dict[item.definition.storeSpecificId]; 164 SubscriptionManager p = new SubscriptionManager(item, intro_json); 165 SubscriptionInfo info = p.getSubscriptionInfo(); 166 167 // 有効期限切れか確認する 168 if (Result.True == info.isSubscribed()) 169 { 170 // 有効期限切れかつキャンセル処理された 171 if (Result.True == info.isCancelled()) 172 { 173 // 自動継続されないため、再購入を可能とする。 174 } 175 // キャンセルされていない場合 176 else 177 { 178 // エラーダイアログの表示 179 } 180 } 181 } 182 else 183 { 184 Debug.Log("This product is not available for SubscriptionManager class, only products that are purchase by 1.19+ SDK can use this class."); 185 } 186 } 187 else 188 { 189 Debug.Log("the product is not a subscription product"); 190 } 191 } 192 else 193 { 194 Debug.Log("the product should have a valid receipt"); 195 } 196 } 197 } 198 } 199 200 201 public void OnInitializeFailed(InitializationFailureReason error) 202 { 203 Debug.Log("OnInitializeFailed InitializationFailureReason:" + error.ToString()); 204 // エラーダイアログの表示 205 } 206 207 208 public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args) 209 { 210 if (String.Equals(args.purchasedProduct.definition.id, kProductIDSubscription, StringComparison.Ordinal)) 211 { 212 Product product = args.purchasedProduct; 213 string transactionID = args.purchasedProduct.transactionID; // 処理のトランザクションID 214 var receipt = args.purchasedProduct.receipt; // 受領したレシート(J-SON形式) 215 216 StartCoroutine(ReceiptVerification(product, transactionID, receipt, ReceiptVerificationError)); 217 218 // 一旦ペンディングで返す 219 return PurchaseProcessingResult.Pending; 220 } 221 else 222 { 223 Debug.Log(string.Format("ProcessPurchase: FAIL. Unrecognized product: '{0}'", args.purchasedProduct.definition.id)); 224 // エラーダイアログの表示 225 ); 226 227 } 228 return PurchaseProcessingResult.Complete; 229 } 230 231 232 public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason) 233 { 234 nowBuyTransaction = false; 235 Debug.Log(string.Format("OnPurchaseFailed: FAIL. Product: '{0}', PurchaseFailureReason: {1}", product.definition.storeSpecificId, failureReason)); 236 237 string errorMsg = ""; 238 switch (failureReason) 239 { 240 } 241 242 // エラーダイアログの表示 243 } 244 245 // レシート検証(サーバー処理) 246 IEnumerator ReceiptVerification(Product product, string transactionID, string receipt, UnityAction<NCMBException> errorCallback) 247 { 248 249 } 250 251 // エラーコールバック時の処理 252 public void ReceiptVerificationError(NCMBException exeption = null) 253 { 254 255 } 256 257 // サブスクリプションマネージャーが使える製品か判定 258 private bool CheckIfProductIsAvailableForSubscriptionManager(string receipt) 259 { 260 } 261} 262

試したこと

インターネットを調査してもいい方法が思い浮かばず、unityJapanに問い合わせをしましたが、
フォーラムに記載して回答を待つか、有料サービスでご相談に乗りますといわれて頓挫しています。

補足情報(FW/ツールのバージョンなど)

Unity:2018.2.5 UnityIAP:1.20.1
対象はiphone、iPadのみです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問