首页 > Swift读取iOS系统通讯录时,请求授权对话框不在最上层?

Swift读取iOS系统通讯录时,请求授权对话框不在最上层?

RT,viewDidLoad中写了加载通讯录的部分,其中若是第一次运行应用,会请求授权,但是授权的对话框缺看不到

// ViewController.swift

import UIKit
import AddressBook
import AddressBookUI

class ViewController: UIViewController {
   override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        var testSwiftContacts:Array = getSysContacts()
        if testSwiftContacts.isEmpty {
            println("no contact")
        }
        for contact in testSwiftContacts {
            println(contact["FirstName"]!+"·"+contact["LastName"]!)
        }
    }
}

//  SwiftContactTool.swift

import Foundation
import AddressBook
import AddressBookUI

func getSysContacts() -> [[String:String]] {
    var error:Unmanaged<CFError>?
    var addressBook: ABAddressBookRef? = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue()

    let sysAddressBookStatus = ABAddressBookGetAuthorizationStatus()

    if sysAddressBookStatus == .Denied || sysAddressBookStatus == .NotDetermined {
        // Need to ask for authorization
        var authorizedSingal:dispatch_semaphore_t = dispatch_semaphore_create(0)
        var askAuthorization:ABAddressBookRequestAccessCompletionHandler = { success, error in
            if success {
                ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray
                dispatch_semaphore_signal(authorizedSingal)
            }
        }
        ABAddressBookRequestAccessWithCompletion(addressBook, askAuthorization)
        dispatch_semaphore_wait(authorizedSingal, DISPATCH_TIME_FOREVER)
    }

    return analyzeSysContacts( ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray )
}

func analyzeSysContacts(sysContacts:NSArray) -> [[String:String]] {
    var allContacts:Array = [[String:String]]()
    for contact in sysContacts {
        var currentContact:Dictionary = [String:String]()
        // 姓
        currentContact["FirstName"] = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as String? ?? ""
        // 名
        currentContact["LastName"] = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as String? ?? ""
        // 昵称
        currentContact["Nikename"] = ABRecordCopyValue(contact, kABPersonNicknameProperty)?.takeRetainedValue() as String? ?? ""
        // 公司(组织)
        currentContact["Organization"] = ABRecordCopyValue(contact, kABPersonOrganizationProperty)?.takeRetainedValue() as String? ?? ""
        // 职位
        currentContact["JobTitle"] = ABRecordCopyValue(contact, kABPersonJobTitleProperty)?.takeRetainedValue() as String? ?? ""
        // 部门
        currentContact["Department"] = ABRecordCopyValue(contact, kABPersonDepartmentProperty)?.takeRetainedValue() as String? ?? ""
        //备注
        currentContact["Note"] = ABRecordCopyValue(contact, kABPersonNoteProperty)?.takeRetainedValue() as String? ?? ""
        allContacts.append(currentContact)
    }
    return allContacts
}

下图是应用中断后可见到的对话框
应该如何解决呢?


这个授权框应该和push通知那个授权框一样的。
由于授权框由系统来调用,系统只有在你第一次真正用到该框架的APIs才会调用授权框。这样的话会由造成延误的可能。所以我觉得你在AppDelegate就调用一次相关的API来获取授权框。
对了,这个与你所使用的语言没有关系噢。无论objc or swift


系统授权应该和界面没关系吧 楼主怎么解决的 我也遇到这个问题了

【热门文章】
【热门文章】