我想访问用户的联系人,并计划使用Apple提供的Contacts和ContactsUI框架。
首先,我需要获得访问用户联系人的权限,并且无法这样做。在Swift 2中,可以像这样请求许可:
func requestForAccess(completionHandler: (accessGranted: Bool) -> Void) {
let authorizationStatus = CNContactStore.authorizationStatusForEntityType(CNEntityType.Contacts)
switch authorizationStatus {
case .Authorized:
completionHandler(accessGranted: true)
case .Denied, .NotDetermined:
self.contactStore.requestAccessForEntityType(CNEntityType.Contacts, completionHandler: { (access, accessError) -> Void in
if access {
completionHandler(accessGranted: access)
}
else {
if authorizationStatus == CNAuthorizationStatus.Denied {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let message = "\(accessError!.localizedDescription)\n\nPlease allow the app to access your contacts through the Settings."
self.showMessage(message)
})
}
}
})
default:
completionHandler(accessGranted: false)
}
}
我试图将它转换为Swift 3,但仍然会出现错误。错误是“实例成员'异步'不能在类型'DispatchQueue'上使用;你的意思是使用这种类型的值吗?”:
func requestForAccess(completionHandler: @escaping (_ accessGranted: Bool) -> Void) {
let authorizationStatus = CNContactStore.authorizationStatus(for: CNEntityType.contacts)
switch authorizationStatus {
case .authorized:
completionHandler(true)
case .denied, .notDetermined:
self.contactStore.requestAccess(for: CNEntityType.contacts, completionHandler: { (access, accessError) -> Void in
if access {
completionHandler(access)
}
else {
if authorizationStatus == CNAuthorizationStatus.denied {
DispatchQueue.async(group: DispatchQueue.main, execute: { () -> Void in //error here
let message = "\(accessError!.localizedDescription)\n\nPlease allow the app to access your contacts through the Settings."
self.showMessage(message)
})
}
}
})
default:
completionHandler(false)
}
}
任何人都可以帮忙解决这个问题吗?任何帮助都会非常感激。非常感谢提前。
干杯, 西奥
答案 0 :(得分:24)
而不是
std::list<int> li=*i;
for (std::list<int>::iterator iter=li.begin(); iter!=li.end();++iter)
{
if (arr[*iter]==0)
{
myQ.push(*iter);
arr[*iter]=1;
DO
DispatchQueue.async(group: DispatchQueue.main, execute: { ... }
顺便说一句,如果先前已经拒绝了许可,则再次请求授权是没有意义的,因为操作系统不会向最终用户提供任何“授权访问”UI。只有在用户之前没有拒绝访问时才会这样做。
如果访问联系人对于成功运行应用程序至关重要,您可以向他们显示警报,让他们可以直接从您的应用程序转到“设置”:
DispatchQueue.main.async { ... }
答案 1 :(得分:1)
确实是同一件事,但它不会将它视为否,而不是也许现在或类似的东西。您是否在Apple隐私提示中看到任何模糊逻辑?我没有。
ProcessFile