大家好,我在抓取用户联系人时遇到问题。我为它写了一些代码,它在模拟器中正常工作,显示用户名和数字。现在,当我在设备上测试时,没有任何内容出现。请看我的代码有什么问题。
#import <AddressBookUI/AddressBookUI.h>
#import <Contacts/Contacts.h>
我在.H文件中导入这些内容,这里是.M
的代码 CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted == YES) {
//keys with fetching properties
NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey];
NSString *containerId = store.defaultContainerIdentifier;
NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId];
NSError *error;
NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&error];
if (error) {
NSLog(@"error fetching contacts %@", error);
} else {
for (CNContact *contact in cnContacts) {
NSLog(@"print contacts %@",contact.givenName);
for (CNLabeledValue *label in contact.phoneNumbers) {
NSString *phone = [label.value stringValue];
if ([phone length] > 0) {
NSLog(@"Print Phone no %@",phone);
}
}
}
}
}
}];
它在模拟器中工作正常,但它不能在我的设备上工作请帮助。
答案 0 :(得分:4)
简短回答:不。
答案很长:不,iOS上的所有应用都运行在Sandbox中,这意味着他们只能访问自己“工作区”中的文件和文件夹。 iOS 8带来了共享容器,应用程序可以使用这些容器在它们之间共享文档和文件,但这只扩展到同一“应用程序组”中的应用程序,通常是应用程序及其扩展。这意味着您无法访问其他应用程序的文件,除非通过共享扩展程序明确向您提供这些文件。由于此扩展是在用户请求时调用的,因此应用程序无法在后台传递这些文件,当然也不会在卸载时传递这些文件。卸载应用程序时,iOS会自动提示用户文档/数据将丢失,但网络存储的数据/文档可能仍然可用。
有关文件系统沙箱的更多信息:Apple Doc's
iOS8文档提供程序 - Accessing Files Outside Your Sandbox - 这是用户启动的进程。