iOS 7->8 로 넘어오면서 푸시알림 동의 받는 코드가 바뀌었다.

개발 중인 앱은 최소 iOS 버전이 iOS 8버전 이상이지만 혹시나 구버전을 지원해야 하는 경우도 있기 때문에 함께 기록 해 본다.


  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        NSLog(@"Requesting permission for push notifications...iOS 8"); // iOS 8
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:
                                                UIUserNotificationTypeAlert | UIUserNotificationTypeBadge |
                                                UIUserNotificationTypeSound categories:nil];
        [UIApplication.sharedApplication registerUserNotificationSettings:settings];
    } else {
        NSLog(@"Registering device for push notifications...iOS 7 and earlier"); // iOS 7 and earlier
        [UIApplication.sharedApplication registerForRemoteNotificationTypes:
         UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge |
         UIRemoteNotificationTypeSound];
    }
}


그리고 아래는 디바이스가 APN 서버에 정상적으로 등록 되었는지 로그를 찍어서 확인 할 수 있는 코드

- (void)application:(UIApplication *)application
didRegisterUserNotificationSettings:(UIUserNotificationSettings *)settings
{
    NSLog(@"Registering device for push notifications...iOS 8"); // iOS 8
    [application registerForRemoteNotifications];
}

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)token
{
    NSLog(@"Registration successful, bundle identifier: %@, mode: %@, device token: %@",
          [NSBundle.mainBundle bundleIdentifier], [self modeString], token);
}

- (void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"Failed to register: %@", error);
}

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)notification completionHandler:(void(^)())completionHandler
{
    NSLog(@"Received push notification: %@, identifier: %@", notification, identifier); // iOS 8
    completionHandler();
}

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)notification
{
    NSLog(@"Received push notification: %@", notification); // iOS 7 and earlier
}

- (NSString *)modeString
{
#if DEBUG
    return @"Development (sandbox)";
#else
    return @"Production";
#endif
}



'프로그래밍 > iOS - OBJC' 카테고리의 다른 글

iOS NSTimer 호출하기  (1) 2016.05.12
맥 OS X PhoneGap 설치  (0) 2016.04.27
iOS에서 위치정보 사용 동의 받기  (0) 2016.03.10
Singleton 패턴 사용하기  (0) 2016.03.09
iOS 앱 자동로그인  (0) 2016.03.09

MDM 솔루션을 구축하기 위해서는 서버가 필요한데, LG U+ Cloud나 Naver NCloud Biz 등 에서

시스템 사양과 요금 등을 고려하여 적당한 시스템을 선택하면 된다.


MDM 서버는 SSL 적용이 필수인데 SSL 적용을 위한 인증서가 iOS에서 신뢰할 수 있는 인증기관(링크)에서 발급한 인증서를

써야 하는지 자가서명 된 인증서를 써도 되는지 모호하여 일단 자가서명 인증서를 사용하여 진행 해보기로 하였다.


ubuntu server는 설치되어 있는 상황이라고 가정하고 계속 진행을 해보자면 일단 맥의 터미널 프로그램을 이용하여 원격 서버에 접속한다.

먼저 터미널 실행 후 ssh root@ip주소  를 입력하여 우분투 서버에 접속을 한다.

초기 서버 셋팅 시 root 라는 유저 네임은 어떻게 설정하였는가에 따라 다르겠지만 보통 root를 많이 사용하므로 유저 네임은 root라고 본다.


먼저 APM (Apache, PHP, MySQL)을 설치한다.


apt-get update


apt-get install apache2


아파치 설치가 끝나면 service apache2 start 명령어를 이용하여 아파치 서버를 시작하고

웹 브라우저에서 서버의 IP주소 또는 도메인으로 접속했을 때 아래와 같은 페이지가 뜬다면 성공적으로 설치 된 것이다.



하지만 아직 ssl 적용이 되지 않았기 때문에 https://서버주소로 접속을 하면 접속이 되지 않을 것이다.


다음으로 sudo apt-get install openssl 명령어를 이용하여 openssl을 설치한 후 다음 순서대로 따라한다.


openssl genrsa -des3 -out server.key 2048 // 자가서명 인증서 생성 

openssl req -new -days 365 -key server.key -out server.csr // CSR 파일 생성 

cp server.key server.key.org 

openssl rsa -in server.key.org -out server.key // 개인키 패스워드 제거 

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt // 인증서 서명 

openssl x509 -in ca.der -inform DER -text // 인증서 인코딩 변경 

Apache 적용 
sudo a2enmod ssl 

sudo service apache2 restart 

sudo mkdir /etc/apache2/ssl // 인증서 폴더 생성 

위 작업에서 생성된 server.crt / server.csr / server.key 파일을 위에서 생성한 경로로 이동해 준다. 
 
Apache 설정 
sudo cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-available/서버주소      // default-ssl 파일을 사용중인 도메인주소로 변경
 
sudo vi /etc/apache2/sites-available/서버주소      // 편집기로 아래와 같이 내용 수정 
  SSLEngine on 
  SSLCertificateFile /etc/apache2/ssl/server.crt 
  SSLCertificateKeyFile /etc/apache2/ssl/server.key 

sudo a2ensite 서버주소 

sudo service apache2 restart // 서버 활성화 및 재시작

서버가 재시작 된 후에 https://서버주소로 접속하면 신뢰할 수 없는 인증기관 어쩌고 하는 내용이 뜨는데 
이것은 자가서명 인증서로 SSL을 구성하였으므로 당연한 현상이다.


vi 편집기 명령어는 다른 개발자분들이 쉽게 잘 설명해 놓은 자료들이 많으므로 조금만 검색하면 쉽게 찾을 수 있다.





