在Apps上取用user的資料或硬件前,都必先得到user的同意(Permission)。但iOS和Android的取得都不同,所以在React Native上要小心處理。
I. React Native
iOS
在初次取用某些需要permission的module時,會彈出dialog問user是否批准。
例如想獲取user的location:navigator.geolocation.getCurrentPosition()
時,會在第一次的時候先問user,再視情況返回success callback或error callback。
同時需要在info.plist
裡加入相關的dialog message,例如有關location的NSLocationWhenInUseUsageDescription
,裡面要清楚解釋為甚麼要用user的位置,否則有機會因此被Apple reject你的app。
Android
Android的情況比較複雜。
以前的Android一向是在安裝時列明所需權限,不用之後逐一問的。但自API >= 23開始,Android也改為runtime問user了。
API < 23
在AndroidManifest.xml
裡加入所需permissions。
API >= 23
使用PermissionsAndroid module。
相關工具
II. Expo
Expo是一個讓你可以用 pure javascript 寫 cross-platform apps 的工具,它會幫你處理好native相關的東西,例如compile成.apk和.ipa、code push等等。
取用permissions
Expo提供Permission
module,可以查看permission狀態,也可以問user獲取permissions,非常方便。
Configuration
簡單來說:
- 在app.json加入permission dialog message (for iOS)
- 在app.json加入所需permissions (for 舊Android)
- 使用Permission API取得使用權
Notes: Push notification
Push notification permission is a special case, unlike others like camera, location, etc.
iOS
- Ask permission in runtime
- Cannot customize permission dialog message
Android
- Permission is granted along with installation (stackoverflow)
- No dialog will be shown
- Notification format can be customized
- Expo: 可以在
app.json
customize notification的樣式
- Expo: 可以在