联系人和麦克风请求访问权限不适用于 iOS 9

Contacts and Microphone request access does not work on iOS 9

自上周一以来我一直被一个错误所困,所以我现在寻求帮助.. 联系人和 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)
        }
    })
}

这个函数被调用了,没有问题,问题是它总是 return.denied 并且错误设置为 "Access denied",即使没有向用户显示警报。麦克风也一样。

密钥 'Privacy - Contacts Usage Description' 存在于我的 Info.plist

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

此代码在 iOS 10 和 iOS 11 上运行完美。但在 iOS 9

上没有机会

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

谢谢!

我在 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
}

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

唯一的解决方案是:

  1. 更改 bundle id,这将使您的应用充当不同的应用
  2. 重置您的 device/simulator(当然,如果有模拟器会更容易)
  3. 将隐私设置从关闭更改为开启

对于最终用户,我看到 UI 提示用户在看到 "denied" 时更改设置。

你可以这样做:

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)
                    }
                }

            })