Ios 访问用户通讯簿的权限警报不会停止执行
我有一个按钮可以从用户的通讯簿中导入联系人。当他们第一次点击按钮时,我的代码返回一个bool,指示用户是否授予了权限。如果授予了权限,则将导入联系人,我将执行到表视图的转换。如果未授予权限,则不会导入联系人,我将对空表视图执行相同的步骤。以下是我所拥有的:Ios 访问用户通讯簿的权限警报不会停止执行,ios,swift,methods,switch-statement,abaddressbook,Ios,Swift,Methods,Switch Statement,Abaddressbook,我有一个按钮可以从用户的通讯簿中导入联系人。当他们第一次点击按钮时,我的代码返回一个bool,指示用户是否授予了权限。如果授予了权限,则将导入联系人,我将执行到表视图的转换。如果未授予权限,则不会导入联系人,我将对空表视图执行相同的步骤。以下是我所拥有的: func myImportThenSegueFunction() { if userHasAuthorizedAddressBookAccess() == true { // Import contacts and p
func myImportThenSegueFunction() {
if userHasAuthorizedAddressBookAccess() == true {
// Import contacts and perform segue
} else {
// Just perform segue
}
}
func userHasAuthorizedAddressBookAccess() -> Bool {
switch ABAddressBookGetAuthorizationStatus() {
case .Authorized:
return true
case .NotDetermined:
var userDidAuthorize: Bool!
ABAddressBookRequestAccessWithCompletion(nil) { (granted: Bool, error: CFError!) in
if granted {
userDidAuthorize = true
} else {
userDidAuthorize = false
}
}
return userDidAuthorize
case .Restricted:
return false
case .Denied:
return false
}
}
问题在于,当点击按钮时,访问权限设置警报会短暂显示,而在警报提示中,在用户授予或拒绝访问权限之前,视图会在后台执行该步骤。然后应用程序立即崩溃,表示.NotDetermined返回了nil,这意味着在用户甚至可以在ABAddressBookRequestAccessWithCompletionnil的if/else块中选择设置UserDidAuthority之前,就返回了变量UserDidAuthority
我的问题是,为什么代码在case.NotDetermined中执行return,在用户设置变量userDidAuthorize以通过警报提示返回正确的bool之前?我见过一些黑客将执行过程包装成一个时间延迟,我知道这个功能已经被弃用了。如何使其正常工作?因为ABAddressBookRequestAccessWithCompletion是异步的,并且会立即返回。它需要像这样,因为它通常是从主线程使用的,并且在请求用户权限时不能阻止
您需要改变使用它的方式来接受这一点,方法是在知道状态后调用一个状态为的完成块,而不是立即返回状态