본문 바로가기

카테고리 없음

[Flutter.241217] 사진첩에 접근하기 위해서는 사전 허가를 얻어야 했다.

고작 ios 시뮬레이터면서! 이렇게 깐깐하게 굴다니! 

라고 처음에 생각했다.

하지만 3초 뒤에, 이렇게 사생활 보호를 중요시 여기는 애플 생태계에 속한 한마리의 앱등이인 내가

보호 받는 느낌이 들었다. 애플의 도톰한 보호 아래에 시즌마다 지갑을 여는.. 그런 한 사람.. (근데 지갑 열었는데 돈 없음,.)

 

앱에서 사진첩 접근하려고 하면, 매번 앱이 꺼지는 것이다.

 

에러 메세지를 살펴보니 이런 말이 있었다. 영어였다. 

 

더보기

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

 

대충 보니, 사진첩 접근하려면, info.plist에 NSPHotoLibrayUsageDescription 키가 있어야 한다는 것 같다. 

그 배##의 민@, 음식 주문해 먹는 앱에서도, 리뷰 올리려고 사진 첨부하고자 할 때, 사용자에게 사진첩 권한 물어보듯,

그런걸 만들어주라고 하는 것 같았다. 

 

ios/Runner아래의 info.plist 파일에 들어가 봤다.

 

뭐가 엄청 많다. key랑 Stirng 조합인듯 하다. 

여기에 다음의 내용을 추가했다. 

 

	<key>NSPhotoLibraryUsageDescription</key>
	<string>앱에서 사진첩에 접근하여 반려견의 사진을 업로드하고자 합니다.</string>

 

아마 사진첩에 접근하려고 하면, 사용자에게 <string> 태그 안에 들어가 있는 저 말을 넣어서 알람을 띄워주겠지.

 

이제 되려나.

 

아주 잘 된다. 기쁘군.

 

 

그런데 이 앱이 사실은 위치 정보도 써야한다. 

전에는 위치 정보 써도 됩니까? 하는 알람이 보여던 것 같은데 갑자기 또 안보인다.

아마 같은데에서 또 내용을 추가하면 되겠지.

 

왜냐면 디버그 콘솔에 또 이런 말이 있었기 때문이다. 

 

더보기

ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Permission definitions not found in the app's Info.plist. Please make sure to add either NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription to the app's Info.plist file on iOS. If running on macOS please add NSLocationUsageDescription to the app's Info.plist file.

 

같은 파일에 추가를 해 보겠다. 이번엔 어떤 말로 사용자에게 위치 정보를 허가해 달라고 요청해볼까나.

 

<key>NSLocationWhenInUseUsageDescription</key>
<string>앱에서 주변 강아지 친구를 찾기 위해 사용자의 위치를 사용합니다.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>앱에서 지속적으로 위치를 확인하여 산책 중 주변 강아지 친구를 찾을 수 있습니다.</string>

 

또 두 개가 있다. 'WhenInUse' 사용할 때만,,인 것 같고. "Always" 항상!

 

자 그럼 다시 앱을 동작시켜 보겠다. 

 

좋네.. 원하는대로 보여주는군...

 

자 그럼 여기서 한 발 더 나아가서..

info.plist 깃헙에 public 공개를 해도 될까?

만약 api key 같이 민감한게 들어있으면 당근 하면 안된다. 얼마 전에 GoogleService-Info.plist를 아무 생각 없이 올렸다가,

그 안에 api key가 아주 맨 위에 올라간 채로 커밋 되어서 부랴부랴 해당 커밋을 지우고 되돌려 놓았었다.

이 기록은 아래에서 확인할 수 있다. 

https://kittypawdev.tistory.com/22

 

[Flutter.241212] 소중한 API key가 info plist 파일에 들어가 있는채로 커밋 되어서 만천하에 공개되었을

좌절하게 됩니다.요새 세상이 좋아져서, 제가 이런 무지몽매한 액션을 취하자 바로 메일이 날아왔습니다.  끄응. 로컬에 가서 이전 커밋으로 돌아가고, remote 또한 같은 상태로 바꿔줘야 합니

kittypawdev.tistory.com

 

근데 대충 보니 info.plist에는 api key도 없고, 별 거 없는 것 같다. 

그런데 조금 찾아보니 CFBundleIdentifier 앱 번들 ID 이런게 노출되면 다른 사람이 앱을 복제하려는 시도를 할 수도 있다고 한다.

오오....? 과연 누가,,,? 

 

여튼 항상 조심조심 해야한다, 돌다리도 두들겨보고 건너야하지 않는가?

 

앱을 구동할 때 plist 설정 정보 같은건 사실 필수적으로 필요하긴 하다. 그래서 env 파일 활용하듯이 템플릿 파일을 제공할 수 있겠다.

.env.template 이런 식으로 넣어서, 클론 받은 사람이 자기의 키 값 넣어 사용할 수 있게 하지 않는가?

그런 것이지.

 

Info.plist 대신 올라갈 Info.plist.template 같은 경우는 주요 정보 제하고 이런 식으로 작성해서 올릴 수 있을 것 같다. 

<?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>앱에서 주변 강아지 친구를 찾기 위해 사용자의 위치를 사용합니다.</string>
	<key>NSLocationAlwaysUsageDescription</key>
	<string>앱에서 지속적으로 위치를 확인하여 산책 중 주변 강아지 친구를 찾을 수 있습니다.</string>
	<key>NSPhotoLibraryUsageDescription</key>
	<string>앱에서 사진첩에 접근하여 반려견의 사진을 업로드하고자 합니다.</string>
</dict>
</plist>

 

다 끝났다고 생각하고 오늘 일찍 잘라고 했는데,

끝날 때 까지 끝난 것이 아니었다.

옛날에 미국 야구 선수 누가 그랬다던거 같은데

 

"잇 앵t 오버, 언틸 잇츠 오버.."