[iOS] Permission Alert View 에 custom 메시지 추가하기

iOS App이 사용자의 사진, 캘린더, Push Notification, 연락처 등 개인정보에 접근 시도할 때,  System은 AlertView를 띄어 사용자에게 접근 권한을 부여할 것인지 묻는다.

이 때 보여지는 AlertView 메시지는 context 정보가 없기 때문에 사용자의 허가를 득하기가 쉽지 않다.

그래서 요즘은 권한 부여 AlertView를 띄우기 전에 접근이 필요한 이유를  사용자에게 먼저 알려주는 방법을 사용함으로써 이러한 장벽을 낮추려는 시도가 많다.

오늘 이와 관련한 글  The Right Way to Ask Users for iOS Permissions 을 읽다가 한가지 놀라운 – 나만 몰랐으니 나만 놀란걸 수도 – 사실을 발견하였다. (링크된 블로그 글도 꼭 읽어보길 바란다.)

글에 첨부된 이미지들을 살펴보니 System에서 관장하는 접근 권한 AlertView에 App에 특화된 접근 목적이 기술되고 있는 것 아닌가.

실제 구현 방법을 조사해보니 너무 간단했다. 간단히 방법을 알아보자. (너무 간단해서 개인 블로그 대기 리스트에 넣지 않고 바로 쓴다.)

구현 

iOS 는 info.plist의 특정 키값을 통해 접근 권한 AlertView에 메시지를 추가 할 수 있게 한다. 즉 개발자가 할 일은 info.plist에 키 값을 넣고 메시지를 넣으면 끝이다. (다국어를 지원한다면 Localized 작업 필요)

iOS Developer Library 의 Information Property List Key Reference 를 보면 접근 권한 메시지에 해당하는 키값을 확인할 수 있다. Xcode의 editor를 이용한다면 “Privacy – ” 로 시작하는 키값을 찾으면 된다. Key 값에 따라 지원하는 iOS 버전도 다르니 Refernce를 확인하자. (애석하게도 Push Notification 에 대한 키값은 보이질 않는다.)

< From : iOS Developer Library >

간단한 테스트 앱을 만들어 확인하였다. Info.plist 에 키값을 추가 하기 전의 접근 권한 알림창 – 기본 접근 권한 알림창 – 은 아래와 같다.

< 메시지 적용 전 접근 알림 >

아래와 같이 info.plist에 키값을  추가하였다. (사진과 연락처)

< info.plist 화면 in Xcode >

앱을 실행시키면 기존 접근 권한 알림과 달리 info.plist에 설정한 메시지가 AlertView에 추가된 것을 확인할 수 있다.

< 사진 라이브러리 접근 알림 창 >

< 연락처 접근 권한 알림 창 >

 

App에서 접근하려고 하는 사용자의 데이터가 App 동작의 핵심 역할을 한다면, 접근이 필요한 이유를 명시함으로써 사용자의 행동을 좀 더 쉽게 유도할 수 있을 것이다.

본인은 위 내용을 현재 작업 중인, 아니 현재 뿐 아니라 앞으로 작업할 서비스에도 적용할 생각이다.

Advertisements

[iOS] Custom Debug Library 만들기

앱 개발 과정에서 Log는 디버깅에서 많이 사용된다. 그러나 개발과정에서 남긴 수많은 Log 명령어들을 배포 버전에서 삭제하는 일은 여간 피곤한 일이 아닐 수 없다.

Xcode 의 Compiler 옵션 설정과 #ifdef 구문을 이용한 자신만의 디버그용 라이브러리를 만들어 사용하면, 어플리케이션을 배포할 때 개발에서만 필요했던 코드를 지우는 작업을 피할 수 있다.

간단히 Log 를 위한 디버그 라이브러리 만드는 방법을 알아보자.

디버그 라이브러리 생성

먼저 디버깅을 위한 파일을 생성한다. 본인은 KS_Debug.h 파일을 생성하였다. 코드는 다음과 같다.

// KS_Debug.h 파일
#import <Foundation/Foundation.h>

// log
#ifdef APP_STORE_VERSION

// 로깅만을 위한 변수를 선언하는 경우는 거의 없다라는 판단
#define KS_LOG_NO_TIME(format, ...)
#define KS_LOG(format, ...)

#else

// CFShow 는 날짜,시간 정보 콘솔 출력 안함. __bridge 타입캐스팅은 ARC 적용 (iOS 5)에 따른 규정 따름
#define KS_LOG_NO_TIME(format, ...) CFShow((__bridge CFTypeRef)[NSString stringWithFormat: format, ## __VA_ARGS__]);
#define KS_LOG(format, ...) NSLog([NSString stringWithFormat : format, ## __VA_ARGS__]);

#endif
//

APP_STORE_VERSION  정의 여부에 따라 KS_LOG_NO_TIME 구문과 KS_LOG 구문 실행 형태가 결정된다.

APP_STORE_VERSION 이 정의되어 있지 않은 케이스에는 KS_LOG_NO_TIME 과 KS_LOG 정의문에 별도의 실행문이 정의되어 있지 않다. 이는 로깅만을 위한 변수를 따로 생성하는 경우가 드물다는 판단에서다.

만약 개발과정에서 로깅만을 위한 임시 변수를 생성하였다면 APP_STORE_VERSION 을 컴파일러 옵션에 지정하고 실행시킨 경우, 로깅용 임시 변수에는 Warning -“Unused Variable” – 이 뜬다.

KS_LOG_NO_TIME 은 시간 정보 없이 텍스트만 로그로 남기는 용도로 사용한다. (NSLog 는 기본적으로 시간 정보가 나타남)

Compiler 옵션 설정 

APP_STORE_VERSION 설정은 컴파일러 옵션에서 가능하다.

아래 그림처럼 Xcode에서 Targets -> Build Settings 의 Preprocessor Macros Not Used in Precompiled Header 옵션을 설정한다. 이 옵션에  APP_STORE_VERSION  설정 여부에 따라 로그 동작이 제어된다.

아래와 같이 테스트 코드를 작성하고 컴파일러 옵션 설정 여부를 변경해가며 실행시켜보면, 컴파일러 옵션 설정에 의해 로그 실행 여부가 결정됨을 확인할 수 있다.

//
KS_LOG_NO_TIME(@"Test with No Time Info");
KS_LOG_NO_TIME(@"Para1 : %@ , Para2 : %d, Para 3 : %f", @"string", 3, 3.333);

KS_LOG(@"Test With Time Info");
KS_LOG(@"Para1 : %@ , Para2 : %d, Para 3 : %f", temp, 3, 3.333);
//

로그 이외에도 Assert 구문 등 디버깅에 필요한 기능들을 디버그 라이브러리에 추가한다면, 유용한 자신만의 디버그 라이브러리를 만들 수 있을 것이다.

* Reference : iPhone Advanced Projects 

%d bloggers like this: