我想获得iPhone的所有联系人列表.
我检查了Address Book参考,我可能错过了一些东西,但我没有看到它提供了获取联系人列表的方法.
我有一个使用地址簿的应用程序.在iOS 6中运行时,当用户执行需要通讯簿访问的操作时,它会运行此代码.
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
{
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error)
{
if (granted)
{
showContactChooser();
}
});
CFRelease(addressBookRef);
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
{
showContactChooser();
}
else
{
showAccessDeniedAlert();
}
Run Code Online (Sandbox Code Playgroud)
这非常有效:我能够阅读联系人信息,当用户拒绝访问时,应用程序会做出相应的反应.
但是,如果用户:
应用程序立即崩溃main(),没有异常信息或有意义的堆栈跟踪.我尝试打开"所有异常"和[NSException raise]断点,但这并没有给我任何更多信息.
即使应用程序在启动期间未运行上述代码,也可以重现崩溃.
这里发生了什么事?我应该订阅回调吗?
此代码适用于iOS5/iOS6但不适用于iOS7.
CFErrorRef *error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
//ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);
for(int i = 0; i < numberOfPeople; i++) {
ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i );
NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
// NSLog(@"Name:%@ %@", firstName, lastName);
ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSString *phoneNumber;
for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {
phoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, …Run Code Online (Sandbox Code Playgroud) Square的新名片盒iOS应用程序具有"创建帐户"功能.点击它,它会显示一个表格PREPOPULATED与用户在地址簿中的条目.
这怎么可能?谁知道?我认为这是不可能的,以这种方式获取用户的信息.这不是iOS 5.0的东西,afaict.
这个代码在iOS 5.1上运行正常,也可以在iOS 6的iPhone模拟器中运行.它在运行iOS 6的iPhone 4上无声地失败.最终结果是我无法将人添加到Contacts应用程序中.以下代码片段都不起作用(每个日志跟随):
ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(_addressBook);
NSLog(@"2 - defaultSource = %@", defaultSource);
Run Code Online (Sandbox Code Playgroud)
AB:无法编译查询语句(ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties):SELECT ROWID,Name,ExternalIdentifier,Type,ConstraintsPath,ExternalModificationTag,ExternalSyncTag,AccountID,Enabled,SyncData,MeIdentifier,Capabilities FROM ABStore WHERE Enabled =?;
2012-09-24 11:00:36.731 QR vCard [193:907] 2 - defaultSource =(CPRecord:0x1f59fd50 ABStore)
当我尝试将一个人添加到地址簿时,我得到了这个(似乎是因为源是无效的,即使它看起来好像从上面可以):
2012-09-24 11:18:32.231 QR vCard [220:907] ABAddressBookAddRecord error =操作无法完成.(ABAddressBookErrorDomain错误1.)
我以为我可以获得所有的来源,然后选择一个,但以下都没有返回任何:
CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources (_addressBook);
NSLog(@"2 - allSources = %@", allSources);
Run Code Online (Sandbox Code Playgroud)
AB:无法编译查询语句(ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties):SELECT ROWID,Name,ExternalIdentifier,Type,ConstraintsPath,ExternalModificationTag,ExternalSyncTag,AccountID,Enabled,SyncData,MeIdentifier,Capabilities FROM ABStore WHERE Enabled =?;
2012-09-24 10:58:09.908 QR vCard [177:907] 2 - allSources =()
我正在将所有本地地址簿联系人导入我的应用程序.目前,要求获得"允许访问联系人"权限的alertview在应用程序启动时完成.
如何更改它以便在应用程序的其他位置询问权限?点击按钮就像Instagram一样?
看这张图:

知道为什么有些人CNContacts回来时电话号码是空的吗?
我不断得到这样的输出:
"phoneNumbers=(not fetched), emailAddresses=(not fetched),"
Run Code Online (Sandbox Code Playgroud)
例如,当我从模拟器的内置联系人应用程序中获取联系人时,我会得到混合结果:
"John Appleseed" 确实返回了电话号码,但"Kate Bell"没有返回- 尽管她显然有电话号码。这很奇怪,因为我肯定CNContactPhoneNumbersKey在我的获取请求中使用。
这是我的代码:
let fetchKeys = [ CNContactEmailAddressesKey, CNContactPhoneNumbersKey,
CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName) ]
let contactFetchRequest = CNContactFetchRequest(keysToFetch: fetchKeys)
do {
try self.contactsStore.enumerateContactsWithFetchRequest(contactFetchRequest) {
fetchedContact, stop in
print("fetched Contact is: \n\(fetchedContact.description)")
}
}
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,输出显示有时获取的联系人会返回电话号码,有时则不会。电子邮件也是如此:有时会被退回,有时不会。
这种情况在模拟器中以及当我在 iPhone 上运行时都会发生。
知道这里会发生什么吗?
我知道在iOS 6中我们应该首先请求访问联系人,如下所示:

