① 배운 것
안드로이드 앱을 개발하다 보면, 한 앱에서 만든 파일을 다른 앱에서 사용해야 하는 경우가 종종 있어요. 예를 들어, 카메라 앱에서 사진을 찍고, 다른 앱에서 그 사진을 불러와야 할 때처럼요. 그런데 안드로이드는 보안 때문에 앱끼리 파일을 그냥 주고받는 걸 허용하지 않아요. 그래서 등장하는 기능이 바로 File Provider입니다.
이번 글에서는 File Provider가 무엇인지, 그리고 그 과정에서 중요한 역할을 하는 authority에 대해 쉽게 설명해볼게요.
간단하게 말하자면, File Provider는 앱들이 서로 파일을 안전하게 공유할 수 있게 도와주는 중간 다리 역할을 해요. 안드로이드의 보안 정책 때문에 앱 간에 파일을 직접 주고받는 게 불가능하지만, File Provider를 이용하면 특정 파일에 안전하게 접근할 수 있게 되는 거죠.
예를 들어:
자, 이제 중요한 부분! File Provider가 중간에서 파일을 안전하게 공유해주긴 하지만, 무조건 아무 앱에나 파일을 공유하는 건 아니에요. 각 앱을 구분할 수 있는 고유한 이름, 즉 authority가 필요해요.
쉽게 말하자면, authority는 그 앱이 인증된 앱이라는 걸 확인하는 신분증 같은 역할을 해요. 그래서 File Provider는 "이 앱은 신뢰할 수 있으니 파일을 주자!"라고 판단할 수 있게 되는 거죠.
authority는 각 앱마다 고유해야 해요. 만약 두 개의 앱이 같은 authority를 가지고 있다면, 안드로이드는 두 앱을 구분할 수 없어요. 마치 두 사람이 똑같은 신분증을 가지고 있는 상황이 되는 거죠.
특히, 개발 단계(예: dev 환경)와 실제 배포 단계(예: prod 환경)에서 같은 authority를 사용하면 문제가 생길 수 있어요. 두 환경에서 빌드한 앱을 동시에 설치하려고 하면 안드로이드는 "이미 이 authority를 가진 앱이 설치되어 있습니다"라는 에러 메시지를 띄우고, 앱 설치가 안 될 거예요.
File Provider는 authority를 통해 인증된 앱만 파일에 접근할 수 있도록 해요. 예를 들어, 앱 A가 찍은 사진을 다른 앱에서 사용하려면 그 앱이 File Provider로부터 인증된 앱이어야 해요. 올바른 authority를 가진 앱만이 파일을 받을 수 있는 거죠.
그러니까 File Provider는 "이 앱이 내가 신뢰하는 앱인가?"를 authority로 확인한 다음, 맞으면 파일을 안전하게 전달해주는 역할을 해요. 그렇지 않으면 파일에 접근할 수 없어요.
authority는 보통 AndroidManifest.xml 파일에서 설정하게 돼요. 여기에서 앱의 고유한 이름을 설정해주면 되는데, 이를 applicationId와 함께 사용해요. 아래는 그 예시예요:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
여기서 android:authorities="${applicationId}.fileprovider" 부분이 바로 authority를 설정하는 부분이에요. applicationId는 앱의 고유한 패키지 이름을 나타내고, 이걸 기반으로 authority가 설정돼요.
앱을 개발할 때, dev와 prod 환경에서 각각 다른 authority를 설정해줘야 해요. 그렇지 않으면 앱을 동시에 설치할 때 충돌이 발생할 수 있어요.
이 문제를 해결하려면, applicationIdSuffix를 사용해 환경별로 authority를 다르게 설정할 수 있어요. 예를 들어:
android {
...
buildTypes {
debug {
applicationIdSuffix ".debug"
}
release {
// no suffix for release
}
}
}
이렇게 하면 개발용 앱은 com.example.myapp.debug.fileprovider로, 배포용 앱은 com.example.myapp.fileprovider로 서로 다른 authority를 가지게 돼서 충돌을 피할 수 있어요.
핵심 정리:
이제 안드로이드에서 File Provider와 authority가 어떻게 작동하는지 좀 더 쉽게 이해할 수 있겠죠? 😊
iOS 앱 개발 시 푸시 알림을 다룰 때 UNNotificationServiceExtension을 사용하는 경우가 많습니다. 개발 환경과 프로덕션 환경에서 서로 다른 설정을 사용해야 할 때, 빌드 설정을 활용하면 효과적으로 환경을 구분할 수 있습니다. 이 글에서는 UNNotificationServiceExtension에서 환경별로 다른 App Group 이름을 사용하는 방법에 대해 설명하겠습니다.
먼저 Xcode에서 프로젝트의 빌드 설정을 구성해야 합니다.
-DDEV를, Release 구성에 -DPROD를 추가합니다.이렇게 설정하면 Debug 빌드에서는 DEV 플래그가, Release 빌드에서는 PROD 플래그가 정의됩니다.
이제 UNNotificationServiceExtension의 코드에서 다음과 같이 조건부 컴파일을 사용할 수 있습니다:
#if DEV
let appGroupName: String = "group.co.example.dev"
#else
let appGroupName: String = "group.co.example.prod"
#endif
이 코드는 컴파일 시간에 평가됩니다. Debug 빌드에서는 DEV 플래그가 정의되어 있으므로 "group.co.example.dev"가 사용되고, Release 빌드에서는 그 외의 경우이므로 "group.co.example.prod"가 사용됩니다.
다음은 UNNotificationServiceExtension 클래스에서 이 설정을 사용하는 예시입니다:
class NotificationService: UNNotificationServiceExtension {
//didRecieve안에서 하는것이 중요
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
#if DEV
let appGroupName: String = "group.co.hiing.hiing.dev"
#else
let appGroupName: String = "group.co.hiing.hiing.prod"
#endif
// appGroupName을 사용하여 공유 데이터에 접근
if let sharedDefaults = UserDefaults(suiteName: appGroupName) {
// 공유 데이터를 사용하여 작업 수행
}
// 나머지 알림 처리 로직...
}
}
#if DEV 등)이 빌드 설정과 항상 일치하는지 확인해야 합니다.이 방법을 사용하면 UNNotificationServiceExtension에서 개발 환경과 프로덕션 환경에 따라 다른 App Group 이름을 쉽고 안정적으로 사용할 수 있습니다. 빌드 설정을 활용함으로써 코드의 가독성을 높이고 환경별 설정 관리를 효율적으로 할 수 있습니다.
② 회고 (restropective)
③ 개선을 위한 방법