Android 이슈 - SMS 및 CALL_LOG 권한 사용에 적용되는 Google Play 정책 변경사항





알림 - 이 앱은 정책 변경의 영향을 받습니다.

이 앱은 SMS 및 CALL_LOG 권한 사용에 적용되는 Google Play 정책 변경사항의 영향을 받습니다. 정책을 준수하지 않는 앱은 2019년 1월 9일에 Google Play에서 삭제될 수 있습니다.



1. 원인

- 정책 변경으로 인해 permission의 사용이 제한됨. 


* 제한되는 permssion 




위의 Permission을 사용하는 앱을 경우 위와같은 에러 문구가 나타나게 됩니다.

추측컨대, 대다수의 분들이 CALL_PHONE, SEND_SMS Permission 으로 인해 

많이들 걸릴거라 생각이 됩니다 ㅎㅎ 


이번 패치의 핵심의 핵심을 정리하면, 

용도에 맞는 Permission 제한이 되겠네요. 


그래서 일반적인 앱의 경우 위의 퍼미션 사용을 할 수 가없고

앱기능 자체가 전화, 메시지 관련 앱인 경우에만 사용을 할 수있습니다. 


2. 해결방법

1) 구글에 문의하여 예외요청 

- 구글링해본결과 해외의 유명한 앱들도 거부당했다는 글들을 보아,

거의 불가능하다고 보여 집니다;;


2) 퍼미션 제거 및 대체  

- CALL_PHONE 대체 : 전화를 직접거는게 아닌 Dial 화면에 표시하도록 변경 , 이 경우 별도로 퍼미션이 필요하지 않음. 

Uri callUri = Uri.parse("tel:" + "전화번호(ex, 010-1111-1111)");
Intent intent = new Intent(Intent.ACTION_DIAL, callUri);
startActivity(intent);


- SEND_SMS 대체 : 위와 동일, 문자입력 화면에 Text만 전 후 발송은 사용자의 액션에 의해 발송되도록 변경

Uri smsUri = Uri.parse("smsto:" + "전화번호(ex, 010-1111-1111)");


Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(smsUri);

startActivity(intent);


상세내용은 : https://support.google.com/googleplay/android-developer/answer/9047303

> 일반용도의 대안 페이지 참조.


3. 요약

- 정책이 변경된 퍼미션 사용을 하고 있다면 전화, 메시지전용앱인 경우에만 사용이 가능하도록 바뀜

- 기존앱의 경우 해당 퍼미션 제거 후 재배포를 해야함 

https://support.google.com/googleplay/android-developer/answer/9047303  권한 요청 양식을 통해 

예외요청 및 기간 유예가 가능함(3월까지) 


해당 정책변경은 저도 처음 당해보는 일이라 일부 잘못된 정보가 있을 수 있습니다.

잘못된 부분이 있다면 댓글로 남겨주세요!


저처럼 헤매는 분들에게 도움이 되길바라요. (도움이 됐다면 아래 하트한번 눌러주세요 ㅎㅎ ) 

안드로이드 구글 앱서명 간략요약


참조 : https://developer.android.com/studio/publish/app-signing?hl=ko


설명이 길어서 복잡했는데, 

적용해보니 간단하네요.


1. 요약 

기존엔 인증서파일을 잃어버리게 되면 앱을 업데이트를 할 수 없는 크리티컬 이슈가 발생하여 

생긴 기능으로 보입니다. or 아이폰의 인증서 관리방법을 따라했거나 ㅎㅎ

핵심은 앱서명인증서와 업로드인증서의 분리가 되겠네요.


앱서명인증서 > 마켓에 실제로 등록할때 사용


업로드인증서 >  앱을 업로드할때 사용

*구글에 문의하여 재발급 가능 


앱서명인증서라는게 추가로 생겼고 

해당 인증서는 자동으로 생성되어, 

구글 클라우드에 저장되고 관리가 됩니다. ( 분실 및 관리의 부담이 줄어듬 )

이로인해, 서두에 설명한 인증서 분실로 인한 앱 업데이트 문제가 해결 됐습니다. 



2. 적용방법



실제로 적용할땐 기존방식과 달라지는 부분은 없습니다.

인증서 생성 > signing > 업로드


제가 헷갈렸던 부분이 업로드용 키를 어디서 만들어야 하나 싶었는데, 

그냥 기존 처럼 인증서를 만들어서 등록하면 해당 인증서가 업로드 키로 등록이 됩니다.

* 기존처럼 인증서는 계속 보관해서 써야하는건 같습니다.  (분실시에는 구글에 문의해서 재발급해야하니...)



3. 주의점

앱에서 인증서의 SHA1키값을 사용하는 경우 필히 배포용 인증서의 SHA1으로 바꿔주어야합니다. 

제가 사용 하는 프로젝트의 경우 구글맵 API의 사용이 제한됐네요. 


찾아보니 해당 각정 Open API 키 생성할때 SHA1값을 많이사용하여 해당 문제가 많이 발생하는것 같네요.

기존에 Open API 쓰시는 분이나 구글 API를 사용하시는 분들은 필히 확인하세요!


앱등록 페이지 좌측메뉴 > 앱서명 부분에 보면 서명인증서라는 항목 참조.



끝으로, 신규로 배포하는 앱이라면 무조건 구글앱 서명으로 앱을 올리세요.!!!

그럼 도움이 됐길 바라요.


안드로이드 스튜디오 3.2 업데이트 후 문제 발생(Duplicate key)



로그내용 : Duplicate key com.android.build.gradle.internal.api.artifact.BuildableArtifactImpl@7c139f68


