Lewati ke konten

Permissions

Konten web yang memanggil navigator.mediaDevices.getUserMedia(), Geolocation API, atau Notifications API membutuhkan aplikasi host untuk mengizinkan atau menolak permintaan tersebut. Wails mengekspos map Permissions lintas platform di WebviewWindowOptions sehingga Anda dapat mengontrolnya secara deklaratif — tanpa kode spesifik platform.

window := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "My App",
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionAllow,
application.PermissionCamera: application.PermissionAllow,
},
})

Permintaan kamera dan mikrofon dari konten web jendela tersebut diberikan tanpa prompt browser.

PermissionType (uint8) mengidentifikasi kemampuan yang dapat diminta konten web.

KonstantaKemampuan
PermissionMicrophonegetUserMedia({audio: true})
PermissionCameragetUserMedia({video: true})
PermissionGeolocationnavigator.geolocation
PermissionNotificationsNotification.requestPermission()
PermissionClipboardReadnavigator.clipboard.readText()

Permission (uint8) adalah kebijakan yang diterapkan pada tipe tertentu.

KonstantaNilaiArti
PermissionDefault0Gunakan penanganan native platform (lihat di bawah)
PermissionAllow1Izinkan tanpa prompt
PermissionDeny2Tolak tanpa prompt

PermissionDefault adalah nilai nol, sehingga entri yang tidak disetel di map berperilaku sebagai default.

Setiap platform menangani PermissionDefault secara berbeda karena webview dasarnya memiliki perilaku native yang berbeda.

WebKitGTK tidak memiliki prompt permission native. Tanpa handler yang terpasang, semua permintaan ditolak diam-diam — inilah mengapa getUserMedia selalu mengembalikan NotAllowedError sebelum fitur ini ditambahkan.

Saat ini Wails menangani permintaan kamera dan mikrofon di Linux. Geolokasi, notifikasi, dan clipboard read belum dihubungkan dan tetap ditolak terlepas dari kebijakan yang Anda setel.

KebijakanKamera / MikrofonGeolokasi, Notifikasi, Clipboard
PermissionDefaultDiizinkan (memulihkan getUserMedia)Selalu ditolak
PermissionAllowDiizinkanSelalu ditolak (belum diimplementasikan)
PermissionDenyDitolakSelalu ditolak

WebView2 memiliki prompt permission native dan API permission per-jenis. Kelima tipe kemampuan didukung penuh.

KebijakanPerilaku
PermissionDefaultWebView2 menampilkan prompt permission native OS/browser
PermissionAllowDiberikan secara diam-diam
PermissionDenyDitolak secara diam-diam

Penting: Sebelum fitur ini ada, Wails memanggil SetGlobalPermission(Allow) tanpa syarat — memberikan semua kemampuan secara diam-diam. Sekarang, ketika ada entri di Permissions, grant blanket tersebut tidak disetel. Kemampuan yang tidak disetel mengikuti prompt native WebView2 alih-alih diizinkan otomatis.

Artinya jika Anda mengonfigurasi Permissions di Windows, kemampuan yang tidak Anda cantumkan secara eksplisit akan menampilkan prompt alih-alih diizinkan diam-diam. Setel kemampuan yang Anda butuhkan secara eksplisit.

macOS mengelola akses kamera, mikrofon, geolokasi, dan notifikasi melalui framework privasi sistem. Prompt OS muncul otomatis saat konten web pertama kali meminta kemampuan, dan pilihan pengguna diingat per-aplikasi di System Settings → Privacy & Security.

Ini berfungsi dengan benar tanpa konfigurasi Permissions. Map saat ini diabaikan di macOS — semua permintaan melalui TCC terlepas dari yang Anda setel. Celah praktisnya: PermissionDeny tidak berpengaruh di macOS — Anda tidak dapat memblokir webview menggunakan kemampuan yang TCC sudah berikan di level sistem.

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>

Izinkan kamera dan mikrofon di semua platform:

Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionAllow,
application.PermissionCamera: application.PermissionAllow,
},

Di Linux ini secara eksplisit mengizinkan kedua perangkat; kemampuan lain tetap ditolak.
Di Windows ini mengizinkan keduanya; kemampuan lain yang tidak Anda cantumkan akan menampilkan prompt native.
Di macOS ini tidak berpengaruh; TCC menangani semuanya.

Linux mengizinkan kamera dan mikrofon secara default. Untuk opt-out:

Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionDeny,
application.PermissionCamera: application.PermissionDeny,
},

Untuk memberikan setiap kemampuan tanpa prompt:

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,
},

Jendela berbeda dapat memiliki kebijakan berbeda:

// Jendela aplikasi utama — akses media penuh
mainWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "App",
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionAllow,
application.PermissionCamera: application.PermissionAllow,
},
})
// Jendela pengaturan — tanpa kemampuan khusus
settingsWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "Settings",
// Tanpa entri Permissions — menggunakan default platform
})
// Jendela konten embedded — tolak capture media
embeddedWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "Embedded",
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionDeny,
application.PermissionCamera: application.PermissionDeny,
},
})

Field per-jendela Windows.Permissions (map[CoreWebView2PermissionKind]CoreWebView2PermissionState) masih berfungsi dan dapat menimpa kemampuan individual setelah map lintas platform diterapkan. Gunakan saat Anda perlu akses ke jenis permission WebView2 yang tidak memiliki padanan lintas platform (mis. CoreWebView2PermissionKindOtherSensors).

Windows: application.WindowsWindow{
Permissions: map[application.CoreWebView2PermissionKind]application.CoreWebView2PermissionState{
application.CoreWebView2PermissionKindOtherSensors: application.CoreWebView2PermissionStateAllow,
},
},

Urutan evaluasi di Windows:

  1. Map lintas platform Permissions (menyetel state per-jenis via SetPermission)
  2. Map Windows.Permissions (menimpa jenis individual)
  3. Untuk jenis yang tidak tercakup kedua map: prompt native WebView2 (saat kebijakan dikonfigurasi) atau auto-allow (saat tidak ada kebijakan — perilaku legacy)
KemampuanLinuxWindowsmacOS
MikrofonTCC saja
KameraTCC saja
Geolokasi❌ belumTCC saja
Notifikasi❌ belumTCC saja
Clipboard Read❌ belumTCC saja

getUserMedia masih gagal di Linux setelah upgrade

Periksa bahwa Anda tidak secara eksplisit menyetel PermissionMicrophone: PermissionDeny atau PermissionCamera: PermissionDeny. Default (tidak disetel) mengizinkan capture media di Linux.

Windows meminta permission yang tidak saya konfigurasi

Setelah ada entri di Permissions, Wails tidak lagi menyetel grant blanket Allow. Kemampuan yang tidak Anda cantumkan akan menampilkan prompt native WebView2. Tambahkan entri PermissionAllow eksplisit untuk setiap kemampuan yang digunakan aplikasi Anda.

Permission macOS tidak berfungsi

Map Permissions tidak berpengaruh di macOS. Pastikan Info.plist Anda menyertakan kunci deskripsi penggunaan yang benar (NSMicrophoneUsageDescription, NSCameraUsageDescription, dll.) dan pengguna telah memberikan akses di System Settings → Privacy & Security.

Geolokasi/notifikasi/clipboard tidak berpengaruh di Linux

Hanya kamera dan mikrofon yang saat ini ditangani di Linux. Dukungan untuk tipe kemampuan lain belum diimplementasikan — tetap ditolak terlepas dari kebijakan yang Anda setel.