【问题标题】:iOS App rejected by Apple, even after adding "Restore Purchase" feature?iOS App 被苹果拒绝,即使添加了“恢复购买”功能?
【发布时间】:2018-03-18 22:53:12
【问题描述】:

在我的应用中,我有应用内购买功能。我在应用程序中添加了恢复购买功能。我在应用程序中显示了一个恢复购买按钮,因此用户可以通过点击按钮恢复他之前的所有购买。

但我从解决中心收到此错误 Guideline 3.1.1 - Business - Payments - In-App Purchase

错误描述说我们必须包含一个恢复购买按钮和功能。我已经包含在应用程序中。

我的代码运行良好。我使用沙盒测试员帐户进行了测试。因此,如果我购买了一些物品,然后卸载应用程序,如果我重新安装应用程序并点击恢复购买按钮后,该沙盒测试用户的所有先前购买的物品都会解锁。

这是我的代码 sn-p:

-(void)sendreciptToApple{
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];


// Create the JSON object that describes the request
NSError *error;
NSDictionary *requestContents = @{
                                  @"receipt-data": [receipt base64EncodedStringWithOptions:0]
                                  };
NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
                                                      options:0
                                                        error:&error];

if (!requestData) { /* ... Handle error ... */ }

// Create a POST request with the receipt data.
// NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; //for sandbox

NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"]; // for live


// https://sandbox.itunes.apple.com/verifyReceipt
// https://buy.itunes.apple.com/verifyReceipt

NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
[storeRequest setHTTPMethod:@"POST"];
[storeRequest setHTTPBody:requestData];

// Make a connection to the iTunes Store on a background queue.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                           if (connectionError) {
                               /* ... Handle error ... */
                           } else {
                               NSError *error;
                               NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
                               if (!jsonResponse) { /* ... Handle error ...*/ }
                               [self isAppPreviouslyPurchased:jsonResponse];

                               [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                   // update the UI here
                                   //   [self fireAllProductPurchaseOnetime];
                                   [self showViewsAfterOrBeforePurchase];
                                   [SVProgressHUD dismiss];
                               }];
                           }
                       }];

    }

我正在解析和保存来自苹果的 JSON 响应并在本地存储..

-(void)isAppPreviouslyPurchased:(NSDictionary *)receipt{
NSLog(@"after receive reciept data %@",receipt);


NSMutableArray *purchasedItemArray=[[NSMutableArray alloc]initWithArray:[receipt valueForKeyPath:@"receipt.in_app"]];

NSLog(@"Already purchased item array<<<<>>>>>> %@",purchasedItemArray);
NSString *valueToSave = @"yes";

if (purchasedItemArray.count>0)
{
    for (int i=0; i<purchasedItemArray.count; i++)
    {
        NSDictionary *productItem=[purchasedItemArray objectAtIndex:i];
        NSString *productID=[productItem valueForKey:@"product_id"];

        if ([productID isEqualToString: @"com.iwonderapp.iWonder.EntireApp"])
        {
            [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"IsAllProductPurchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        if ([productID isEqualToString: @"com.iwonderapp.iWonder.Organs"])
        {
            [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"IsOrgansPurchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        if ([productID isEqualToString: @"com.iwonderapp.iWonder.Endocrines"])
        {
            [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"IsEndocrinesPurchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        if ([productID isEqualToString: @"com.iwonderapp.iWonder.Emotions"])
        {
            [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"IsEmotionsPurchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];

        }
        if ([productID isEqualToString: @"com.iwonderapp.iWonder.SexIntInf"])
        {
            [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"IsIntimacyPurchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        if ([productID isEqualToString: @"com.iwonderapp.iWonder.ConOverCon"])
        {
            [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"IsConflictOverwhelmPurchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        if ([productID isEqualToString: @"com.iwonderapp.iWonder.PowConMan"])
        {
            [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"IsPowerControlPurchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        if ([productID isEqualToString: @"com.iwonderapp.iWonder.CreExpRej"])
        {
            [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"IsCreativityPurchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
        if ([productID isEqualToString: @"com.iwonderapp.iWonder.Chakras"])
        {
            [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"IsChakrasPurchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }

    }
}



 }

【问题讨论】:

  • 您是否告诉 Apple 在哪里可以找到“恢复购买”按钮?

标签: ios objective-c iphone in-app-purchase xcode8


【解决方案1】:

这可能是你的问题:

// NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; //for sandbox

NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"]; // for live

当 Apple 测试您的 IAP 流程时,它发生在沙盒环境中。 您将沙盒收据发送到生产 URL。这显然行不通,您将收到状态码21007。当您检测到该状态代码时,您知道您必须将其发送到沙盒 URL。

这就是 Apple 建议的处理方式:始终首先将收据发送到生产 URL,如果您收到状态代码 21007,则将其发送到沙盒 URL 作为后备。

有用的链接

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多