1 年前 (2011 年 12 月 10 日) に iOS ゲーム "democracy" / "демократия" をリリースしました。ローンチ以来、今では、ウクライナとベラルーシのこのアプリケーションのユーザーから、アプリケーションでアプリ内購入を行うことができないというクレームが寄せられています。同時に、ロシア、アメリカ、イギリス、フランス、カザフスタンなどのユーザーは問題なく購入できます。他のアプリでは購入できます (例: Candy Crush Saga)。iAP に関する Apple のドキュメントを何度も読みましたが、ウクライナとベラルーシですべての iAP が機能しない理由が見つかりません。私はベラルーシ (ベラルーシ) のアカウントを持っていますが、自分のゲームから iAP を購入することもできません )) しかし、ロシアのアカウントで同じことをすると、うまくいきます!
すべての購入が「無効な製品 ID」として返されました。
ゲームへのリンク (無料ですのでご安心ください) - https://itunes.apple.com/us/app/demokratia/id484436490?mt=8
独立したコードでこの問題を再現することもできます。このページhttp://www.raywenderlich.com/2797/introduction-to-in-app-purchasesでサンプル プロジェクトを見つけてダウンロードし、デバイスで起動しました - 同じ問題が発生しました: 米国の IAP のリストを正常に取得しました、ロシアですが、ベラルーシ、ウクライナのリストは空です
再現手順 実際のアカウントと iTunes テスト アカウントで問題を再現できます。私は iOS 5.1、6.0 を搭載した iPad、iPhone を使用しています。どのデバイスを使用しても問題ないようです。iOS 6 SDK、xCode 4.5.2 を使用しています
この問題を再現するために必要なのは、デバイス (iPad など) の App Store をベラルーシまたはウクライナに切り替えることだけです。ベラルーシまたはウクライナのアカウントでログインすることでそれを行うことができます.
「デモクラシー」をダウンロード (「Демократия」、com.neskinsoft.Democracy)
次に、アプリケーションを起動し、[再生] をクリックして、ヘルプ ウィンドウを閉じます (右上隅のボタンをクリックします) 3.1 カート アイコンの付いたボタンをクリックします (UI の上部にあります) 3.2 ショップ ダイアログが表示されます。右下のボタンをクリック(ブタとコインのボタン) 3.3. Need Money "Нужны Деньги" ダイアログが表示されます。「60 000」、「$1.99」の行のボタンをクリックします。このボタンは IAP を呼び出します。
3.3 以降 - ウクライナ/ベラルーシの iTunes アカウントでは、ユーザーのパスワードを尋ねるダイアログさえ表示されません。しかし、他のすべての国 (ロシア、アメリカ、イギリスなど) では問題なく動作します。
コードをチェックしてデバッグし、問題をデバッグしました。
コードは非常にシンプルです。Apple のドキュメントのすべての指示に従いました。
コードで 60,000 ゴールドを購入するために呼び出すこのメソッド:
- (void)loadStoreAndBuy60000Gold
{
// restarts any purchases if they were interrupted last time the app was open
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
// get the product description (defined in early sections)
[self requestProductData: kInAppPurchase_60000GOLD]; // PLEASE NOTE kInAppPurchase_60000GOLD = "013", I didn't use reverse DNS and it's working
}
私は製品IDを尋ねます:
- (void)requestProductData: (NSString*) objectID
{
NSSet *productIdentifiers = [NSSet setWithObject: productID]; // In this case productID = "013"
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];
そして、この方法で私は問題を見つけました:
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
if ([self canMakePurchases]) // Returns TRUE
{
NSArray *products = response.products; // Here I receive product list, but for Ukraininan/Belarussian accounts it's EMPTY. So, no dialogs will appear since no product found. But for Russian/USA and so on accounts it returns me product!
//.....
// then I check invalidProductID
for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
NSLog("Invalid product id: %@" , invalidProductId); // And I found my product "013" is in invalid product ids!
}
}
この問題を解決するために私を助けてもらえますか? 一部の市場の製品リストを受け取っていないのはなぜですか?