Iphone 应用程序在设备上崩溃,但在模拟器上运行良好
我的addressbook应用程序在模拟器上运行良好。我有联系人添加功能。 在设备(IOS 6)上,它会崩溃。。有以下消息Iphone 应用程序在设备上崩溃,但在模拟器上运行良好,iphone,ios,addressbook,Iphone,Ios,Addressbook,我的addressbook应用程序在模拟器上运行良好。我有联系人添加功能。 在设备(IOS 6)上,它会崩溃。。有以下消息 ContactPro[837] has active assertions beyond permitted time: {( <BKProcessAssertion: 0x1f5a28a0> identifier: Suspending process: ContactPro[837] permittedBackgroundDuration: 10.0000
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 )}
任何人都可以提供一些如何解决它的提示
为了在IOS6中访问地址簿,我使用了以下几行。。
ABAddressBookRef ab=ABAddressBookCreateWithOptions(NULL,NULL)
我更改了通讯录的密码
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);
}
有了这一点,我也没有联系的参考?。。此外,该应用程序在模拟器和设备中都会崩溃。然而,我正在访问通讯录#请建议我。。可以做些什么来解决这个问题。谢谢
谢谢和问候我认为问题在于:您正在使用信号量阻止线程,直到“绿灯”出现。但是您正在线程0(管理用户界面的主线程)上执行此代码。 因此,您正在阻止用户界面中的所有更改,包括请求访问联系人的警报 编辑新代码 第一件事:试一试设备。出于某些原因,模拟器始终返回authorized,即使不是: 第二件事,用户第一次授权应用程序时不会执行“if(accessgrated)”,因为它是在完成块之前执行的(完成块等待用户决定),但块之后的代码会立即执行。您应该在另一个函数中移动该代码(例如,仅在授权后在完成块后调用)。 但是,出于测试目的,此代码应该在您第二次尝试访问AB(一旦授权)时起作用 您的AccessGrazed代码很好,除了一件事:如果您有一个250条记录的数组,那么您正在尝试访问记录250(该记录不存在,最后一条记录是249)。 换行
ABRecordRef ref = CFArrayGetValueAtIndex(all,recordsCount);
用这个
ABRecordRef ref = CFArrayGetValueAtIndex(all,recordsCount-1);
我试过了,效果很好我认为问题在于:你正在使用信号量阻止线程,直到“绿灯”出现。但是您正在线程0(管理用户界面的主线程)上执行此代码。 因此,您正在阻止用户界面中的所有更改,包括请求访问联系人的警报 编辑新代码 第一件事:试一试设备。出于某些原因,模拟器始终返回authorized,即使不是: 第二件事,用户第一次授权应用程序时不会执行“if(accessgrated)”,因为它是在完成块之前执行的(完成块等待用户决定),但块之后的代码会立即执行。您应该在另一个函数中移动该代码(例如,仅在授权后在完成块后调用)。 但是,出于测试目的,此代码应该在您第二次尝试访问AB(一旦授权)时起作用 您的AccessGrazed代码很好,除了一件事:如果您有一个250条记录的数组,那么您正在尝试访问记录250(该记录不存在,最后一条记录是249)。 换行
ABRecordRef ref = CFArrayGetValueAtIndex(all,recordsCount);
用这个
ABRecordRef ref = CFArrayGetValueAtIndex(all,recordsCount-1);
我试过了,效果很好你是否在某处使用了
beginBackgroundTaskWithExpirationHandler
?你能发布一些代码吗?您是否使用ABAddressBookRequestAccessWithCompletion请求权限?@LombaX是的,我使用ABAddressBookRequestAccessWithCompletion请求权限。。在模拟器中运行良好#谢谢你的帮助response@sergio不,我没有使用beginBackgroundTaskWithExpirationHandler#感谢您的回复您是否在某处使用了beginBackgroundTaskWithExpirationHandler
?您可以发布一些代码吗?您是否使用ABAddressBookRequestAccessWithCompletion请求权限?@LombaX是的,我使用ABAddressBookRequestAccessWithCompletion请求权限。。在模拟器中运行良好#谢谢你的帮助response@sergio不,我没有使用beginBackgroundTaskWithExpirationHandler#感谢您的回复我根据您的建议更改了通讯簿访问代码。但我没有得到一个新联系人创建的参考。请检查我的更新代码#非常感谢你的回答!它起作用了!早些时候,我在通讯录上贴了一个问题,请检查一下#如果你做过类似的事情,我希望你能回答#谢谢没有人做过这个,但我想我已经找到了一个解决方案,看看:-)我根据你的建议更改了通讯簿访问代码。但我没有得到一个新联系人创建的参考。请检查我的更新代码#非常感谢你的回答!它起作用了!早些时候,我在通讯录上贴了一个问题,请检查一下#如果你做过类似的事情,我希望你能回答#谢天谢地,没有人做过这件事,但我想我已经找到了解决方案,请查看:-)