앱 개발 시에 Singleton 패턴 이라는 이야기를 자주 듣게 되는데 널리 쓰이는 만큼 한번 배워 놓으면 써먹을 데가 많다.

위키 백과에서의 싱글톤 패턴에 대한 정의는 아래와 같다.

소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 
최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다.


쉽게 생각해서 여러 클래스에서 공통적으로 자주 쓰이는 인스턴스들을 필요할 때마다 

매번 초기화 할 필요 없이 한번 초기화 된 인스턴스를 불러온다는 것이다.

필요할 때마다 매번 인스턴스를 생성한다는 것은 시스템 자원의 낭비를 가져온다.


예제를 하나 들자면 아래 내용은 실제 네트워크를 통해 앱에서 Database에 엑세스 할때 주로 사용하였다.

Singleton.h 헤더 파일
@interface Singleton : NSObject

+ (NSString *) getBaseURL;
+ (NSString *) getProfileImageBaseURL;

@end

Singleton.m 구현 파일 @implementation Singleton + (NSString *) getBaseURL { static NSString * const BaseURLString = @"http://서버 주소"; return BaseURLString; } + (NSString *) getProfileImageBaseURL { static NSString * const BaseURLString = @"http://이미지 파일이 저장된 서버 주소"; return BaseURLString; } @end

이렇게 자주 쓰일 URL을 미리 선언 해 놓은 후


싱글톤 패턴 활용
#import "Singleton.h"

NSString *urlStr = [NSString stringWithFormat:@"%@/login_check.php",[Singleton getBaseURL]];
NSString *imageurlStr = [NSString stringWithFormat:@"%@/get_image.php",[Singleton getProfileImageBaseURL]];

이런 식으로 필요할 때마다 불러와서 사용하면 된다.


만약에 싱글톤 패턴을 사용하지 않고 필요할 때마다 인스턴스를 만들어서 사용을 한다면

기존 URL 값이 바뀌어야만 하는 상황이 생겼을 때 생성했던 모든 인스턴스를 찾아서 

각각 수정해줘야 하기 때문에 효율성 측면에서 추천하지 않는 방법이다.


'프로그래밍 > iOS - OBJC' 카테고리의 다른 글

iOS NSTimer 호출하기  (1) 2016.05.12
맥 OS X PhoneGap 설치  (0) 2016.04.27
iOS에서 위치정보 사용 동의 받기  (0) 2016.03.10
iOS 8에서 푸시 알림 동의 받기  (0) 2016.03.10
iOS 앱 자동로그인  (0) 2016.03.09

프로젝트 진행 중에 처음에는 없던 자동로그인 기능 구현이 결정되었다.

최대한 간단하게 구현하려고 노력했으며 실제로 그렇게 되었다고 본다.


바로 NSUserDefaults 를 이용한 방법인데 LoginState, Autologin 이라는 NSUserDefault를 선언하고

LoginState는 YES/NO 값을 가지고 ID와 PW를 스트링으로 저장하여 다음 앱 실행 시 활용하였다.


앱 메인에 로그인 유지를 선택 할 수 있는 체크박스를 만들어 놓은 후

if (autoLoginChecked) { // 자동로그인 체크 NSUserDefaults *autologin = [NSUserDefaults standardUserDefaults]; [autologin setObject:@"yes" forKey:@"loginstate"]; // 자동로그인 State를 yes로 저장 [autologin setObject:userID.text forKey:@"userid"]; // User ID 필드 값 저장 [autologin setObject:userPass.text forKey:@"pass"]; // User PW 필드 값 저장 [autologin synchronize]; }

이렇게 설정을 해 놓은 후 다음 앱 실행 시 loginstate 의 키 값이 yes냐 no냐에 따라서 분기를 주면 된다.

사용자 로그아웃 시에는 loginstate를 no로 바꾸고 synchronize를 해주면 간단하다.


'프로그래밍 > iOS - OBJC' 카테고리의 다른 글

iOS NSTimer 호출하기  (1) 2016.05.12
맥 OS X PhoneGap 설치  (0) 2016.04.27
iOS에서 위치정보 사용 동의 받기  (0) 2016.03.10
iOS 8에서 푸시 알림 동의 받기  (0) 2016.03.10
Singleton 패턴 사용하기  (0) 2016.03.09


 Apple MDM



MDM 이란 Mobile Device Management의 약자로 기업, 교육 기관 등의 단체에서 

앱을 배포하고 모바일 기기들을 관리하기 위한 솔루션입니다.

개발자 계정은 엔터프라이즈 계정(379,000원 / 1년)을 보유 하여야 하며 

MDM Vendor 인증서 등의 추가 인증서 발급 작업이 필요합니다. 


iOS의 경우 MDM 서버 구축 -> MDM 서버 정보를 포함한 Profile을 생성

 -> 사용자가 Profile 설치(Device Management 허용) -> MDM 서버에 기기 등록의 과정이 선행되어야 합니다.


그 후, MDM 서버에서 MDM 커맨드를 iOS에 푸쉬를 하고 iOS가 MDM 서버와 연결되어 정의된 기능들을 수행합니다.


이번 프로젝트는 학생들을 대상으로 서비스 중인 안심 알리미 앱을 수업시간 화면잠금 등의 기능제한을 적용하기 위해 

기존 앱에 MDM 솔루션을 적용하기 위해 시작되었습니다.


MDM 서버는 ubuntu server 14.04 버전을 사용하였고, 리눅스를 처음 써 보는 제가 국내에서 자료를 찾기 힘든

MDM 솔루션을 구축하면서 겪는 시행 착오와 해결 방향을 기록해 나갈 예정입니다.




+ Recent posts