2

我的应用程序是我之前询问过的应用程序。它是一个 XML 解析器,它显示 XML 中的项目数,等于应用程序打开的天数。我的问题主要是这样的:我在 1.0 版中没有设置 iCloud。由于该应用程序的受欢迎程度,我很快将发布该应用程序的 iPad 版本,并且担心那些在 iPhone 上使用该应用程序一段时间的人现在将在 iPad 版本上重置回第 1 天。我在 GitHub 上找到了 MKiCloudSync,想知道这是否可以很好地实现,以便应用程序始终在所有设备上保持同步?如果是这样,在应用程序的 1.1 版中添加它会自动与现有库同步,还是他们必须先更新 iPhone 版本,让它同步,然后再为 iPad 获取它?基本上只是希望它保持同步。

这是我用来存储 NSUserDefault 值的 AppDelegate 代码。虽然,一些 NSUserDefaults 可以在其他类中更改。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    sleep(3);

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if (![defaults integerForKey:@"totalDays"]) {

        // if there is no value for the key, set it to 1
        [defaults setInteger:0 forKey:@"totalDays"];

    }
    if (![defaults objectForKey:@"currentDate"]) {
        [defaults setObject:@"32 01" forKey:@"currentDate"];
    }
    if (! [defaults boolForKey:@"marked"]) {
        [defaults setBool:NO forKey:@"marked"];

    }
    if (![defaults arrayForKey:@"checkedrows"]) {
        NSMutableArray *arr1  = [NSMutableArray arrayWithArray:[defaults arrayForKey:@"checkedrows"]];
    }
    NSDate *date = [NSDate date];

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
    [dateFormat setDateFormat:@"dd MM"];

    NSString *dateString = [dateFormat stringFromDate:date];

    [dateFormat release];

    NSString *checkdate = [defaults objectForKey:@"currentDate"];

    if (![dateString isEqualToString:checkdate]) {
        NSInteger currentnumber = [defaults integerForKey:@"totalDays"];

        [defaults setObject:dateString forKey:@"currentDate"];
        [defaults setInteger:currentnumber+1 forKey:@"totalDays"];
    }

 [defaults synchronize];

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    return YES;
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSLog(@"enteredfore");
    NSDate *date = [NSDate date];

    // format it
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
    [dateFormat setDateFormat:@"dd MM"];

    // convert it to a string
    NSString *dateString = [dateFormat stringFromDate:date];

    // free up memory
    [dateFormat release];

    NSString *checkdate = [defaults objectForKey:@"currentDate"];
    NSLog(@"hereitis%@", checkdate);

    if (![dateString isEqualToString:checkdate]) {
        NSInteger currentnumber = [defaults integerForKey:@"totalDays"];
        NSLog(@"The current number is %i", currentnumber);
        [[NSNotificationCenter defaultCenter] postNotificationName:@"EnteredForeground"
                                                            object:nil];
        [defaults setObject:dateString forKey:@"currentDate"];
        [defaults setInteger:currentnumber+1 forKey:@"totalDays"];
        [defaults synchronize];
    }

    }

谢谢

4

2 回答 2

3

当您查看 MKiCloudSync 的源代码(实际上很短)时,您会看到它只是将整个用户默认字典存储在 iCloud 中,只要它发生任何变化。

每当 iCloud 中的任何内容发生变化时,它都会用 iCloud 中存储的内容覆盖所有本地用户默认设置。

没有冲突解决或类似的概念,它只会从上次更改它们的设备中获取所有值。对于您的用例,这基本上意味着 iPhone 上的现有数据很有可能被从新 iPad 版本推送到 iCloud 的初始(可能是空的)数据覆盖。

顺便说一句,你永远不应该调用sleepapplication:didFinishLaunchingWithOptions:(基本上,它应该很少需要调用它,但这种方法特别糟糕,因为如果它没有足够快地完成,你的应用程序可能会被系统杀死)。

于 2013-01-01T18:28:27.980 回答
0

它在技术上可以正常工作,但结果可能很糟糕......应该有一些“冲突处理”/让一个设备成为主设备......

让我用一个例子来解释:

带有 app 1.0 的 iphone 正在设备 A 上运行并且已经使用了 50 天 => 不在乎 icloud

现在带有 app 1.1 的 ipad 运行了 5 天 => 将其设置写入 icloud

现在设备 A 的应用程序更新到 1.1 => 看到 icloud。需要合并更改...它不能只使用 icloud 内容,因为它会将设备 A 重置为新 ipad 保存的某个较早状态

于 2013-01-01T18:29:37.903 回答