我正在指导一个由七年级和八年级学生组成的团队开发一个小应用程序,该应用程序可以以大格式显示地址簿中的选择。你可以在callmeapp.org上查看他们的总体项目。我们在如何提示用户获得许可以便我们可以访问地址簿上卡住了。基本上,用户提示符没有正确显示。仅供参考,我们已经知道清除权限通过设置>通用>重置>重置位置&;隐私。
我们正在使用xCode 4.6,并在运行6.1.2版本的iPhone MC918LL/A上进行测试。
我们从appdelegate线程中DavidPhilipOster响应的代码开始。m didfinishlaunchingwithoptions方法:如何正确使用ABAddressBookCreateWithOptions方法在iOS 6?我们做了一些编辑来清除我们遇到的错误。
现在,应用程序启动到一个黑屏,在那里停留至少24秒,然后应用程序似乎关闭,显示下面的权限提示。接受让我们回到了桌面。当我们重新打开应用程序时,它就像已经清除了权限一样工作。或者,如果我们在屏幕是黑色的时候按home键(手机上的方块1),它会关闭,显示如上所示的权限提示。权限窗口应该在很短的延迟后显示,然后在用户授予权限时离开应用程序。
我们停留在一些NSLog点看看发生了什么。我把它们留在代码中,以防有帮助。它会显示点1,2,5,然后等待。清除提示符3,7,4后,即使手机显示桌面也可以输入
任何帮助或提示将不胜感激。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"Point 1");
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL,NULL);
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
NSLog(@"Point 2");
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
NSLog(@"Point 3");
accessGranted = granted;
dispatch_semaphore_signal(sema);
NSLog(@"Point 4");
});
NSLog(@"Point 5");
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
} else { // we're on iOS 5 or older
NSLog(@"Point 6");
accessGranted = YES;
}
NSLog(@"Point 7");
return YES;
}
这里的主要问题是你在应用程序:didFinishLaunchingWithOptions:中这样做。简而言之,这需要转移到另一个地方。iOS对应用程序启动过程中发生的事情以及需要多长时间进行了限制。对于一个简单的应用程序,你可以把它移到你的主视图控制器中,并在你向最终用户显示任何结果之前检查一下。
当前,因为你在这个方法中使用了一个信号量,它阻止了函数的返回。iOS对等待的时间有严格的限制,然后它会杀死应用程序。简而言之,弹出窗口保持打开状态,但是当你按OK时,应用程序被杀死,因为application:didFinishLaunchingWithOptions:方法没有及时完成执行。
此外,在这里我根本不推荐使用信号量方法。有更好的方法来解决这个问题(见下文)。下面的代码只是一个示例。
- (void)setupViewWithContactsData
{
// Do Something
}
- (void)setupViewWithoutContactsData
{
// Do Something because Contacts Access has been Denied or Error Occurred
}
- (void)viewDidLoad
{
[self checkForAddressBookAccess];
}
- (void)checkForAddressBookAccess
{
if (ABAddressBookRequestAccessWithCompletion == NULL)
{
// iOS5 or Below
[self setupViewWithContactsData];
return;
}
else
{
// iOS6
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
{
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
if(error)
{
[self setupViewWithoutContactsData];
}
else
{
[self setupViewWithContactsData];
}
});
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
{
[self setupViewWithContactsData];
}
else
{
[self setupViewWithoutContactsData];
}
}
}