원인 : productFlavors 이름이 Main 으로 설정 되어있어서 발생.(build.grale 파일)


해결 : Main으로 설정 된 이름 변경




해당 에러 내용.


  



main > orginal 로 변경 후 정상동작!! 


그럼 도움이 되길 바라요.

[Android] TARGET  API 26 변경 관련 작업 내역


안드로이드 타겟 API최소 레벨이 26으로 제한되면서 

구 프로젝트 업데이트 작업을 진행하면서 변경된 내용 정리 및 정보 공유해봅니다.

target 26 변경 이유.


1.  GCM > FCM 변경

: GCM에서 만들어진 regstrion Id 로 푸시를 보내도 정상동작!!

: Eclipse 에선 정식 지원이 아니라 AAR파일을 가지고 적용.  저는 Android Studio로 변경. 

이슈 사항  - 구글 플레이서비스도 업데이트 함에 따라 

 GoogleMap 등 구글 플레이서비스 관련 호환성 패치도 같이 진행하였음


2. 알림채널 지원(api 26 이상)

: 알림을 채널별로 구분하고, 시스템에서 알림제어를 할수 있도록 변경

: 26이상에서 무조건 한개이상의 알림채널이 있어야 함( 없으면 알림이 안뜸 )

: 최초 한번만 생성하면 됨


이슈사항 -  앱의 설정으로 알림사운드, 진동을 제어했는데 알림 채널적용 후 기존 알림설정이 동작안됨

> 사운드, 진동을 알림채널에서 적용하는 걸로 변경. 즉 푸시메시지 건별로 알림설정이 불가능해짐.

* 저의 경우 특정 그룹별로 알림 관리를 했는데, 이 경우 그룹의 수만큼 알림 채널을 추가해 주어야해서, 

알림관리를 게시글, 댓글, 자신에게쓴 글 3개의 채널로 통합관리함

* 알림을 껏다가 다시  켤 경우 초기에 설정한 IMPORTANCE가 Default값으로 변경됨.

오픈 이슈 :  https://issuetracker.google.com/issues/65108694

https://issuetracker.google.com/issues/73719217

* 기존에 서버에 알림 값을 가지고 재설정 했는데 알림채널이 생기면서

앱이 아닌 OS에서 알림을 관리를 하기 때문에 변경된 값에 대한 상세 정보를 가져올수 없음. 

즉, 로컬에서만 관리 하도록 변경.


* 알림채널 설정 호출 방법 (채널아이디를 빼면 알림채널 설정 목록으로 이동합니다!)


3. Permission Check 지원 (api23 이상)

: 현재 사용하는 permission 중 Protection level이 dangerous 로 되어있으면, 사용자에게 동의를 받아야 정상동작함

: Protection level 검색방법

https://developer.android.com/reference/android/Manifest.permission

위 링크 들어간 후 사용중인 퍼미션 이름 검색


4. Background Service 임시제거

: 아래의 내용 때문에 임시 제거한  상태 

시스템이 서비스를 생성한 후, 앱은 5초 이내에 해당 서비스의 startForeground() 메서드를 호출하여 새 서비스의 알림을 사용자에게 표시해야 합니다. 앱이 이 시간 한도 내에 startForeground()를 호출하지 않으면 시스템이 서비스를 중단하고 이 앱을 ANR로 선언합니다.

> 백그라운드 상태를 유지하기 위해 서비스 종료시후 다시 백그라운드서비스를 올리도록 되어 있어 ANR 발생. (안 좋은 방식이기도 해서 이참에 손볼 예정)

* 임시로 앱이 실행중인 상태에서만 실행하도록 변경한 상태 

 jobschdule을 사용하여 처리하는 방법이 있는걸로 보이나, 업데이트 일자가 촉박하여 임시 패치.

관령 링크 - https://developer.android.com/about/versions/oreo/background?hl=ko


5. 기타 참고 사항 요약 정리

: FCM > GCM에서 생성된 Regstration ID로 푸시 메시지 전송 가능 

: 알림설정을 시스템에서 세분화하여 관리하도록 변경(알림채널 기능)

기존에 알림을 컨트롤 했다면, 이젠 불가능해짐.

API 26이상의 단말에서는 필수로 1개이상의 채널이 있어야 함.

: 퍼미션 Protection level검색 후  dangerous로 되어 있다면 유저로 부터 동의를 받아야함. 

: 백그라운드 서비스 정책변경 

앱이 시간 한도 내에 startForeground()를 호출하지 않으면 시스템이 서비스를 중단하고 이 앱을 ANR로 선언


알림채널 문서로 몇번을 봐도 이해가 잘 안됐는데.. 

직접구현하고 테스트해보니 그제야 개념이 좀 잡히네요.

실제 패치 시에는 Eclipse환경에서 Android Studio로 변경하는 작업에서 가장 애를 먹었는데, 

아직 Eclipse를 쓰신다면 이참에 변경해보세요!


저의 경우 기존에 Android Library Project 로 메인 소스를 구성하고, 

서브프로젝트에서 Import해서 하나의 소스로 앱을 다르게 구성하여 배포를 했는데, 

이번에 Android Studio로 변경하고 productFlavors라는 옵션을  사용하니

예전 보다 훨씬 간편하고 쉽게 구성할 수 있었네요.  


저처럼 패치는 해야겠고, 뭐부터 봐야할지 모르는 분들을 위해 한번 포스트해봤네요.

도움이 됐다면 아래 하트 한번 눌러주세요.!!