Yêu cầu quyền cho Máy ảnh và Thư viện trong iOS 10 - Info.plist


84

Tôi đã triển khai WKWebView trong một ứng dụng. có một đầu vào tệp trong trang web hiển thị nơi nó sẽ nhập hình ảnh từ ảnh. Bất cứ khi nào tôi nhấn vào mục nhập đó và chọn "Chụp ảnh" hoặc "Thư viện ảnh", ứng dụng đột nhiên gặp sự cố, tôi cho rằng đó là do ứng dụng thiếu quyền chụp ảnh hoặc nhập từ thư viện.

Làm cách nào để gửi yêu cầu cấp quyền khi người dùng chọn một trong các phương pháp được đề cập (Chụp ảnh hoặc Thư viện ảnh)?

Tôi sử dụng Swift 3.0 với WKWebView.


1
@KiritModi Xin chào, cảm ơn rất nhiều. Bạn có thể vui lòng đăng nó như một câu trả lời để tôi có thể chấp nhận nó.
Alamri

1
Oky .. tôi sẽ ...
Kirit Modi 22/09/2016

FYI: UIImagePickerController tài liệu không bao giờ được cập nhật cho yêu cầu iOS10 + này (tôi đọc lướt tất cả các trang, kể cả các tài liệu di sản Objective-C)
ghế tập cơ bắp

Câu trả lời:


104

Bạn phải thêm quyền bên dưới vào Info.plist. Tham khảo thêm

Máy ảnh :

Key       :  Privacy - Camera Usage Description   
Value     :  $(PRODUCT_NAME) camera use

Tấm ảnh :

Key       :  Privacy - Photo Library Usage Description    
Value     :  $(PRODUCT_NAME) photo use

Tôi vẫn chưa quen với IOS, đặc biệt là ngôn ngữ mẹ đẻ của nó, Objective-c và Swift. Điều này đã cứu ngày của tôi .. Cảm ơn rất nhiều
Alamri 22/09/2016

Xin chào, tôi thực sự gặp sự cố khi yêu cầu người dùng iPhone7 đặt quyền cho thư viện ảnh. Khi người dùng iPhone7 truy cập cài đặt ứng dụng của tôi trên điện thoại của họ, tùy chọn thư viện ảnh bị thiếu. Tôi có Chìa khóa: Giá trị được đề cập ở trên trong info.plist của tôi. Điều kỳ lạ là tất cả các thiết bị chạy iOS 10 đều có thể nhìn thấy tùy chọn này, ngoại trừ người dùng iPhone7. Ví dụ như iPhone6 ​​chạy iOS 10 có thể thấy tùy chọn này. Tôi có thiếu một cái gì khác không?
DevKyle

1
Bạn không nên đưa PRODUCT_NAME vào các giá trị này vì giá trị đó đã được đưa vào thông báo của Apple. ví dụ: "Tên ứng dụng" muốn truy cập ảnh của bạn
Harris

122

Bạn cũng có thể yêu cầu quyền truy cập theo chương trình, điều này tôi thích hơn vì trong hầu hết các trường hợp, bạn cần biết mình đã lấy quyền truy cập hay chưa.

Bản cập nhật Swift 4:

    //Camera
    AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in
        if response {
            //access granted
        } else {

        }
    }

    //Photos
    let photos = PHPhotoLibrary.authorizationStatus()
    if photos == .notDetermined {
        PHPhotoLibrary.requestAuthorization({status in
            if status == .authorized{
                ...
            } else {}
        })
    }

Bạn không chia sẻ mã nên tôi không thể chắc chắn liệu điều này có hữu ích cho bạn hay không, nhưng nói chung, hãy sử dụng nó như một phương pháp hay nhất.


4
Cảm ơn, câu trả lời này đã làm việc cho tôi! Đối với những người đang sử dụng Swift 4, dòng nắm tay nên được đổi thành: "AVCaptureDevice.requestAccess (for: AVMediaType.video) {response in".
Kevin

