7

在我的应用程序中,用户购买存储在 Core Data 中的消耗品,比如手提箱。当用户第一次安装应用程序时,我给他们一个免费赠品让他们开始使用。如果没有设置至少一个手提箱,该应用程序将无法运行。

但是如果用户在他们的 iPhone 和 iPad 上安装应用程序并同步两者,他们现在有 2 个手提箱。如果他们在任一设备上卸载该应用程序,然后重新安装并同步它,他们就会获得一个额外的应用程序,并且可以无限期地这样做。

我可以看到两种解决方案,但似乎都不对:

  1. 当用户第一次与 iCloud 同步时,向 NSUbiquityKeyValueStore 添加一个值。首次启动时检查此值。如果为 nil,则创建免费赠品,如果不是,则同步数据。但这会产生一个问题。如果用户在首次启动时禁用了 iCloud 或没有互联网连接怎么办。该应用程序将创建免费赠品,然后当 iCloud 可用时,同步副本,他们可以随意多次执行此操作。

  2. 以某种方式匹配每个应用程序上的默认项目。我有匹配 objectID 或时间戳的想法,但这些会有所不同,我不确定如何处理它。

有人知道我能做些什么吗?

编辑:

使用预打包的数据库加上 migratePersistentStore:toURL:options:withType:error: 似乎是要走的路。如果对我有用,将发布带有代码的答案。

4

3 回答 3

3

如果您没有验证收据并跟踪用户在您自己的服务器上拥有的消耗品,那么您做错了。你基本上相信用户是正派和诚实的,这通常是一个坏主意。

当你使用应用内消耗品时,你应该在服务器上记录用户购买的东西。这样,每次您的应用程序启动时,它都可以向服务器验证是否存在预期的消耗品数量。

于 2011-10-16T11:17:03.717 回答
1

使用 iCloud 意味着网络连接。一旦设备连接到网络,您就可以在您自己的服务器上验证收据并记录消耗品的使用情况。

于 2011-10-16T07:37:04.807 回答
0

在我看来,最好的解决方案是将 UDID 存储在 iCloud UbiquitousKeyValueStore 的数组中。

//Store UDID in iCloud
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 5.0) {
    if ([[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]) {
        NSUbiquitousKeyValueStore *store = [NSUbiquitousKeyValueStore defaultStore];

        //Get array
        NSMutableArray *devices = [NSMutableArray arrayWithArray:[store arrayForKey:@"UDID"]];
        [devices addObject:[[UIDevice currentDevice] uniqueIdentifier]];

        //Create new array, set to kvstore
        NSArray *newDevices = [NSArray arrayWithArray:devices];
        [store setArray:newDevices forKey:@"UDID"];
        [store synchronize];
    }
}

...

   //Check if app already installed on device
   NSArray *devices = [[NSUbiquitousKeyValueStore defaultStore] arrayForKey:@"UDID"];

    for (NSString *UDID in devices) {
        if ([UDID isEqualToString:[[UIDevice currentDevice] uniqueIdentifier]]) {
              //stop the giveaway
        }
    }
于 2011-11-23T06:25:59.963 回答