상세 가이드›앱 웹뷰 카메라·센서 권한

앱 웹뷰 카메라·센서 권한

앱 안의 웹뷰에 펄핏을 넣을 때는 앱이 카메라 권한을 넘겨 줘야 합니다. 권한이 없으면 측정 화면에서 아래 같은 오류가 납니다. 안드로이드는 아래 순서대로, iOS는 맨 아래 절을 보세요.

앱 웹뷰 카메라·센서 권한

카메라 권한 이슈 발생시 해결 방안

위와 같은 에러가 발생한 경우 다음 3가지 조치를 진행해주세요.

  1. AndroidManifest.xml 에 카메라 권한 추가

    app/src/main/AndroidManifest.xml 파일 manifest 사이에 아래와 같은 코드를 추가해주세요

    AndroidManifest.xml
    <manifest>
        <!-- 중략 -->
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-feature android:name="android.hardware.camera" android:required="true" />
        <!-- 중략 -->
    </manifest>
  2. 펄핏 실행 전 카메라 권한 허락 팝업을 띄워주세요.

    MainActivity.kt에 아래와 같이 카메라 권한을 허용하는 코드를 설정해주세요

    MainActivity.kt
    val cameraPermissionCheck = ContextCompat.checkSelfPermission(
        this@MainActivity,
        android.Manifest.permission.CAMERA
    )
    
    if (cameraPermissionCheck != PackageManager.PERMISSION_GRANTED) {
        // 권한이 없는 경우
        ActivityCompat.requestPermissions(
            this,
            arrayOf(android.Manifest.permission.CAMERA),
            1000
        )
    }
  3. WebView의 권한요청을 전달해주세요

    webChromeClient에 onPermissionRequest 함수를 override 해주세요.

    MainActivity.kt
    val webView: WebView = findViewById(R.id.test_webview)
    
    // 중략
    
    webView.webChromeClient = object : WebChromeClient() {
        override fun onPermissionRequest(request: PermissionRequest?) {
            request?.grant(request.resources)
        }
    }

(선택) 필요시에만 카메라 권한 요청

앱 실행 시 권한을 요청하는 대신, 펄핏 버튼을 클릭했을 때만 권한을 요청하고 싶다면 아래 작업을 진행해주세요.

  1. 위 2번에서 MainActivity에 설정하였던 카메라 권한 확인 코드를 WebAppInterface 를 만들어 옮겨주세요

    웹뷰와 통신할 수 있도록 하는 자바스크립트인터페이스 코드 작성 (MainActivity 안쪽 코드는 이제 삭제해주세요)

    WebAppInterface.kt
    class WebAppInterface(private val mainActivity: MainActivity) {
        @JavascriptInterface
        fun checkPermission() {
            val cameraPermissionCheck = ContextCompat.checkSelfPermission(
                mainActivity,
                android.Manifest.permission.CAMERA
            )
    
            if (cameraPermissionCheck != PackageManager.PERMISSION_GRANTED) {
                // 권한이 없는 경우
                ActivityCompat.requestPermissions(
                    mainActivity,
                    arrayOf(android.Manifest.permission.CAMERA),
                    1000
                )
            }
        }
    }
  2. 웹뷰에 자바스크립트 인터페이스를 추가해주세요

    웹뷰에 JavascriptInterface를 추가하고, WebAppInterface를 생성할 때 mainActivity를 인자로 넘겨주세요.

    MainActivity.kt
    webView.addJavascriptInterface(WebAppInterface(this), "PerfittJsAndroidInterface")

iOS 앱 웹뷰라면

iOS는 사파리에서 바로 쓰면 따로 할 일이 없습니다. 앱 안의 WKWebView에 펄핏을 넣을 때만 아래 두 가지를 확인하세요.

카메라 권한

Info.plist에 NSCameraUsageDescription을 넣고, iOS 15 이상에서는 WKUIDelegate의 미디어 캡처 권한 요청에 허용으로 답해야 웹뷰 안에서 카메라가 켜집니다.

기울기 센서(선택)

옆면 촬영 때 펄핏은 휴대폰 기울기로 촬영 각도를 안내합니다. 사파리는 측정 중 "동작 및 방향 접근 허용" 팝업으로 직접 묻지만, 웹뷰에서는 펄핏이 perfittMotionPermission 메시지 핸들러로 앱에 요청을 넘깁니다. 앱이 이 핸들러를 등록했다면 권한을 처리한 뒤 window.perfittMotionPermission(true 또는 false)를 호출해 주세요. 등록하지 않으면 기울기 안내 없이 촬영이 진행됩니다.

Swift
// WKScriptMessageHandler
func userContentController(_ controller: WKUserContentController,
                           didReceive message: WKScriptMessage) {
    guard message.name == "perfittMotionPermission" else { return }
    // 앱의 동작 센서 권한을 확인·요청한 뒤 결과를 돌려준다
    let granted = true
    webView.evaluateJavaScript("window.perfittMotionPermission(\(granted))")
}

// 등록
configuration.userContentController.add(self, name: "perfittMotionPermission")
이 문서가 도움이 됐나요?