1
Cảm ơn vì câu trả lời này. Nó hoạt động hoàn hảo. Tôi đã tự hỏi một điều về nó mặc dù. Khi bạn chạy requestAuthorization, nó có tạo ra một số loại trình lắng nghe đợi cho đến khi quyền được thiết lập trước khi chạy mã của nó không? Lúc đầu, tôi mặc dù việc thực thi mã đó chỉ dừng lại ở PHPhotoLibrary.authorizationStatus nhưng sau khi bỏ một loạt các câu lệnh in xung quanh, nó có vẻ như tiếp tục ??
George Kendros

4
Swift 3 : AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in. Đừng quên import AVFoundation.
iurii

2
Cảm ơn vì câu trả lời. Nếu không có nó, ứng dụng của tôi bị từ chối vì ứng dụng có thể truy cập thư viện ảnh mà không được phép.
Makalele

41

Tệp: Info.plist

Máy ảnh

<key>NSCameraUsageDescription</key>
<string>camera description.</string>

Ảnh

<key>NSPhotoLibraryUsageDescription</key>
<string> photos description.</string>

Lưu những hình ảnh

  <key>NSPhotoLibraryAddUsageDescription</key>
  <string> photos add description.</string>

Vị trí

<key> NSLocationWhenInUseUsageDescription</key>
<string> location description.</string>

Apple Music:

<key>NSAppleMusicUsageDescription</key>
<string>My description about why I need this capability</string>

Lịch

<key>NSCalendarsUsageDescription</key>
<string>My description about why I need this capability</string>

Siri

<key>NSSiriUsageDescription</key>
<string>My description about why I need this capability</string>

27

Sử dụng cài đặt plist được đề cập ở trên và trình truy cập thích hợp (AVCaptureDevice hoặc PHPhotoLibrary), nhưng cũng cảnh báo và gửi chúng đến cài đặt nếu bạn thực sự cần, như sau:

Swift 4.0 và 4.1

func proceedWithCameraAccess(identifier: String){
    // handler in .requestAccess is needed to process user's answer to our request
    AVCaptureDevice.requestAccess(for: .video) { success in
      if success { // if request is granted (success is true)
        DispatchQueue.main.async {
          self.performSegue(withIdentifier: identifier, sender: nil)
        }
      } else { // if request is denied (success is false)
        // Create Alert
        let alert = UIAlertController(title: "Camera", message: "Camera access is absolutely necessary to use this app", preferredStyle: .alert)

        // Add "OK" Button to alert, pressing it will bring you to the settings app
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
          UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!)
        }))
        // Show the alert with animation
        self.present(alert, animated: true)
      }
    }
  }

20

Tệp: Info.plist

Đối với máy ảnh :

<key>NSCameraUsageDescription</key>
<string>You can take photos to document your job.</string>

Đối với Thư viện ảnh , bạn sẽ muốn cái này cho phép người dùng ứng dụng duyệt qua thư viện ảnh.

<key>NSPhotoLibraryUsageDescription</key>
<string>You can select photos to attach to reports.</string>

14

Swift 5 Cách dễ nhất để thêm quyền mà không cần phải thực hiện theo chương trình, là mở tệp info.plist của bạn và chọn dấu + bên cạnh danh sách Thuộc tính thông tin. Cuộn qua danh sách thả xuống đến tùy chọn Quyền riêng tư và chọn Mô tả sử dụng máy ảnh riêng tư để truy cập máy ảnh hoặc Mô tả sử dụng thư viện ảnh riêng tư để truy cập Thư viện ảnh. Điền vào giá trị Chuỗi ở bên phải sau khi bạn đã lựa chọn, để bao gồm văn bản bạn muốn hiển thị cho người dùng của mình khi cửa sổ bật lên yêu cầu quyền.Quyền đối với máy ảnh / Thư viện ảnh


11

Để yêu cầu quyền cho ứng dụng ảnh, bạn cần thêm mã này (Swift 3) :

PHPhotoLibrary.requestAuthorization({ 
       (newStatus) in 
         if newStatus ==  PHAuthorizationStatus.authorized { 
          /* do stuff here */ 
    } 
})

