iOS 10에서 카메라 및 라이브러리에 대한 권한 요청-Info.plist


84

앱에서 WKWebView를 구현했습니다. 표시된 웹 페이지에 사진에서 이미지를 가져와야하는 파일 입력이 있습니다. 해당 입력을 누르고 "사진 찍기"또는 "사진 보관함"을 선택할 때마다 앱이 갑자기 충돌합니다. 앱이 사진을 찍거나 라이브러리에서 가져올 수있는 권한이 없기 때문이라고 생각합니다.

사용자가 언급 된 방법 (사진 찍기 또는 사진 라이브러리) 중 하나를 선택할 때 권한 요청을 어떻게 푸시합니까?

WKWebView와 함께 Swift 3.0을 사용합니다.


1
@KiritModi 안녕하세요, 감사합니다. 내가 받아 들일 수 있도록 답변으로 게시 해 주시겠습니까?
Alamri

1
Oky .. 난 윌 ...
Kirit 모디

참고 : UIImagePickerController 문서는이 iOS10 + 요구 사항에 대해 업데이트되지 않았습니다 (기존 Objective-C 문서를 포함한 모든 페이지를 훑어
봤습니다

답변:


104

Info.plist에 아래 권한을 추가해야합니다. 더 많은 추천

카메라 :

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

사진 :

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

저는 IOS, 특히 모국어 인 Objective-c와 Swift를 처음 사용합니다. 이것은 나의 일 .. 감사 작정 저장
알람 리를

안녕하세요, 실제로 iPhone7 사용자가 사진 라이브러리 권한을 설정하는 데 문제가 있습니다. iPhone7 사용자가 휴대폰에서 내 앱 설정으로 이동하면 사진 라이브러리 옵션이 없습니다. 내 info.plist에 위에서 언급 한 Key : Value가 있습니다. 이상한 부분은 iPhone7 사용자를 제외하고 iOS 10을 실행하는 모든 장치에서이 옵션을 볼 수 있다는 것입니다. 예를 들어 iOS 10을 실행하는 iPhone6에서이 옵션을 볼 수 있습니다. 나는 다른 것을 놓치고 있습니까?
DevKyle

1
PRODUCT_NAME은 이미 Apple 메시지에 포함되어 있으므로이 값에 포함하면 안됩니다. 예를 들어 '앱 이름 "액세스 사진에 같은 것
해리스

122

프로그래밍 방식으로 액세스를 요청할 수도 있습니다. 대부분의 경우 액세스 권한을 얻었는지 여부를 알아야하기 때문에 선호합니다.

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

당신은 코드를 공유하지 않기 때문에 이것이 당신에게 도움이 될지 확신 할 수 없지만 일반적으로 그것을 모범 사례로 사용합니다.


4
감사합니다.이 답변은 저에게 효과적이었습니다! Swift 4를 사용하는 사람들의 경우 첫 번째 줄을 "AVCaptureDevice.requestAccess (for : AVMediaType.video) {response in"으로 변경해야합니다.
Kevin

1
이 답변에 감사드립니다. 완벽하게 작동합니다. 나는 그것에 대해 한 가지 궁금합니다. requestAuthorization을 실행할 때 코드를 실행하기 전에 권한이 설정 될 때까지 기다리는 일종의 리스너를 생성합니까? 처음에는 코드 실행이 단순히 PHPhotoLibrary.authorizationStatus에서 중지되었지만 주변에 인쇄 문을 많이 삭제 한 후 계속 진행되는 것처럼 보입니다 ??
조지 Kendros

4
스위프트 3 : AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in. 잊지 마세요 import AVFoundation.
iurii

2
답변 해주셔서 감사합니다. 그것 없이는 앱이 허가없이 사진 라이브러리에 액세스 할 수 있기 때문에 내 앱이 거부되었습니다.
Makalele

41

파일 : Info.plist

카메라

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

사진

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

사진 저장

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

위치

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

Apple 음악 :

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

달력

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

시리

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

27

위에서 언급 한 plist 설정과 적절한 접근 자 (AVCaptureDevice 또는 PHPhotoLibrary)를 사용하지만, 실제로 필요한 경우 다음과 같이 경고하고 설정으로 보냅니다.

Swift 4.0 및 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

파일 : Info.plist

의 경우 카메라 :

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

들어 사진 라이브러리 ,이 하나의 앱 사용자가 사진 라이브러리를 검색 할 수 있도록 할 것입니다.

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

14

Swift 5 프로그래밍 방식없이 권한을 추가하는 가장 쉬운 방법은 info.plist 파일을 열고 정보 속성 목록 옆에있는 +를 선택하는 것입니다. 드롭 다운 목록에서 프라이버시 옵션까지 스크롤하고 카메라에 액세스하려면 프라이버시 카메라 사용 설명을 선택하고 사진 라이브러리에 액세스하려면 프라이버시 사진 라이브러리 사용 설명을 선택합니다. 선택한 후 오른쪽에있는 문자열 값을 입력하여 경고 팝업이 권한을 요청할 때 사용자에게 표시 할 텍스트를 포함합니다.카메라 / 사진 라이브러리 권한


11

사진 앱에 대한 권한을 요청하려면 다음 코드를 추가해야합니다 (Swift 3) .

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

추가하는 것을 잊지 마세요 <key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>의 Info.plist에
marcomoreira92

스 탕지, 난 아무 문제 없어. 나는 버튼이 코드를 추가하고 난 나는 시험에 아이폰 OS 10.3.1 내 아이폰을 사용하고 있는데 그것을 잘 작동합니다
marcomoreira92

3

가능한 모든 경우를 고려한 확장 프로그램을 작성했습니다.

  • 액세스가 허용되면 코드 onAccessHasBeenGranted가 실행됩니다.
  • 액세스가 결정되지 않으면 requestAuthorization(_:)호출됩니다.
  • 사용자가 앱 사진 라이브러리 액세스를 거부 한 경우 사용자에게 설정으로 이동하여 액세스를 허용하라는 창이 표시됩니다. 이 창에서 "취소"및 "설정"버튼을 사용할 수 있습니다. 그가 "설정"버튼을 누르면 응용 프로그램 설정이 열립니다.

사용 예 :

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

확장 코드 :

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

Swift 5 , iOS 13 에서 카메라 세션을 구현하는 좋은 방법

https://github.com/egzonpllana/CameraSession

Camera Session은 AVCaptureSession을 구현하는 가장 간단한 방법을 시도하는 iOS 앱입니다.

앱을 통해 구현 된 카메라 세션을 찾을 수 있습니다.

  • 사진을 찍거나 비디오를 녹화하는 기본 카메라.
  • 사진과 비디오를 가져 오는 기본 방법.
  • 라이브러리에서 하나 이상의 자산을 선택하는 옵션과 함께 사진 및 비디오와 같은 자산을 선택하는 사용자 지정 방법.
  • 버튼을 누른 상태로 녹화 할 수있는 옵션과 함께 사진 또는 비디오를 찍는 맞춤형 카메라.
  • 별도의 카메라 권한 요청.

토치회전 카메라 옵션 과 같은 맞춤형 카메라 기능 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.