我直到一个小时左右才知道这一点,但是如果您的应用程序尝试通过ABAddressBook
类访问联系人(以前是地址簿)数据,则系统将提示用户进行确认,就像提示您一样。在iOS应用程序尝试访问通讯录数据时进行确认。然后,“安全性和隐私首选项”窗格将被更新,您将在“隐私”列表下看到您的应用程序。
因此,如果您在应用程序被阻止的情况下尝试访问通讯录数据,则会收到Xcode错误消息,例如“通讯录在路径上的可执行文件被拒绝...”。您可以在iOS中使用ABAddressBookGetAuthorizationStatus()
检查隐私状态。您如何确定您的应用程序是否在OS X中具有隐私权限?
此外,如果您有答案,我想知道Mac OS在“隐私”选项卡下的哪里存储了应用程序列表?我已经检查了用户的“首选项”文件夹。但是我看不到任何文件。
感谢您的帮助。
//编辑1 //
以下是当应用程序尝试使用ABAddressBook *addressBook = [ABAddressBook sharedAddressBook];
访问ABAddressBook时显示的错误输出:
2013-08-14 21:47:59.796 AppName[5374:1803] Address book access is denied for executable at path: /Users/Jim/Library/Developer/Xcode/DerivedData/AppName-eymlymijdmbqaldaqcaecgdyroxa/Build/Products/Debug/AppName.app/Contents/MacOS/AppName
(
0 AddressBook 0x00007fff8a1232fc __ABIsAccessGranted_block_invoke_0 + 36
1 libdispatch.dylib 0x00007fff93f5b0b6 _dispatch_client_callout + 8
2 libdispatch.dylib 0x00007fff93f5b041 dispatch_once_f + 50
3 AddressBook 0x00007fff8a123258 ABIsAccessGranted + 40
4 AddressBook 0x00007fff8a12319e +[ABAddressBook sharedAddressBook] + 12
5 AppName 0x00000001000180e7 -[AppDelegate extractWorkAddresses] + 55
6 AppName 0x0000000100011a68 -[AppDelegate extractWork1Address:] + 72
7 AppKit 0x00007fff8c9f6989 -[NSApplication sendAction:to:from:] + 342
8 AppKit 0x00007fff8cb2c37c -[NSMenuItem _corePerformAction] + 406
9 AppKit 0x00007fff8cb2c06a -[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] + 133
10 AppKit 0x00007fff8c81928f -[NSMenu _internalPerformActionForItemAtIndex:] + 36
11 AppKit 0x00007fff8c819117 -[NSCarbonMenuImpl _carbonCommandProcessEvent:handlerCallRef:] + 135
12 AppKit 0x00007fff8cb25175 NSSLMMenuEventHandler + 342
13 HIToolbox 0x00007fff8a84cd1a _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1206
14 HIToolbox 0x00007fff8a84c1e9 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 410
15 HIToolbox 0x00007fff8a861fc9 SendEventToEventTarget + 40
16 HIToolbox 0x00007fff8a898ca9 _ZL18SendHICommandEventjPK9HICommandjjhPKvP20OpaqueEventTargetRefS5_PP14OpaqueEventRef + 443
17 HIToolbox 0x00007fff8a83da21 SendMenuCommandWithContextAndModifiers + 59
18 HIToolbox 0x00007fff8a83d9d3 SendMenuItemSelectedEvent + 254
19 HIToolbox 0x00007fff8a83d85f _ZL19FinishMenuSelectionP13SelectionDataP10MenuResultS2_ + 94
20 HIToolbox 0x00007fff8a8198bb _ZL14MenuSelectCoreP8MenuData5PointdjPP13OpaqueMenuRefPt + 605
21 HIToolbox 0x00007fff8a818ec8 _HandleMenuSelection2 + 565
22 AppKit 0x00007fff8c9e48f6 _NSHandleCarbonMenuEvent + 245
23 AppKit 0x00007fff8c906acf _DPSNextEvent + 2073
24 AppKit 0x00007fff8c905e22 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128
25 AppKit 0x00007fff8c8fd1d3 -[NSApplication run] + 517
26 AppKit 0x00007fff8c8a1c06 NSApplicationMain + 869
27 AppName 0x0000000100002092 main + 34
28 AppName 0x0000000100002064 start + 52
)
最佳答案
如果用户授予访问权限,则您的应用程序可以照常访问ABAddressBook
。如果用户拒绝访问,则addressBook
的sharedAddressBook
和ABAddressBook
方法返回nil。
我不认为有一种避免这种异常的方法(与文档所说的异常不符)。因此,您可以在该部分代码中添加尝试将sharedAddressBook
放入try catch
块的位置,并避免在引发异常时使应用程序死亡。