如何在 iOS 10 中访问相机、日历、照片、麦克风、位置、媒体库、动作、语音识别、SiriKit、电视提供商

How to access Camera, Calendar, Photos, Microphone, Location, Media Library, Motion, Speech Recognition, SiriKit, TV Provider in iOS 10

我正在为 iOS 10 开发我的应用程序,但我的默认 iOS 功能扩展无法正常工作。比如我无法访问相机、麦克风和媒体库。每次都崩溃了。我都写了,但没有任何效果。

case .Authorized:
        picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone
        {
            self.presentViewController(picker!, animated: true, completion: nil)
        }
        break
    //handle authorized status
    case .Denied, .Restricted :
        print("Denied")

        let alertController = UIAlertController (title: appName, message: "Go to Settings?", preferredStyle: .Alert)

        let settingsAction = UIAlertAction(title: "Settings", style: .Default) { (_) -> Void in
            let settingsUrl = NSURL(string: UIApplicationOpenSettingsURLString)
            if let url = settingsUrl {
                UIApplication.sharedApplication().openURL(url)
            }
        }

        let cancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: nil)
        alertController.addAction(settingsAction)
        alertController.addAction(cancelAction)

        presentViewController(alertController, animated: true, completion: nil)
        break

iOS10 中的一个重大变化是您必须提前声明对私人数据的任何访问,否则您的应用程序将崩溃。修复快速但简单如果使用不是应用程序的主要功能,请忽略,所以如果您计划 iOS 10 迁移,这里提醒您。

不要忘记你的目的字符串

一旦您 link 与 iOS 10 您必须声明对任何用户私有数据类型的访问。为此,您可以在应用程序的 Info.plist 中添加使用密钥以及用途字符串。 算作私有数据的框架列表很长:

通讯录、日历、提醒、照片、蓝牙共享、麦克风、相机、位置、健康、HomeKit、媒体库、Motion、CallKit、语音识别、SiriKit、电视提供商.

如果您正在使用这些框架之一并且未能声明使用,您的应用程序将在首次访问时崩溃。崩溃日志有助于告诉您缺少哪个密钥。例如,这是在不加key的情况下访问摄像头的结果Info.plist:

此应用已崩溃,因为它试图在没有使用说明的情况下访问隐私敏感数据。应用程序的 Info.plist 必须包含一个 NSCameraUsageDescription 键和一个向用户解释应用程序如何使用此数据的字符串值。

为避免崩溃,我们需要将建议的密钥添加到“Info.plist”(Xcode 8 已包含可能密钥的完整列表):

系统在要求用户允许访问时显示目的字符串(因此您可能需要对其进行本地化):

Apple的方向很明确。如果您访问私人数据,请提前声明您的意图,否则您的应用程序会崩溃。

您可以查看苹果文档的所有隐私设置密钥:Privacy setting keys for iOS10