请求访问Swift中的联系人3

时间:2017-08-30 17:59:54

标签: ios swift swift3 contacts

我想访问用户的联系人,并计划使用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)
    }
}

任何人都可以帮忙解决这个问题吗?任何帮助都会非常感激。非常感谢提前。

干杯, 西奥

2 个答案:

答案 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