但现在,我想知道如何在警报视图中添加详细消息,只需在alert-title和两个按钮之间添加.我确实看到有些应用已经做到了.
我使用ABAddressBookCreateWithOptions和ABAddressBookRequestAccessWithCompletion,但前一个选项保留为NULL,而后一个选项仅接受回调块.
我搜索了很多,比如另一个Q,iOS 6发行说明和Apple Doc,但未能成功.
非常感谢您的帮助.:)
我遇到了解决随机崩溃的问题:有时会崩溃/有时不崩溃.根据EXC_BAD_ACCESS执行ABAddressBookSave时!,我应该采用多值参数来获取正确的值,
日期,地址,电子邮件,电话:所有都被视为multiValueRef.
代码供参考:
CFErrorRef error = NULL;
ABRecordRemoveValue (record,kABPersonFirstNameProperty,&error);
ABRecordRemoveValue(record, kABPersonLastNameProperty,&error);
ABRecordRemoveValue(record, kABPersonOrganizationProperty,&error);
ABRecordRemoveValue(record, kABPersonPrefixProperty,&error);
ABRecordRemoveValue(record, kABPersonSuffixProperty,&error);
ABRecordRemoveValue(record, kABPersonNicknameProperty,&error);
ABRecordRemoveValue(record, kABPersonMiddleNameProperty,&error);
ABRecordRemoveValue(record,kABPersonDepartmentProperty,&error);
ABRecordRemoveValue(record,kABPersonJobTitleProperty,&error);
ABRecordRemoveValue(record,kABPersonNoteProperty,&error);
ABRecordRemoveValue(record,kABPersonBirthdayProperty,&error);
ABRecordRemoveValue(record,kABPersonAddressProperty,&error);
ABRecordRemoveValue(record,kABPersonEmailProperty,&error);
ABRecordRemoveValue(record,kABPersonPhoneProperty,&error);
bool success = false;
string m_strDisplayName = item->getDisplayName();
string m_strFirstName = item->getFirstName();
string m_strLastName = item->getLastName();
string m_strMiddleName = item->getMiddleName();
string m_strAddress = item->getAddress();
string m_strHomeAddr = item->getHomeAddress();
string m_strWorkAddress = item->getWorkAddress();
string m_strCompany = item->getCompany();
string m_strTitle = item->getTitle();
string m_strPhoto = item->getPhoto();
string m_strNotes = item->getNotes();
string m_strPrefix …Run Code Online (Sandbox Code Playgroud) 我正在指导一个由7年级和8年级学生组成的团队,致力于开发一个小型应用程序,以大格式显示地址簿中的选项.您可以在callmeapp.org查看他们的一般项目.我们坚持如何提示用户获得权限,以便我们可以访问通讯录.基本上用户提示没有正确显示.仅供参考,我们已经了解了通过设置>常规>重置>重置位置和隐私来清除权限.
我们正在使用xCode 4.6并在iPhone MC918LL/A运行版本6.1.2上进行测试.
我们在appdelegate.m didfinishlaunchingwithoptions方法中使用DavidPhilipOster在此线程中的响应开始:如何在iOS 6中正确使用ABAddressBookCreateWithOptions方法?.我们做了一些编辑以清除我们得到的错误.
现在,应用程序启动到黑屏并在那里停留至少24秒,此时应用程序似乎关闭,显示下方的权限提示.接受将我们发送到桌面.当我们重新打开应用程序时,它就像许可已被清除一样工作.或者,如果我们点击主屏幕按钮(手机上的方形按钮)而屏幕为黑色,则会关闭以显示上述权限提示.permisison窗口应在很短的延迟后显示,然后在用户授权时将我们留在应用程序中.
我们陷入了一些NSLog点,看看发生了什么.我已将它们留在代码中,以防有所帮助.它将显示点1,2,5,然后等待.清除提示3,7和4后,即使手机显示桌面也输入.
任何帮助或提示将不胜感激.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"Point 1");
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL,NULL);
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
NSLog(@"Point 2");
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
NSLog(@"Point 3");
accessGranted = granted;
dispatch_semaphore_signal(sema);
NSLog(@"Point 4");
});
NSLog(@"Point 5");
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
} else { // we're on iOS 5 or older
NSLog(@"Point 6");
accessGranted …Run Code Online (Sandbox Code Playgroud) ios ×10
addressbook ×4
contacts ×2
iphone ×2
cncontact ×1
cocoa-touch ×1
ios4 ×1
ios6 ×1
ios7 ×1
ios9 ×1
ipad ×1
permissions ×1
square ×1
swift ×1