41

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

如果我只是启动应用程序,这听起来是个好主意,但我们有超过 30k 的付费下载,我不希望这些用户在更新到免费的新版本时看到广告。

我在这里有什么选择吗?

4

7 回答 7

69

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

当然,如果您希望更新后的应用程序在 iOS 6 下运行,这不是一个选项。

有关收据验证的详细信息,请参阅收据验证编程指南

于 2013-10-15T21:28:05.170 回答
3

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

"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;
于 2018-07-17T09:27:13.290 回答
2

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

  1. 检查默认值/钥匙串中的数据
  2. 如果找到,启用付费内容/禁用广告
  3. 将该数据迁移到新密钥(这样您就不会再次升级/赠送免费的东西)
于 2013-10-15T20:57:59.010 回答
-1

在付费应用程序启动时提供免费的 inanpp 购买会更容易吗。一个按钮,上面写着“升级”。然后在下次更新时将免费的应用程序切换为付费?

于 2015-08-20T15:36:39.767 回答
-2

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

于 2017-01-11T14:49:33.133 回答
-4

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

于 2013-10-15T20:55:38.160 回答
-5

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

于 2013-10-15T20:54:36.720 回答