我目前正在开发一个iPhone应用程序,要求我使用Facebook帐户。我还需要使用核心数据在iPhone上存储用户相关数据。问题是我知道核心数据是iPhone特有的。这意味着如果我使用某个iPhone,那么特定的iPhone将保留我打算给每个用户的某些属性。但是,我希望能够做到这一点,以便如果用户决定登录另一部手机,他或她就可以使用Facebook登录并查看该用户的相关数据,而不是iPhone的所有者。这可能吗?或者我应该单独使用MYSQL,以便从另一个在线服务器获取Facebook用户相关信息。
答案 0 :(得分:0)
这是您理想的使用iCloud的东西。 Start here with the iCloud Key Value Store
这样做可以将数据直接保存到用户商店而非设备。这将给你两件事:
您也可以直接使用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];
}
}
希望这有帮助。