đừng quên thêm <key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>vào info.plist
marcomoreira92

stange, tôi không có bất kỳ vấn đề. i thêm mã này trong một nút và tôi Tôi đang sử dụng iphone của tôi với iOS 10.3.1 để thử nghiệm và nó hoạt động tốt
marcomoreira92

3

Tôi đã viết một tiện ích mở rộng có tính đến tất cả các trường hợp có thể xảy ra:

  • Nếu quyền truy cập được cho phép, thì mã onAccessHasBeenGranted sẽ được chạy.
  • Nếu quyền truy cập không được xác định, thì requestAuthorization(_:) sẽ được gọi.
  • Nếu người dùng đã từ chối quyền truy cập thư viện ảnh ứng dụng của bạn, thì người dùng sẽ được hiển thị một cửa sổ đề nghị chuyển đến cài đặt và cho phép truy cập. Trong cửa sổ này, các nút "Hủy" và "Cài đặt" sẽ có sẵn cho anh ta. Khi anh ấy nhấn nút "cài đặt", cài đặt ứng dụng của bạn sẽ mở ra.

Ví dụ sử dụng:

PHPhotoLibrary.execute(controller: self, onAccessHasBeenGranted: {
    // access granted... 
})

Mã phần mở rộng:

import Photos
import UIKit

public extension PHPhotoLibrary {

   static func execute(controller: UIViewController,
                       onAccessHasBeenGranted: @escaping () -> Void,
                       onAccessHasBeenDenied: (() -> Void)? = nil) {

      let onDeniedOrRestricted = onAccessHasBeenDenied ?? {
         let alert = UIAlertController(
            title: "We were unable to load your album groups. Sorry!",
            message: "You can enable access in Privacy Settings",
            preferredStyle: .alert)
         alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
         alert.addAction(UIAlertAction(title: "Settings", style: .default, handler: { _ in
            if let settingsURL = URL(string: UIApplication.openSettingsURLString) {
               UIApplication.shared.open(settingsURL)
            }
         }))
         controller.present(alert, animated: true)
      }

      let status = PHPhotoLibrary.authorizationStatus()
      switch status {
      case .notDetermined:
         onNotDetermined(onDeniedOrRestricted, onAccessHasBeenGranted)
      case .denied, .restricted:
         onDeniedOrRestricted()
      case .authorized:
         onAccessHasBeenGranted()
      @unknown default:
         fatalError("PHPhotoLibrary::execute - \"Unknown case\"")
      }
   }

}

private func onNotDetermined(_ onDeniedOrRestricted: @escaping (()->Void), _ onAuthorized: @escaping (()->Void)) {
   PHPhotoLibrary.requestAuthorization({ status in
      switch status {
      case .notDetermined:
         onNotDetermined(onDeniedOrRestricted, onAuthorized)
      case .denied, .restricted:
         onDeniedOrRestricted()
      case .authorized:
         onAuthorized()
      @unknown default:
         fatalError("PHPhotoLibrary::execute - \"Unknown case\"")
      }
   })
}

0

Cách tuyệt vời để triển khai phiên Camera trong Swift 5 , iOS 13

https://github.com/egzonpllana/CameraSession

Camera Session là một ứng dụng iOS cố gắng tạo ra cách triển khai AVCaptureSession đơn giản nhất có thể.

Thông qua ứng dụng, bạn có thể thấy các phiên camera này được triển khai:

  • Máy ảnh gốc để chụp ảnh hoặc quay video.
  • Cách nhập ảnh và video gốc.
  • Cách tùy chỉnh để chọn nội dung như ảnh và video, với tùy chọn để chọn một hoặc nhiều nội dung từ Thư viện.
  • Máy ảnh tùy chỉnh để chụp (các) ảnh hoặc (các) video, với các tùy chọn để giữ nút và quay.
  • Yêu cầu cấp phép máy ảnh riêng biệt.

Máy ảnh tùy chỉnh có các tính năng như tùy chọn đèn pinxoay máy ảnh .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.