Try   HackMD

Permission Handler - 請求權限

寫 app 總是逃不掉需要去面對客戶訪問權限的情境 ex: 麥克風、推播、定位等,使用優質的套件可以幫助我們無痛逃課。

踩坑

詳細的使用流程可以參考最下面的文檔不再贅述,這邊我只分享我遇到的坑。

  1. 如何在開發環境測試權限? 待補
  2. 請求使用 APP 期間開啟定位的權限時遇到閃退 - 第一次遇到我直接黑人問號???,納悶哪個步驟漏掉了?結果後來查了一下 issue 才發現我漏掉要在 Info.plist 加上 description 的步驟。用 XCode 開啟 Info.plist 直接選 addRow,查一下 IOS APP Permission 問題也迎刃而解。

範例

以下是開啟推播跟在使用 APP 期間開啟定位的請求權限的簡易範例。

ios/Podfile

# ...
post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',

         # dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
         'PERMISSION_LOCATION=1',

        # dart: PermissionGroup.notification
        'PERMISSION_NOTIFICATIONS=1',
      ]
    end
  end
end

ios/Runner/Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  ...
  <key>NSLocationWhenInUseUsageDescription</key>
  <string>若您關閉「定位服務」,APP的部分功能將會功能會停止運作。</string>
</dict>
</plist>

lib/example.dart

import 'package:my_app/services/network.dart';
import 'package:permission_handler/permission_handler.dart';

void register(payload) async {
  final user = await NetworkService.register(payload);
  await Permission.notification.request();
  await Permission.locationWhenInUse.request();
  // ...
}

參考

tags: Flutter