一、背景
某個需求释漆,用WKWebView打開某個H5頁面悲没,其中H5使用WebRTC技術战秋,自行通過調(diào)用navigator.mediaDevices.getUserMedia方法來調(diào)起系統(tǒng)相機谆构,詢問權限们衙。
二憔维、問題現(xiàn)象
打開H5幔欧,獲取系統(tǒng)相機時頁面黑屏谋减,H5報錯文案提示設備/系統(tǒng)不支持安聘。
三哄酝、問題出現(xiàn)時機
- 提測時測試正常通過难裆,UAT時一直失敗
- 有一部手機子檀,安裝提測包,獲取相機失敗乃戈,下午重啟后又正常
- 有一部手機褂痰,本地跑工程,安裝后獲取相機失敗症虑。另外單獨重新寫一個webview打開H5缩歪,還是獲取相機失敗。最后新建一個app工程(在info.plist中寫了NSCameraUsageDescription)侦讨,webview打開H5頁面驶冒,獲取相機成功≡下保回頭進行對比排查問題骗污。
四、結(jié)論
-
因為info.plist文件中沒有寫相機權限(NSCameraUsageDescription)I蛱酢P璺蕖!
工程中的權限聲明是寫在InfoPlist.strings中蜡歹,用了Localization進行提示語國際化屋厘。
心路歷程:
一開始,認為在InfoPlist.strings中寫月而,和info.plist中效果一樣汗洒,對比排查下來,發(fā)現(xiàn)是不一樣的父款。
- 對于native來說溢谤,在詢問權限時會優(yōu)先取infoPlist.string的國際化文案瞻凤,沒有時,會取info.plist中默認文案世杀。如果都沒寫阀参,在申請權限時會crash。
對于H5來說瞻坝,相機權限需要兩層申請:
(1) 彈窗申請app訪問系統(tǒng)相機的權限(和普通native申請的彈窗一樣)蛛壳,猜測H5這一步只從info.plist中拿取K丁衙荐!不會管InfoPlist.strings。如果info.plist中沒有浮创,就會報錯提示設備/系統(tǒng)不支持赫模。
(2) 申請當前web頁面訪問相機的權限,用戶同意后可正常使用相機蒸矛。
整個app申請相機權限
web頁面申請相機權限
如果在native中,之前已經(jīng)申請通過了相機權限胸嘴,H5只會進行上述第2步雏掠,且每次進入H5都會進行第2步申請權限。
- webRTC僅支持的iOS系統(tǒng)版本>=14.3劣像,所以兼容方案:
(1) >=14.3的版本乡话,在app中打開H5頁面
(2) else,跳轉(zhuǎn)到Safari中打開H5 - 在后續(xù)測試中還發(fā)現(xiàn)耳奕,同樣的系統(tǒng)版本(>=14.3)绑青,在不同設備上,還存在無法調(diào)起相機的情況屋群,最后發(fā)現(xiàn)在進H5入口之前native先申請好camera權限可以解決這個問題闸婴。所以最后 >=14.3的系統(tǒng)版本,在app中進入H5頁面之前芍躏,先由native申請系統(tǒng)相機權限 = =
五邪乍、引用:
- WebKit getUserMedia bug 追蹤:https://bugs.webkit.org/show_bug.cgi?id=208667
- WebKit getUserMedia bug 追蹤2: https://bugs.webkit.org/show_bug.cgi?id=220184
- 其中提到一個solution for 《Camera for iOS is not working in inside webview》: https://github.com/react-native-webview/react-native-webview/issues/1672
- WebKit - MediaRecorder API
getUserMedia in WKWebView -
Requesting Authorization for Media Capture on iOS
Configure Your Info.plist
心累对竣。??