【问题标题】:Change paid app to free but know if user previously purchased it将付费应用更改为免费,但要知道用户之前是否购买过
【发布时间】:2013-10-23 19:45:39
【问题描述】:

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

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

我有什么选择吗?

【问题讨论】:

  • 您是否在用户默认值/钥匙串中存储任何内容?
  • 是的,存储是否使用公制。
  • 我不会切换到免费的,30k 很好:-)

标签: ios in-app-purchase


【解决方案1】:

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

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

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

【讨论】:

  • 这听起来不错,但我需要支持回到 iOS5。
  • 我同意马蒂亚斯的观点。假设绝大多数 收入将来自 iOS7,并且只是将功能/等提供给 iOS6 及更低版本。这样,一切都会变得简单得多。尼克,你应该接受 rmaddy 的回答。
  • 或者您可以从旧系统中删除“专业”功能,并显示更新其系统的消息。此外,在旧系统中测试的功能也会更少。
  • 收据是否包含有关应用程序在付款时是否使用促销代码下载的信息?谷歌搜索了一段时间,但我似乎无法找到答案。
  • 如何获取应用商店购买而非应用内购买的原始购买日期?
【解决方案2】:

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

"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. 检查默认值/钥匙串中的数据
  2. 如果找到,启用付费内容/禁用广告
  3. 将该数据迁移到新密钥(这样您就不会再次升级/赠送免费内容)

【讨论】:

  • 是的,我认为它行不通。因为有些用户可能暂时不会升级,最后升级到第二个“免费”版本,这将打破这种情况。
  • 怎么样?关键是任何使用旧应用程序的人都将拥有原始密钥。任何升级或安装新版本的人都将拥有新密钥。
  • 说一年前有这个应用程序,从那以后就删除了,他们还买了一部新 iPhone。他们去他们的“已购买”列表并重新下载我的应用程序,因为他们之前购买了它。我没有办法知道他们为此付出了代价。
  • @NicHubbard 在这种情况下,您必须验证收据。我也是这么想的。我做了 Wain 建议的所有步骤,但如果它们都失败了,我只做一次收据验证,并根据结果设置钥匙串数据。
  • @applefreak 如果步骤失败,所有新安装都会失败,这是否意味着每次新安装都会有收据验证?也就是说,如果这是用户第一次安装应用程序,则第 1 步和第 2 步将失败。在什么时候,我们不需要进行收据验证?
【解决方案4】:

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

【讨论】:

  • 对于已经购买了该应用程序但又将其删除的人来说,这将是一个问题。如果他们在几个月后再次下载它,因此错过了带有“升级”按钮的应用程序版本。他们只需安装更新,这将是当然包含广告的免费版本。
【解决方案5】:

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

【讨论】:

  • 在 iTunesConnect(现在称为 AppstoreConnect)上,您(非常)通过应用程序更新限制为 100 个促销代码,并且每个促销代码将在创建后 28 天“有效”。随着 30k 应用的销售,我认为这不是一个现实的解决方案......
【解决方案6】:

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

【讨论】:

  • 是的,但是如果有人过去购买过,然后在我发布免费版本后重新下载该应用程序,这将不起作用。
  • @NicHubbard,这实际上是不可能自动处理的。您需要为使用自定义 URL 方案或类似方式的用户提供升级路径。
  • @NicHubbard 当前版本是否将任何内容写入 NSUserDefaults、钥匙串或 Documents 目录?您可以在应用程序将任何内容写入持久存储之前检查免费版本中的内容。
  • @neilco 是的。我的问题是,如果用户购买了我的应用并随后将其删除了怎么办。如果他们选择再次下载它,并且可能有一部新手机,他们就不会将这些密钥写入 NSUserDefaults。
  • @NicHubbard 这些是边缘案例,不幸的是,他们会错过。
【解决方案7】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多