iCloud使用户可以“窃取”应用内耗材

时间:2011-10-16 06:45:03

标签: iphone objective-c in-app-purchase icloud

在我的应用程序中,用户购买存储在Core Data中的耗材,比如手提箱。当用户首次安装应用程序时,我会给他们一个免费的入门。如果没有至少一个行李箱设置,该应用程序将无法运行。

但是如果用户在他们的iPhone上安装应用程序,然后安装他们的iPad并同步这两个,他们现在有2个手提箱。如果他们在任一设备上卸载应用程序,然后重新安装并同步它们,他们只是获得了额外的一个,他们可以无限期地执行此操作。

我可以看到两种解决方案,但它们似乎都没有:

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

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

  3. 有谁知道我能做些什么呢?

    编辑:

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

使用iCloud意味着网络连接。只要设备连接到网络,您就可以在自己的服务器上验证耗材的收据和日志消耗。

答案 2 :(得分: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
        }
    }