휴대폰에 있는 연락처, 파일을 사용해서 기능개발하고 싶으면
유저의 허락을 받아야합니다. 안그러면 못씀
그래서 예시로 유저 연락처를 가져와서 변수에 저장해서 쓰고 싶으면 어떻게 할지 알아봅시다.
(참고) 테스트 개발시엔 이런거 설치 안하고도 가상기기에서 앱권한을 전부 줄 수 있습니다.
가상 안드로이드 기기에서 설정 - Apps - 님앱누르고 - Permissions - 허용을 켜주면 됩니다.
패키지설치 필요
남들이 만들어놓은 "유저에게 앱권한 쉽게 요청할 수 있는 외부 패키지"를 설치해야합니다.
이름은 permission_handler입니다.
플러터에서의 패키지 설치법은 쉬운데 1. pubspec.yaml 파일에 버전 기록하고 2. pub get 실행하면 끝임
dependencies:
flutter:
sdk: flutter
permission_handler: ^8.3.0
설치는 일단 pubspec.yaml의 dependencies 부분 하단에
저걸 기록해주시고 (왼쪽 spacebar 2개 주의)
기록하고 거기 커서찍어놓으면 왼쪽에 전구가 뜹니다.
pub get 어쩌구 하라는 권장사항이 뜨는데 그거 누르시면 알아서 패키지가 설치됩니다.
import 'package:permission_handler/permission_handler.dart';
그리고 main.dart 맨 위에 아무데나 이거 추가해주면 패키지 설치 끝입니다.
permission_handler.dart 파일에 있는 함수와 변수들을 가져다쓸 수 있게 해주는 문법입니다.
안드로이드 폰 셋팅은
android.useAndroidX=true
android.enableJetifier=true
1. android폴더/gradle.properties 파일에 이런게 기록되어있는지 확인하시고
android {
compileSdkVersion 31
2. android/app/build.gradle 파일 중간에 compileSdkVersion을 31로 맞추면 됩니다.
숫자가 아니라 이상한 문자가 채워져있으면 수정하지말고 냅둬도 잘될 수 있습니다.
(참고) build.gradle 파일 등에 이상한 에러가 떠도 여러분이 만진게 아니니 냅두면 됩니다.
<manifest 어쩌구>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<application 어쩌구>
3. android/app/src/main/AndroidManifest.xml 파일에
저거 <uses-permission 어쩌구> 2개 넣으면 끝입니다.
그리고 미리보기 껐다가 다시 켜면 끝
다른 권한도 요청하고 싶으면 이런 예시를 참고합시다.
카메라, 외부저장소, 문자, 전화, 위치, 녹음 등을 허락받을 수 있습니다.
아이폰용 셋팅은
일단 뭐든 아이폰을 위한 것들은 맥북이 있어야합니다. 맥북 없으면 셋팅 스킵하면 됩니다.
1. 프로젝트 켜놓은 상태에서 터미널을 오픈합니다. (Android Studio는 상단 View - Tool Windows - Terminal)
옛날 맥북의 경우
cd ios
sudo gem install cocoapods
입력해주면 됩니다.
m1 맥북의 경우
cd ios
sudo arch -x86_64 gem install ffi
sudo arch -x86_64 gem install cocoapods
이거 입력하면 됩니다.
2. 그럼 ios 폴더에 Podfile이 있는데
(없으면 터미널에 pod init 입력해야함)
거기 최하단에
post_install do |installer| 어쩌구부터 시작하는 부분이 있습니다.
그 코드 블록은 자신있게 다 지워버리고
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)',
'PERMISSION_CONTACTS=1',
#추가할거 더 있으면 이 자리에
]
end
end
end
이걸로 교체하면 됩니다.
https://pub.dev/packages/permission_handler
다른 권한들 주고싶으면 예시는 이 페이지에 있습니다.
'PERMISSION_CAMERA=1',
이렇게 쓰면 카메라 권한이겠군요
3. Info.plist 파일을 오픈해서
<key>NSContactsUsageDescription</key>
<string>님 폰의 연락처 권한이 필요합니다 제발 주셈</string>
이런 코드를 적절해보이는 곳에 자신감있게 추가하면 됩니다.
권한달라고 팝업띄울 때 안내문 넣는 부분입니다.
그럼 이제 이런 식으로 뜹니다 성공
다른 권한도 요청하고 있으면 Info.plist 파일에 다른 권한도 추가해야합니다.
유저에게 사용권한 달라고 요청하는 법은
Permission.contacts.status 라고 사용하면 연락처권한 상태를 출력할 수 있고
유저에게 연락처 사용권한을 달라고 요청을 하려면
Permission.contacts.request() 이 코드 한 줄만 실행해주면 됩니다.
그래서 보통 Permission.contacts.status 이걸 변수에 저장해놓고
이게 isGranted면 (허락되면) 이런 코드 실행해주세요~
이게 isDenied면 (거절되거나 미허락상태면) 이런 코드 실행해주세요~
라고 코드짜면 됩니다.
getPermission() async {
var status = await Permission.contacts.status;
if (status.isGranted) {
print('허락됨');
} else if (status.isDenied) {
print('거절됨');
Permission.contacts.request();
}
}
우리 메인 위젯 안에 함수를 하나 만들었습니다.
contacts 대신 camera 쓰면 카메라 권한, location 쓰면 위치 권한을 허락받을 수 있겠군요.
테스트해보려면 버튼같은거 누르면 저 함수를 실행해보시면 됩니다.
(주의) Android 11버전 이상과 iOS에서는 유저가 한 두번 이상 거절하면 다시는 팝업 띄울 수 없습니다.
그 경우 앱설정 오픈해서 유저가 직접 설정을 바꿔야하기 때문에
그래서 앱 처음 로드할 때 말고 진짜 연락처 기능이 필요해질 때 띄우는게 요즘 유행입니다. 그러도록 합시다.
윗글 한번 읽어 보시길 진짜 정리 잘하심
Dart 언어는 자바스크립트처럼 처리가 오래걸리는 코드들은 옆으로 제껴두고
바로 다음줄을 실행하려고 합니다.
모든 코드를 그렇게 하는건 아니고 Futures라는 특징을 가진 코드들을 옆으로 제껴두고 실행합니다.
근데 await 키워드는
"바로 다음 줄 실행하지 말고 오래걸리는 작업이나 요청을 여기서 천천히 기다려주세요~"
라는 뜻의 키워드입니다.
Q. 그럼 기다리길 원할 때 아무곳에서나 await 써도 되나요?
A. 여러분들이 자의적으로 await 쓰는 경우는 없습니다.
Futures 기능이 포함된 곳에만 붙일 수 있기 때문에
그냥 패키지 사용법이나 Flutter 문법에서 await을 쓰라고 하면 쓰면 됩니다.
Permission.contacts.status 이것도 만든 사람이 await 붙일 수 있대서 await을 붙일 뿐임
final status = await Permission.contacts.status;
그리고 오래걸리는 작업이 다 끝나면 결과를 변수에 저장하거나 그럴 수도 있습니다.
그리고 함수 안에서 await 키워드를 사용하고 싶을 때
함수 중괄호 왼쪽에 async를 꼭 붙여야 사용가능합니다.
(참고) 자바스크립트의 Promise, async, await과 똑같습니다. 여기선 Promise 대신 Futures라고 부릅니다.
그래서 AppBar 우측에 버튼만들고 그거 누르면 권한 요청하라고 코드를 짰습니다.
AppBar(
title : Text('앱제목'),
actions : [
IconButton(onPressed: (){ getPermission(); }, icon : Icon(Icons.contacts))
]
)
▲ 버튼 누르면 위에서 만든 getPermission() 함수 실행해달라고 짰더니
진짜 권한요청해줌
안뜨면 미리보기 중지하고 폰에 설치된 앱 길게 눌러서 삭제하고 다시 미리보기 띄워보십시오.
하지만 아이폰의 경우 OS가 금지하는 경우도 있고 (status.isRestricted)
안드로이드의 경우 아예 앱 설정에서 꺼놓은 경우 (status.isPermanentlyDenied)
그것도 체크하고 싶으면
if (status.isPermanentlyDenied) {
openAppSettings();
}
if문 추가하면 되죠뭐
아예 앱 설정에서 꺼놓은 경우라서 직접 유저가 설정을 바꾸든 해야합니다.
openAppSettings()는 앱 설정기능 열어주는 코드입니다.
플러터 권한 참고 글 (정리 너무 잘하심)
https://dalgonakit.tistory.com/110
윗글은 안드로이드 권한 모음 인데 그냥 참고 해봄
사실상 구글링이 짱임
'APP > Flutter' 카테고리의 다른 글
플러터 사용자입력 글자입력란 TextField에 스타일주는 법 (0) | 2022.08.08 |
---|---|
플러터 null check 하는 법 & Android 앱으로 발행하기 (0) | 2022.08.08 |
플러터 사용자의 input을 받는 법 (0) | 2022.08.07 |
플러터 자식 위젯이 부모 위젯의 state를 변경하고 싶으면 4-step (0) | 2022.08.07 |
플러터 state를 자식 위젯에서 쓰고 싶다면 3 step 이용 (0) | 2022.08.07 |