在iOS中检测首次安装而不使用NSUserDefaults

6

工作原理 - 该应用是跨平台的订阅服务。在 iPhone 上,初始购买可获得 30 天完整功能,然后在 30 天后,您需要通过应用内购买订阅才能执行某些操作。

我的需求 - 我需要知道是否是首次运行,以便将用户信息添加到数据库中。或者因为它是跨平台的,他们可能已经支付了订阅费,所以我需要向用户已有的订阅中添加 30 天。

当前实现 - 目前,我将 identifierForVendor 存储在远程数据库中,并在 NSUserDefaults 中检查一个布尔值来确定:1. 是否是首次运行,2. 是否是首次运行允许用户将自己添加到数据库以获取 30 天的完整使用权,或者向其现有订阅中添加 30 天。

问题所在 - 问题在于,如果用户删除应用程序然后重新安装它,则 NSUserDefaults 也将被删除,并且 identifierForVendor 将更改,这将允许用户通过删除和重新安装应用程序来再次获取 30 天的免费订阅。

理想解决方案 - 最初我想为应用程序设置订阅,但我不知道如何在应用程序最初购买时检查收据并将用户插入远程数据库。此外,我也不知道如何设置不是应用内购买的订阅。我还考虑过使应用程序免费,然后他们可以使用应用内购买购买服务,但如果无法连接到远程服务器来首先构建数据,则该应用程序没有用处。

底线我想采取以下措施之一

  1. 在第一次购买时进行订阅(我需要能够检测购买是否有效,以便将用户信息记录到远程数据库中)
  2. 将应用程序免费,然后使用应用内购买添加订阅(允许有一个什么都做不了直到订阅的免费应用程序是可以接受的吗?)
  3. 保持现状(但找到更长久的解决方案来解决 identifierForVendor,而 identifierForAdvertising 也不可行,因为它可以被关闭)

3
为什么不把东西存储在钥匙串中?那应该是永久的。 - user529758
1
http://stackoverflow.com/questions/13602125/how-to-find-the-app-downloaded-date-in-appstore/13602197#13602197 - Anoop Vaidya
我强烈建议仔细阅读苹果应用商店的指南。您所描述的订阅模式可能不被允许。 - user149341
一个建议是将应用程序的状态保存在应用程序的私有iCloud容器中(通过CloudKit)。缺点是用户需要登录iCloud才能使用该应用程序,但实际上,大多数用户都会登录。 - Erik Tjernlund
1个回答

2
这会帮助你很多。基本上它是一个类似于NSUserDefaults的Keychain封装器。它对我帮助很大。将东西存储在Keychain中可以让它们在应用重新安装后保留下来。

https://github.com/carlbrown/PDKeychainBindingsController

这个项目旨在使Mac OSX和iOS Keychains的使用像NSUserDefaults一样简单。 它是一个符合KVO的Cocoa包装器,围绕Mac OSX和iOS Keychains构建,其模型为NSUserDefaults。因此,意图是对于通常需要调用的常见情况,您应该能够调用: [NSUserDefaultsController sharedUserDefaultsController],您应该能够调用 [PDKeychainBindingsController sharedKeychainBindingsController]。对于通常会调用的常见情况,您应该能够调用: [NSUserDefaults standardUserDefaults],您应该能够调用 [PDKeychainBindings sharedKeychainBindings]。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接