我正在指导一个由 7 年级和 8 年级学生组成的团队,他们正在开发一个小型应用程序,该应用程序以大格式显示地址簿中的选择。你可以在 callmeapp.org 查看他们的一般项目。我们被困在如何提示用户许可以便我们可以访问地址簿。基本上用户提示没有正确显示。仅供参考,我们已经知道通过设置>常规>重置>重置位置和隐私来清除权限。
我们正在使用 xCode 4.6 并在运行版本 6.1.2 的 iPhone MC918LL/A 上进行测试。
我们从 DavidPhilipOster 在我们的 appdelegate.m didfinishlaunchingwithoptions 方法中的此线程中的响应代码开始:如何在 iOS 6 中正确使用 ABAddressBookCreateWithOptions 方法?. 我们进行了一些编辑以清除我们遇到的错误。
现在,该应用程序启动到黑屏并在那里停留至少 24 秒,此时该应用程序似乎关闭,显示下方的权限提示。接受将我们发送到桌面。当我们重新打开应用程序时,它就像权限已被清除一样工作。或者,如果我们在屏幕为黑色时点击主页按钮(手机上的方形按钮),它会关闭以显示上述权限提示。权限窗口应在很短的延迟后显示,然后在用户授予权限时将我们留在应用程序中。
我们停留在一些 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;
}