Objective-C使用Facebook帐户和核心数据

时间:2014-05-03 16:50:54

标签: objective-c facebook core-data accounts

我目前正在开发一个iPhone应用程序,要求我使用Facebook帐户。我还需要使用核心数据在iPhone上存储用户相关数据。问题是我知道核心数据是iPhone特有的。这意味着如果我使用某个iPhone,那么特定的iPhone将保留我打算给每个用户的某些属性。但是,我希望能够做到这一点,以便如果用户决定登录另一部手机,他或她就可以使用Facebook登录并查看该用户的相关数据,而不是iPhone的所有者。这可能吗?或者我应该单独使用MYSQL,以便从另一个在线服务器获取Facebook用户相关信息。

1 个答案:

答案 0 :(得分:0)

这是您理想的使用iCloud的东西。 Start here with the iCloud Key Value Store

这样做可以将数据直接保存到用户商店而非设备。这将给你两件事:

  1. 如果用户转到其他设备,则无需再次登录。
  2. 如果用户注销一台设备或其他用户使用其他苹果ID登录,则可以检测到该事件并自动将用户注销。
  3. 您也可以直接使用Sqlite iCloud商店而不是键值商店,但除非您是iOS7 +应用程序,否则我不会推荐它,因为它没有最佳的稳定性声誉。为用户实现键值存储的代码可能如下所示:

    NSData *iCloudToken = (NSData *)[[NSFileManager defaultManager] ubiquityIdentityToken];
    __weak typeof(self) weakSelf = self;
    
    if (iCloudToken) {
        NSLog(@"iCloud is available, setting up ubiquity container");
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            __strong typeof(self) strongSelf = weakSelf;
            strongSelf.icloudContainerURLString = [NSString stringWithFormat:@"%@", [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]];
            NSLog(@"Ubiquity container setup complete");
        });
    } else {
        NSLog(@"iCloud is unavailable");
    }
    

    如果iCloud不可用,你可以使用本地钥匙串使用类似的东西做同样的事情(这段代码使用SSKeychain wrapper作为CoreFoundation钥匙串服务):

    - (NSString *)userID
    {
        if (self.iCloudAvailable) {
            return [[NSUbiquitousKeyValueStore defaultStore] stringForKey:kUserIDKey];
        } else {
            NSArray *accounts = [SSKeychain accountsForService:kDeliveriesServiceName];
            return [[accounts firstObject] valueForKey:kSSKeychainAccountKey];
        }
    }
    
    - (NSString *)userPassword
    {
        if (self.isCloudAvailable) {
            return [[NSUbiquitousKeyValueStore defaultStore] stringForKey:kUserPasswordKey];
        } else {
            return [SSKeychain passwordForService:kDeliveriesServiceName account:[self userID]];
        }
    }
    
    - (void)setUserID:(NSString *)userID andPassword:(NSString *)password;
    {
        NSParameterAssert(userID);
        NSParameterAssert(password);
        if (self.isCloudAvailable) {
            [[NSUbiquitousKeyValueStore defaultStore] setString:userID forKey:kUserIDKey];
            [[NSUbiquitousKeyValueStore defaultStore] setString:password forKey:kUserPasswordKey];
            [[NSUbiquitousKeyValueStore defaultStore] synchronize];
        } else {
            [SSKeychain setPassword:password forService:kDeliveriesServiceName account:userID];
        }
    }
    

    希望这有帮助。