build.gradle.kts 에 정의한 manifestPlaceholders을 코틀린 파일에서도 사용할수 있도록 리팩토링 하기
manifest에서도 사용하고 코틀린 파일에서도 사용하는 빌드 변수가 있다.
카카오 로그인시 (KAKAO_APP_KEY)
1. 메니페스트에 명시
<data
android:host="oauth"
android:scheme="kakao${KAKAO_APP_KEY}" />
2. SDK 초기화
KakaoSdk.init(this, "${KAKAO_APP_KEY}")
문제점
buildConfigField로 정의하면 코틀린에서만 사용가능하고
manifestPlaceholders로 정의하면 manifest에서만 사용가능하다.
기존 방법
manifestPlaceholders["KAKAO_APP_KEY"] = "aaaaaaaaaaaaa"
<string name="kakao_app_key">aaaaaaaaaaaaa</string>
똑같은걸 2번 정의하여 사용하였다. ( string.xml, build.gradle )
리팩토링
manifestPlaceholders만 남기고 string.xml 에서는 제거
manifestPlaceholders["KAKAO_APP_KEY"] = "aaaaaaaaaaaaa" <string name="kakao_app_key">aaaaaaaaaaaaa</string>
모델 생성
data class AppMetadata(
val kakaoNativeAppKey: String,
) {
companion object {
const val KAKAO_NATIVE_APP_KEY = ".MyApplication.KakaoNativeAppKey"
}
}
interface PackageProvider {
fun getPackageMetadata(): AppMetadata
}
@Singleton
internal class PackageProviderImpl @Inject constructor(
@ApplicationContext
private val applicationContext: Context,
private val packageManager: PackageManager
) : PackageProvider {
private val packageName = applicationContext.packageName
private lateinit var appMetaData: AppMetadata
@BuildCompat.PrereleaseSdkCheck
override fun getPackageMetadata(): AppMetadata {
if (::appMetaData.isInitialized) {
return appMetaData
}
val metadata = kotlin.run {
if (BuildCompat.isAtLeastT())
packageManager.getApplicationInfo(
packageName,
PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong())
)
else
packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
}.metaData
appMetaData = AppMetadata(
kakaoNativeAppKey = metadata.getString(
AppMetadata.KAKAO_NATIVE_APP_KEY,
""
)
)
return appMetaData
}
}
( 패키지매니저로부터 메타데이터를 갖고오는 내용이다. 티라미수(33)부터 변경점이 있어 분기 처리 )
이렇게 하면 이후에 필요한 곳에서 인터페이스를 주입하여 사용하면 된다. (당연히 manifest 에는 변수로써 사용하면 되고)
internal class KakaoLoginProviderImpl @Inject constructor(
@ApplicationContext
private val applicationContext: Context,
packageProvider: PackageProvider
){
init{
KakaoSdk.init(
applicationContext,
packageProvider.getPackageMetadata().kakaoNativeAppKey
)
}
}
'Android' 카테고리의 다른 글
[CI/CD] fastlane : App Distribution + Slack Message (0) | 2022.11.24 |
---|---|
코루틴 좋아요 동기화 처리 (0) | 2022.11.07 |
카카오톡 채팅화면 키보드 옵션창 구현 (0) | 2022.10.09 |
Gson으로 sealed class 로 맵핑하기 (0) | 2022.10.04 |
특정 뷰위에 BottomSheet 올리기 (0) | 2022.09.29 |