My addressbook app works fine on Simulator. I have Contact Add feature. On device(IOS 6) it get crashed.. with following message.
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 )}
After that, many lines of information comes like this
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
Can anyone provide some tips as to how to solve it!
For accessing ADDRESS BOOK in IOS6, i am using following lines.. 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
}
I changed the Addressbook access code,
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);
}
With this also i am not getting a reference to Contact?.. Also the app getting crashed in both Simulator and Device. However i am getting access to AddressBook. #pls suggest me.. what can be done to solve this issue. Thanks
Thanks & Regards
I think the problem is this: you are using a semaphore to block the thread until "the green light" appears. But you are executing this code on the thread 0 (the main thread, that manages the user interface). For this reason you are blocking all changes in the user interface, including the alert requesting access to contacts.
EDIT for the new code First thing: try on a device. For some reason, Simulator always return authorized even if not: ABAddressBookGetAuthorizationStatus in simulator always returns kABAuthorizationStatusAuthorized .
Second thing, your "if (accessGranted)" won't be executed the first time the user authorize the app, because it is executed before the completion block (the completion block waits the user decision), but the code immediately after the block is executed immediately. You should move that code in another function (called after the completion block only once authorized, for example). But, for testing purpose, this code should work the second time you try to access the AB, once authorized.
Your accessGranted code is fine except one thing: if you have an array of 250 records, you are trying to access the record 250 (that doesn't exists, the last record is number 249). Change this line
ABRecordRef ref = CFArrayGetValueAtIndex(all,recordsCount);
with this
ABRecordRef ref = CFArrayGetValueAtIndex(all,recordsCount-1);
I tried and it works
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.