将付费应用更改为免费,但要知道用户以前是否已购买

时间:2013-10-15 20:51:08

标签: ios in-app-purchase

我正在考虑将我的付费iOS应用更改为免费,将其设为ad based,并使用in-app purchase选项删除广告。

如果我刚推出应用程序,这听起来不错,但我们有超过3万的付费下载量,而且我不希望这些用户在更新到免费的新版本时看到广告。< / p>

我有什么选择吗?

7 个答案:

答案 0 :(得分:65)

从iOS 7开始,可以使用正确的收据验证来完成。在iOS 7下,您可以获取已购买应用的收据。收据中的部分数据包括有关用户的原始购买应用版本的信息。您可以查看该版本,如果它是从更新发布之前到使用IAP免费,您可以选择为用户提供完整功能,而无需用户再次购买升级。

当然,如果您希望更新后的应用在iOS 6下运行,则无法选择。

有关收据验证的详细信息,请参阅Receipt Validation Programming Guide

答案 1 :(得分:1)

如果您当前的应用程序包含用户默认值或钥匙串中的任何数据,则可以作为指标。首次打开应用程序时(在新版本中)运行一些代码:

  1. 检查默认值/钥匙串中的数据
  2. 如果找到,请启用付费内容/停用广告
  3. 将该数据迁移到新密钥(这样您就不会再次升级/赠送免费内容)

答案 2 :(得分:0)

尝试获取所有收据并通过以下数据进行分析:

"expires_date" = "2017-09-24 11:25:19 Etc/GMT";
"original_purchase_date" = "2017-09-24 11:20:21 Etc/GMT";
"product_id" = "com.yourapp.service";

1。从应用商店获取所有用户的收据

+ (NSArray*)all_receipts{
    // Load the receipt from the app bundle.
    NSURL *receiptURL = [[NSBundle mainBundle]appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
    if(!receipt){
        //no receipts yet...
        return nil;     
    }

    NSError *error;
    NSDictionary *requestContents = @{@"receipt-data": [receipt base64EncodedStringWithOptions:0],
                                      @"password":YOUR_SECRED_SHARED};
    NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
                                                          options:0
                                                            error:&error];
    if (!requestData) {
        return [NSArray array];
    }

    // Create a POST request with the receipt data.
    //get current qa / production url
    BOOL sandbox = [[receiptURL lastPathComponent]isEqualToString:@"sandboxReceipt"];
    NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"];
    if (sandbox) {
        storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];
    }
    NSDictionary *jsonResponse = [LTServer postUrl:storeURL.absoluteString attach:requestContents];
    NSLog(@"jsonResponse %@",jsonResponse);
    if(!jsonResponse){
        return [NSArray array];
    }
    NSArray *receipts_data = jsonResponse[@"latest_receipt_info"];
    return [receipts_data mutableCopy];
}

2。每个收据将包含一个字典:

    "expires_date" = "2017-09-24 11:25:19 Etc/GMT";
    "expires_date_ms" = 1506252319000;
    "expires_date_pst" = "2017-09-24 04:25:19 America/Los_Angeles";
    "is_trial_period" = true;
    "original_purchase_date" = "2017-09-24 11:20:21 Etc/GMT";
    "original_purchase_date_ms" = 1506252021000;
    "original_purchase_date_pst" = "2017-09-24 04:20:21 America/Los_Angeles";
    "original_transaction_id" = 1000000339209266;
    "product_id" = "com.yourapp.service";
    "purchase_date" = "2017-09-24 11:20:19 Etc/GMT";
    "purchase_date_ms" = 1506252419000;
    "purchase_date_pst" = "2016-11-27 04:20:19 America/Los_Angeles";
    quantity = 1;
    "transaction_id" = 1000000337203266;
    "web_order_line_item_id" = 1000000030161297;

答案 3 :(得分:-1)

Woudnt在付费应用上发布免费inanpp购买更容易。一个按钮说“升级”。然后在下次更新时切换免费的inapp付款?

答案 4 :(得分:-2)

唯一的选择是发布两个更新。第一个将为NSUserDefaults写一个值,将它们标识为购买者。第二个更新是您的广告支持版本,可以读取此购买者识别值并隐藏广告。

答案 5 :(得分:-2)

在itunes connect中,您可以为应用内购买生成促销代码。您可以为高级功能创建IAP项目,并将其作为促销手动提供给购买者。虽然不是一个自动解决方案,它可能会让您免于一些头痛。

答案 6 :(得分:-4)

不是,不。您可以做的最好的事情是发布更新,同时它仍然是一个付费应用程序,它将一些值写入NSUserDefaults(或应用程序数据目录中的文件,无关紧要),表明它已被购买。等待一周或多长时间,然后发布删除该代码的更新,定时在价格变为免费的同一天发布。