联系人和麦克风请求访问在iOS 9上不起作用

时间:2017-10-30 15:37:11

标签: ios swift contacts access ios9.3

自上周一以来我一直被困在一个小虫身上,所以我现在正在寻求帮助.. 联系人和Micriohpone请求访问在iOS 9上不起作用。我使用这段代码来请求访问联系人:

let contactsStore = CNContactStore()

func requestAccess(completionHandler: @escaping (Permission) -> ()) {
    self.contactsStore.requestAccess(for: .contacts, completionHandler: { (granted, error) in
        if granted {
            completionHandler(.granted)
        } else {
            completionHandler(.denied)
        }
    })
}

这个函数被调用,没有问题,问题是它总是返回.denied和错误设置"访问被拒绝",即使没有向用户显示警报。麦克风一样。

密钥'隐私 - 联系人使用说明'存在于我的Info.plist

编辑: 我也知道,当用户拒绝使用时,它不再显示,但另一个问题是没有"切换"在应用程序的设置部分。我试图恢复设备(在模拟器上工作,因为我没有真正的iOS 9设备),但仍然是相同的行为。

此代码在iOS 10和iOS 11上运行完整。但在iOS 9上没有机会

如果你能帮助我解决这个问题,那就太棒了。

谢谢!

1 个答案:

答案 0 :(得分:0)

我用最简单的方式在9.3上尝试了这个,我得到了一个提示:

import UIKit
import Contacts

class ViewController: UIViewController {

    let contactsStore = CNContactStore()

    override func viewDidAppear(_ animated: Bool) {
        DispatchQueue.main.async {

            self.requestAccess(completionHandler: { (permission) in
                print("The user said \(permission)")
            })

        }
    }

    func requestAccess(completionHandler: @escaping (Permission) -> ()) {
        self.contactsStore.requestAccess(for: .contacts, completionHandler: { (granted, error) in
            if granted {
                completionHandler(.granted)
            } else {
                completionHandler(.denied)
            }
        })
    }
}

enum Permission {
    case granted
    case denied
}

Settings -> Privacy -> Contacts

这很好用。我认为问题是你已经否认了它。

唯一的解决方案是:

  1. 更改套件ID,这将使您的应用充当另一个
  2. 重置您的设备/模拟器(如果是模拟器,当然更容易)
  3. 将隐私设置从关闭更改为开启
  4. 对于最终用户,我看到如果用户看到“已拒绝”,则会提示用户更改设置。

    你可以这样做:

    self.requestAccess(completionHandler: { (permission) in
                    print("The user said \(permission)")
    
                    if ( permission == .denied ) {
                        let urlStr = UIApplicationOpenSettingsURLString
    
                        if let url = URL(string:urlStr) {
                            UIApplication.shared.openURL(url)
                        }
                    }
    
                })