Izin
Mengontrol permintaan akses kamera, mikrofon, geolokasi, dan kapabilitas lain dari konten web
Konten web yang memanggil navigator.mediaDevices.getUserMedia(), API Geolocation, atau API Notifications memerlukan aplikasi host untuk mengizinkan atau menolak permintaan tersebut. Wails menyediakan peta Permissions lintas platform pada WebviewWindowOptions yang memungkinkan Anda mengaturnya secara deklaratif—tanpa memerlukan kode khusus platform.
Mulai Cepat
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "My App",
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionAllow,
application.PermissionCamera: application.PermissionAllow,
},
})Permintaan akses kamera dan mikrofon dari konten web jendela tersebut diizinkan tanpa menampilkan permintaan izin browser.
Jenis Izin
PermissionType (uint8) mengidentifikasi kapabilitas yang dapat diminta oleh konten web.
| Konstanta | Kapabilitas |
|---|---|
PermissionMicrophone |
getUserMedia({audio: true}) |
PermissionCamera |
getUserMedia({video: true}) |
PermissionGeolocation |
navigator.geolocation |
PermissionNotifications |
Notification.requestPermission() |
PermissionClipboardRead |
navigator.clipboard.readText() |
Nilai Izin
Permission (uint8) adalah kebijakan yang diterapkan pada jenis tertentu.
| Konstanta | Nilai | Arti |
|---|---|---|
PermissionDefault |
0 | Gunakan penanganan bawaan platform (lihat di bawah) |
PermissionAllow |
1 | Izinkan tanpa meminta konfirmasi |
PermissionDeny |
2 | Tolak tanpa meminta konfirmasi |
PermissionDefault adalah nilai nol, sehingga entri yang tidak ditetapkan dalam peta menggunakan perilaku bawaan.
Perilaku Platform
Setiap platform menangani PermissionDefault secara berbeda karena webview yang mendasarinya memiliki perilaku bawaan yang berbeda.
Linux (WebKitGTK)
WebKitGTK tidak memiliki permintaan izin bawaan. Tanpa handler yang terpasang, WebKitGTK secara diam-diam menolak setiap permintaan—karena itulah getUserMedia selalu mengembalikan NotAllowedError sebelum fitur ini ditambahkan.
Saat ini, Wails menangani permintaan akses kamera dan mikrofon di Linux. Geolokasi, notifikasi, dan pembacaan papan klip belum dihubungkan dan tetap ditolak, apa pun kebijakan yang Anda tetapkan.
| Kebijakan | Kamera/Mikrofon | Geolokasi, Notifikasi, Papan Klip |
|---|---|---|
PermissionDefault |
Diizinkan (memulihkan getUserMedia) | Selalu ditolak |
PermissionAllow |
Diizinkan | Selalu ditolak (belum diimplementasikan) |
PermissionDeny |
Ditolak | Selalu ditolak |
Windows (WebView2)
WebView2 memiliki permintaan izin bawaan dan API izin untuk setiap jenis. Kelima jenis kapabilitas didukung sepenuhnya.
| Kebijakan | Perilaku |
|---|---|
PermissionDefault |
WebView2 menampilkan permintaan izin bawaan OS/browser |
PermissionAllow |
Diizinkan tanpa pemberitahuan |
PermissionDeny |
Ditolak tanpa pemberitahuan |
Penting: Sebelum fitur ini tersedia, Wails memanggil SetGlobalPermission(Allow) tanpa syarat—sehingga secara diam-diam mengizinkan semua kapabilitas. Sekarang, jika ada entri apa pun dalam Permissions, izin menyeluruh tersebut tidak ditetapkan. Kapabilitas yang tidak ditetapkan akan ditangani oleh permintaan izin bawaan WebView2 dan tidak lagi diizinkan secara otomatis.
Artinya, jika Anda mengonfigurasi Permissions di Windows, kapabilitas apa pun yang tidak Anda cantumkan secara eksplisit akan menampilkan permintaan izin, bukan diizinkan tanpa pemberitahuan. Tetapkan secara eksplisit kapabilitas yang Anda perlukan.
macOS (WKWebView + TCC)
Dua lapisan harus sepakat di macOS. WKWebView menanyakan aplikasi sebelum memulai sesi capture, dan permintaan itulah yang dijawab oleh map Permissions. Di bawahnya, framework privasi sistem (TCC) menjaga perangkatnya sendiri: prompt OS muncul saat aplikasi benar-benar mengakses kamera atau mikrofon untuk pertama kali, dan pilihan pengguna diingat per-aplikasi di System Settings → Privacy & Security.
Wails menangani permintaan kamera dan mikrofon di macOS 12 dan yang lebih baru. Geolokasi, notifikasi, dan clipboard read tidak memiliki padanan WKUIDelegate, sehingga belum dihubungkan dan diserahkan sepenuhnya ke TCC — seperti di Linux, kebijakan yang Anda setel untuk ketiganya tidak berpengaruh.
| Kebijakan | Kamera / Mikrofon | Geolokasi, Notifikasi, Clipboard |
|---|---|---|
PermissionDefault |
WebKit menampilkan prompt permission-nya sendiri | TCC saja |
PermissionAllow |
Prompt WebKit dilewati — TCC tetap berlaku | TCC saja |
PermissionDeny |
Ditolak oleh WebKit; otorisasi sistem terpisah | TCC saja |
PermissionAllow mengizinkan permintaan webview, bukan akses perangkat. Otorisasi sistem tetap berlaku secara terpisah, dan aplikasi yang ditolak di System Settings tetap ditolak. Hanya prompt WebKit sendiri yang dilewati.
Di bawah macOS 12 metode delegate tersebut tidak ada, sehingga map diabaikan di sana dan setiap permintaan kembali ke prompt WebKit.
Pastikan Info.plist Anda menyertakan kunci deskripsi penggunaan yang sesuai:
<key>NSMicrophoneUsageDescription</key>
<string>Used for voice input</string>
<key>NSCameraUsageDescription</key>
<string>Used for video calls</string>Pola Umum
Aplikasi perekaman media
Izinkan akses kamera dan mikrofon di semua platform:
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionAllow,
application.PermissionCamera: application.PermissionAllow,
},Di Linux, pengaturan ini secara eksplisit mengizinkan kedua perangkat; kapabilitas lainnya tetap ditolak. Di Windows, pengaturan ini mengizinkan keduanya; kapabilitas lain yang tidak Anda cantumkan akan menampilkan dialog izin native. Di macOS ini mengizinkan keduanya di lapisan WebKit, sehingga tidak ada prompt browser yang muncul; TCC tetap menanyakan perangkatnya sendiri saat pertama kali digunakan, dan kedua kunci deskripsi penggunaan harus ada di Info.plist.
Menolak pengambilan media di Linux
Secara default, Linux mengizinkan kamera dan mikrofon. Untuk menonaktifkannya:
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionDeny,
application.PermissionCamera: application.PermissionDeny,
},Mengizinkan semua kapabilitas di Windows
Untuk memberikan semua kapabilitas tanpa menampilkan dialog izin:
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionAllow,
application.PermissionCamera: application.PermissionAllow,
application.PermissionGeolocation: application.PermissionAllow,
application.PermissionNotifications: application.PermissionAllow,
application.PermissionClipboardRead: application.PermissionAllow,
},Kebijakan per jendela
Setiap jendela dapat memiliki kebijakan yang berbeda:
// Main app window — full media access
mainWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "App",
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionAllow,
application.PermissionCamera: application.PermissionAllow,
},
})
// Settings window — no special capabilities
settingsWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "Settings",
// No Permissions entry — uses platform defaults
})
// Embedded content window — deny media capture
embeddedWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "Embedded",
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionDeny,
application.PermissionCamera: application.PermissionDeny,
},
})Penimpaan Khusus Windows
Kolom Windows.Permissions per jendela (map[CoreWebView2PermissionKind]CoreWebView2PermissionState) tetap berfungsi dan dapat menimpa masing-masing kapabilitas setelah peta lintas platform diterapkan. Gunakan kolom ini jika Anda memerlukan akses ke jenis izin WebView2 yang tidak memiliki padanan lintas platform (misalnya, CoreWebView2PermissionKindOtherSensors).
Windows: application.WindowsWindow{
Permissions: map[application.CoreWebView2PermissionKind]application.CoreWebView2PermissionState{
application.CoreWebView2PermissionKindOtherSensors: application.CoreWebView2PermissionStateAllow,
},
},Urutan evaluasi di Windows adalah:
- Peta
Permissionslintas platform (menetapkan status per jenis melaluiSetPermission) - Peta
Windows.Permissions(menimpa masing-masing jenis) - Untuk jenis apa pun yang tidak tercakup oleh kedua peta: dialog izin native WebView2 (jika kebijakan dikonfigurasi) atau izin otomatis (jika tidak ada kebijakan yang dikonfigurasi—perilaku lama)
Matriks Dukungan Platform
| Kapabilitas | Linux | Windows | macOS |
|---|---|---|---|
| Mikrofon | ✅ | ✅ | ✅ (macOS 12+) |
| Kamera | ✅ | ✅ | ✅ (macOS 12+) |
| Geolokasi | ❌ belum didukung | ✅ | ❌ belum didukung |
| Notifikasi | ❌ belum didukung | ✅ | ❌ belum didukung |
| Pembacaan Papan Klip | ❌ belum didukung | ✅ | ❌ belum didukung |
Di tempat macOS bertanda ✅, kebijakan menjawab permintaan WebKit; TCC tetap menjaga perangkat di atasnya. Di tempat bertanda ❌, kemampuan diserahkan sepenuhnya ke TCC.
Pemecahan Masalah
getUserMedia masih gagal di Linux setelah pemutakhiran
Pastikan Anda tidak menetapkan PermissionMicrophone: PermissionDeny atau PermissionCamera: PermissionDeny secara eksplisit. Pengaturan default (tidak ditetapkan) mengizinkan pengambilan media di Linux.
Windows menampilkan dialog untuk izin yang tidak saya konfigurasi
Setelah ada entri apa pun di Permissions, Wails tidak lagi menetapkan pemberian izin menyeluruh Allow. Kapabilitas yang tidak Anda cantumkan akan menampilkan dialog izin native WebView2. Tambahkan entri PermissionAllow secara eksplisit untuk setiap kapabilitas yang digunakan aplikasi Anda.
Izin macOS tidak berfungsi
Permissions mencakup kamera dan mikrofon di macOS 12 dan yang lebih baru; geolokasi, notifikasi, dan clipboard read belum dihubungkan dan mengabaikan kebijakan. Di tempat kebijakan dihormati, TCC tetap menjaga perangkat di atasnya: PermissionAllow menghilangkan prompt WebKit, bukan prompt sistem. Pastikan Info.plist Anda menyertakan kunci deskripsi penggunaan yang benar (NSMicrophoneUsageDescription, NSCameraUsageDescription) dan pengguna telah memberikan akses di System Settings → Privacy & Security.
Aplikasi macOS saya keluar saat konten web meminta kamera atau mikrofon
Periksa bahwa Info.plist menyertakan NSCameraUsageDescription atau NSMicrophoneUsageDescription untuk setiap perangkat yang diminta aplikasi. Deskripsi yang tidak ada dapat menyebabkan penolakan permintaan; akses AVFoundation tanpa deskripsi yang diwajibkan dapat menghentikan aplikasi. PermissionDeny mengontrol keputusan WebKit dan tidak menggantikan kunci-kunci tersebut.
Geolokasi/notifikasi/papan klip tidak berpengaruh di Linux
Saat ini, hanya kamera dan mikrofon yang ditangani di Linux. Dukungan untuk jenis kapabilitas lainnya belum diimplementasikan—kapabilitas tersebut tetap ditolak, apa pun kebijakan yang Anda tetapkan.