我的地址簿应用程序在模拟器上运行正常。我有联系人添加功能。 在设备(IOS 6)上,它会崩溃..带有以下消息。
ContactPro[837] has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x1f5a28a0> identifier: Suspending process: ContactPro[837] permittedBackgroundDuration: 10.000000 reason: suspend owner pid:52 preventSuspend preventThrottleDownCPU preventThrottleDownUI )}
之后,许多信息都会像这样出现
Elapsed total CPU time (seconds): 10.030 (user 10.030, system 0.000), 100% CPU
Elapsed application CPU time (seconds): 3.724, 37% CPU
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 libsystem_c.dylib 0x33be8b1e __vfprintf + 158
1 libsystem_c.dylib 0x33b93106 vsnprintf_l + 170
2 libsystem_c.dylib 0x33b9455c snprintf + 68
3 libsystem_c.dylib 0x33b968a6 asl_string_append_char_no_encoding + 102
4 libsystem_c.dylib 0x33b9694c asl_string_append_internal + 124
5 libsystem_c.dylib 0x33b96536 asl_msg_to_string_raw + 118
6 libsystem_c.dylib 0x33b95b06 _asl_send_message + 1018
7 CoreFoundation 0x380d417a __CFLogCString + 602
8 CoreFoundation 0x3807801e _CFLogvEx + 186
9 Foundation 0x3a13ed8a NSLogv + 82
10 Foundation 0x3a13ed2a NSLog + 22
11 ContactPro 0x000a7d38 0xa4000 + 15672
12 ContactPro 0x000a686e 0xa4000 + 10350
13 ContactPro 0x000b9dd0 0xa4000 + 89552
14 UIKit 0x37a6f590 -[UIViewController loadViewIfRequired] + 360
15 UIKit 0x37ac4136 -[UIViewController contentScrollView] + 22
16 UIKit 0x37ac407c -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 24
17 UIKit 0x37ac3f60 -[UINavigationController _layoutViewController:] + 28
18 UIKit 0x37ac3e84 -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 268
19 UIKit 0x37ac35c4 -[UINavigationController _startTransition:fromViewController:toViewController:] + 60
20 UIKit 0x37ac34ac -[UINavigationController _startDeferredTransitionIfNeeded:] + 320
21 UIKit 0x37a944e4 -[UILayoutContainerView layoutSubviews] + 176
22 UIKit 0x37a53806 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 254
23 QuartzCore 0x36145d5e -[CALayer layoutSublayers] + 210
24 QuartzCore 0x361458fc CA::Layer::layout_if_needed(CA::Transaction*) + 456
25 QuartzCore 0x361747a2 -[CALayer layoutIfNeeded] + 138
26 UIKit 0x37afd0cc -[UIViewController window:setupWithInterfaceOrientation:] + 204
27 UIKit 0x37afc2b8 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] + 3616
28 UIKit 0x37afb48a -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 42
29 UIKit 0x37afb414 -[UIWindow _setRotatableViewOrientation:duration:force:] + 64
30 UIKit 0x37c3117c __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke_0 + 100
31 UIKit 0x37ab967e -[UIWindow _updateToInterfaceOrientation:duration:force:] + 214
32 UIKit 0x37ab93c0 -[UIWindow setAutorotates:forceUpdateInterfaceOrientation:] + 688
33 UIKit 0x37ab8d2e -[UIViewController _tryBecomeRootViewControllerInWindow:] + 154
34 UIKit 0x37aafea6 -[UIWindow addRootViewControllerViewIfPossible] + 366
35 UIKit 0x37aabae8 -[UIWindow _setHidden:forced:] + 360
36 UIKit 0x37aed1cc -[UIWindow makeKeyAndVisible] + 56
37 ContactPro 0x000a5c88 0xa4000 + 7304
38 UIKit 0x37ab0ad4 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 248
39 UIKit 0x37ab065e -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1186
40 UIKit 0x37aa8846 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 694
41 UIKit 0x37a50c3c -[UIApplication handleEvent:withNewEvent:] + 1000
42 UIKit 0x37a506d0 -[UIApplication sendEvent:] + 68
43 UIKit 0x37a5011e _UIApplicationHandleEvent + 6150
44 GraphicsServices 0x35ce35a0 _PurpleEventCallback + 588
45 CoreFoundation 0x380bb680 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12
46 CoreFoundation 0x380baee4 __CFRunLoopDoSources0 + 208
47 CoreFoundation 0x380b9cb2 __CFRunLoopRun + 642
48 CoreFoundation 0x3802ceb8 CFRunLoopRunSpecific + 352
49 CoreFoundation 0x3802cd44 CFRunLoopRunInMode + 100
50 UIKit 0x37aa7480 -[UIApplication _run] + 664
51 UIKit 0x37aa42fc UIApplicationMain + 1116
52 ContactPro 0x000a5864 0xa4000 + 6244
53 libdyld.dylib 0x36982b1c start + 0
任何人都可以提供一些如何解决的提示!
为了在IOS6中访问ADDRESS BOOK,我使用以下行... ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL,NULL);
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(ab, ^(bool granted, CFErrorRef error) {
accessGranted = granted;
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
// dispatch_release(sema);
}
else { // we're on iOS 5 or older
accessGranted = YES;
}
if (accessGranted) {
// Do whatever you want here
}
我更改了地址簿访问代码
ABAddressBookRef abcd = ABAddressBookCreateWithOptions(NULL, NULL);
__block BOOL accessGranted = NO;
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(abcd, ^(bool granted, CFErrorRef error) {
// First time access has been granted, add the contact
accessGranted = granted;
});
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
// The user has previously given access, add the contact
accessGranted = YES;
}
else {
// The user has previously denied access
// Send an alert telling user to change privacy setting in settings app
}
if (accessGranted) {
CFIndex recordsCount = ABAddressBookGetPersonCount(abcd);
CFArrayRef all = ABAddressBookCopyArrayOfAllPeople(abcd);
ABRecordRef ref = CFArrayGetValueAtIndex(all,recordsCount);
NSLog(@"%@", ref);
ABRecordID record = ABRecordGetRecordID(ref);
}
有了这个,我也没有得到联系人的参考?..此外,应用程序在模拟器和设备中都崩溃了。但是我正在访问AddressBook。 #pls建议我..可以做些什么来解决这个问题。感谢
谢谢&amp;此致
答案 0 :(得分:1)
我认为问题在于:您正在使用信号量来阻止线程,直到出现“绿灯”。但是您正在线程0(管理用户界面的主线程)上执行此代码。 因此,您将阻止用户界面中的所有更改,包括请求访问联系人的警报。
编辑新代码 第一件事:试试设备。出于某种原因,模拟器即使不是,也始终返回授权:ABAddressBookGetAuthorizationStatus in simulator always returns kABAuthorizationStatusAuthorized。
第二件事,您的“if(accessGranted)”将在用户第一次授权应用时执行,因为它在完成块之前执行(完成块等待用户决策) ),但紧接在块之后的代码立即执行。您应该将该代码移动到另一个函数中(例如,仅在授权后在完成块之后调用)。 但是,出于测试目的,一旦授权,此代码应该在您第二次尝试访问AB时起作用。
您的accessGranted代码很好,除了一件事:如果您有250条记录的数组,您正在尝试访问记录250(不存在,最后一条记录是数字249)。 改变这一行
ABRecordRef ref = CFArrayGetValueAtIndex(all,recordsCount);
用这个
ABRecordRef ref = CFArrayGetValueAtIndex(all,recordsCount-1);
我尝试了它的工作原理