Skydrive是樓主比較喜歡的微軟服務(wù)之一亮垫,聯(lián)系人也一直存放在skydrive里肺孤。但是手機升級到了iOS10之后的似乎蘋果對skydrive的兼容性變差了禀酱。導(dǎo)致的結(jié)果就是經(jīng)常性提示需要重新輸入live.com的密碼矛洞,聯(lián)系人某些時候就突然消失了为流。為了徹底解決這個問題航攒,還在在iphone上老老實實用icloud磺陡。
那么問題來了,如何把skydrive上的聯(lián)系人同步到SIM卡漠畜,手機币他,或者iCloud?
聯(lián)系人同步到SIM似乎iphone是不支持的,所以同步到手機是最簡單的選擇憔狞。在設(shè)置->通訊錄->默認賬號里蝴悉,把默認賬號設(shè)置為iCloud,那么新添加到手機的聯(lián)系人也會自動的同步的iCloud瘾敢。
實施
1. 緩存skydrive的聯(lián)系人到本地文件
選擇網(wǎng)絡(luò)狀態(tài)良好的時候拍冠,把skydrive的聯(lián)系人現(xiàn)行同步到手機,然后使用下面的代碼把本地所有聯(lián)系人保存到“測試APP”的沙盒簇抵。
- (void)exportContacts
{
CNContactStore *store = [[CNContactStore alloc] init];
NSArray *keys = @[ CNContactIdentifierKey,
CNContactNamePrefixKey,
CNContactGivenNameKey,
CNContactMiddleNameKey,
CNContactFamilyNameKey,
CNContactPreviousFamilyNameKey,
CNContactNameSuffixKey,
CNContactNicknameKey,
CNContactPhoneticGivenNameKey,
CNContactPhoneticMiddleNameKey,
CNContactPhoneticFamilyNameKey,
CNContactOrganizationNameKey,
CNContactDepartmentNameKey,
CNContactJobTitleKey,
CNContactBirthdayKey,
CNContactNonGregorianBirthdayKey,
CNContactNoteKey,
CNContactImageDataKey,
CNContactThumbnailImageDataKey,
CNContactImageDataAvailableKey,
CNContactTypeKey,
CNContactPhoneNumbersKey,
CNContactEmailAddressesKey,
CNContactPostalAddressesKey,
CNContactDatesKey,
CNContactUrlAddressesKey,
CNContactRelationsKey,
CNContactSocialProfilesKey,
CNContactInstantMessageAddressesKey];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys];
request.mutableObjects = YES;
NSMutableArray *arry = [[NSMutableArray alloc] init];
[store enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact *contact, BOOL *stop) {
CNMutableContact *mutableContact = (CNMutableContact *)contact;
NSLog(@"%@", mutableContact);
[arry addObject:mutableContact];
}];
NSLog(@"%@", @([arry count]));
NSString *filePath = [NSString stringWithFormat:@"%@/Documents/contacts", NSHomeDirectory()];
if([NSKeyedArchiver archiveRootObject:arry toFile:filePath])
{
NSLog(@"success");
}
}];
}
2. 刪除skydrive聯(lián)系人
從設(shè)置里把skydrive同步聯(lián)系人的選項關(guān)閉
3. 把緩存文件里的聯(lián)系人添加手機
這里可能會存在一些數(shù)據(jù)項缺失庆杜,導(dǎo)致添加聯(lián)系人失敗或者異常。
- (void)wiriteToDevice
{
NSString *filePath = [NSString stringWithFormat:@"%@/Documents/contacts", NSHomeDirectory()];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@", array);
CNContactStore *store = [[CNContactStore alloc] init];
for (CNMutableContact *contact in array){
@try {
CNSaveRequest *request = [[CNSaveRequest alloc] init];
[request addContact:contact toContainerWithIdentifier:nil];
NSError *error = nil;
if([store executeSaveRequest:request error:&error])
{
NSLog(@"success");
}
else
{
NSLog(@"%@\n", error.localizedFailureReason);
}
} @catch (NSException *exception) {
NSLog(@"%@\n", exception);
}
}
}
PS:筆者很討厭一些APP一上來就要求訪問聯(lián)系人的權(quán)限碟摆,這種耍流氓的APP一向都是拒絕的態(tài)度晃财。