如何才能将地址​​簿权限弹出窗口显示在顶部?

时间:2013-03-14 15:09:36

标签: ios addressbook abaddressbook

我正在指导一个由7年级和8年级学生组成的团队,致力于开发一个小型应用程序,以大格式显示地址簿中的选项。您可以在callmeapp.org查看他们的一般项目。我们坚持如何提示用户获得权限,以便我们可以访问通讯录。基本上用户提示没有正确显示。仅供参考,我们已经了解了通过设置>一般>重置>重置位置&隐私。

我们正在使用xCode 4.6并在运行版本6.1.2的iPhone MC918LL / A上进行测试。

我们在appdelegate.m didfinishlaunchingwithoptions方法中使用DavidPhilipOster在此主题中的响应开始:How do I correctly use ABAddressBookCreateWithOptions method in iOS 6?。我们做了一些编辑以清除我们得到的错误。

现在,应用程序启动到黑屏并在那里停留至少24秒,此时应用程序似乎关闭,显示下方的权限提示。接受将我们发送到桌面。当我们重新打开应用程序时,它就像许可已被清除一样工作。或者,如果我们点击主屏幕按钮(手机上的方形按钮)而屏幕为黑色,则会关闭以显示上述权限提示。 permisison窗口应在很短的延迟后显示,然后在用户允许时将我们留在应用程序中。

我们陷入了一些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;
}

1 个答案:

答案 0 :(得分:10)

这里的主要问题是你在应用程序中这样做:didFinishLaunchingWithOptions :.简而言之,这需要转移到另一个地方。 iOS限制了应用程序启动过程中发生的事情 - 以及可以花多长时间。对于一个简单的应用程序,您可以将其移动到主View Controller中,并在向最终用户显示任何结果之前检查它。

目前,因为您在此方法中使用信号量,所以它阻止函数返回。 iOS对等待时间有严格的限制 - 然后它会杀死应用程序。简而言之,弹出窗口保持打开状态 - 但是当你按OK时 - 应用程序被杀死,因为应用程序: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];
         }
    }
}