简体   繁体   中英

App crashes on device, however works fine on Simulator

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM