Summary

APNs 를 사용하여 푸쉬 서비스를 이용할 경우 소스코드 내에 푸쉬 서비스 등록 및 푸쉬를 받았을 경우 처리할 수 있는 delegate 를 구현해 주어야 한다.
iOS10 부터 UNUserNotification 을 사용하여 서비스 등록 및 처리 방법이 변경되었기 때문에 iOS10 버전과 하위버전을 같이 처리할 수 있도록 적용해 주어야 한다.

푸시 서비스 등록 및 처리

/************
AppDelegate.h
*************/
#import <UserNotifications/UserNotifications.h> // ( >= iOS10)
// UNUserNotificationCenterDelegate
@interface AppDelegate : UIResponder <UIApplicationDelegate, UNUserNotificationCenterDelegate>
...
/************
AppDelegate.m
*************/
...
#define isOSVersionOver10 ([[[[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."] objectAtIndex:0] integerValue] >= 10)
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
//
[self initializeRemoteNotification];
...
}
#pragma mark - Initialize Remote Notification
- (void)initializeRemoteNotification {
if(isOSVersionOver10) { // iOS10
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
if( !error ) {
//
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else {
//
}];
}
else { // iOS10
if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) {
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
}
}
#pragma mark - Get Device Token
//
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSMutableString *tokenHex = [NSMutableString stringWithString:[deviceToken description]];
[tokenHex replaceOccurrencesOfString:@"<" withString:@"" options:0 range:NSMakeRange(0, [tokenHex length])];
[tokenHex replaceOccurrencesOfString:@">" withString:@"" options:0 range:NSMakeRange(0, [tokenHex length])];
[tokenHex replaceOccurrencesOfString:@" " withString:@"" options:0 range:NSMakeRange(0, [tokenHex length])];
NSLog(@"Token origin : %@", deviceToken);
NSLog(@"Token : %@", tokenHex);
}
// iOS9 Delegate
#pragma mark - Remote Notification Delegate for <= iOS 9.x
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
//
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"Remote notification : %@",userInfo);
}
//
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"Error : %@",error);
}
// iOS10 Delegate
#pragma mark - UNUserNotificationCenter Delegate for >= iOS 10
//
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
NSLog(@"Remote notification : %@",notification.request.content.userInfo);
//
completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound);
}
//
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
NSLog(@"Remote notification : %@",response.notification.request.content.userInfo);
completionHandler();
}
iOS10 부터는 소스코드 추가 이외에 프로젝트 설정에서 Push Notificaiton 옵션을 활성화 해주어야 한다


옵션을 활성화 해주면 아래와 같이 entitlements 파일이 생성될 것이다.

이렇게 해주면 모든 푸시 서비스 등록 작업이 마무리된다.


반응형

Summary

커맨드라인에 계정정보가 노출되면 아래와 같은 경고 발생
Warning: Using a password on the command line interface can be insecure.
커맨드 혹은 스크립트에서 계정 정보를 노출 하는건 정보가 유출 될 수 있으므로 로그인 파일을 생성한 후 사용하면 좋다.

mysql_config_editor?

MySQL 5.6.6 이상부터 사용가능한 Utility로 암호화된 로그인 파일인 .mylogin.cnf 에 합접적인 인증 정보를 저장하여 사용하는 Utility 이다.
mysql_config_editor 명령어는 .mylogin.cnf 파일을 암호화하여 내용을 읽을 수 없게 만들고, client 프로그램에서 해독된 정보만 메모리상에 존재하므로 패스워드 정보를 보호할 수 있다.

접속 정보 생성

자세한 설명을 생략하고 바로 접속 정보를 생성하는 방법을 알아보자
$ mysql_config_editor set --login-path=[name] --host=[hostname] --user=[username] --passwordport=[port]
위의 명령어를 입력하면 비밀번호를 입력한 후 myinfo.cnf 파일에 접속 정보가 등록된다. 
사용자 입력 항목들은 아래와 같다.
[name] : 접속시 사용할 이름
[hostname] : DB 호스트네임
[username] : DB 접속 아이디
[port] : 호스트의 포트번호

등록된 인증 정보 확인

$ mysql_config_editor print --all
[tez]
user = root
password = *****
host = localhost
port = 3306
print 옵션을 사용하여 등록정보를 출력하면 비밀번호 부분은 가려진채로 정보를 보여준다

등록한 인증 정보로 MySQL 사용 

#
$ mysql -u [username] -p
#
$ mysql --login-path=[name]
기존에 사용하던 -u [username] -p 대신 —login-path=[name]​ 옵션을 사용하여 mysql 관련 동작을 처리하면 된다
mysql, mysqldump 등 모두 이렇게 사용하면 된다.

등록된 인증 정보 삭제

등록되어있는 인증정보를 삭제하는 방법은 특정 정보만 삭제하는 방법과 전체 정보를 삭제하는 방법 두가지가 있다. 
#
$ mysql_config_editor removelogin-path=[name]
#
$ mysql_config_editor remove
반응형

RHEL6 service  >  RHEL7 systemctl

RHEL6 의 service 명령어가 RHEL7 에서는 systemctl 명령어로 대체됨
#
$ systemctl status [service_name]
#
$ systemctl list-units --type service
# ()
$ systemctl --type service
#
$ systemctl start [service_name]
#
$ systemctl stop [service_name]
#
$ systemctl kill -s 9 [service_name]
#
$ systemctl restart [service_name]
#
$ systemctl reload [service_name]


RHEL6 chkconfig  >  RHEL7 systemctl

RHEL6의 chkconfig 명령어가 RHEL7 에서는 systemctl 명령어로 대체됨
#
$ systemctl list-unit-files --type service
# (chkconfig --addd)
$ systemctl daemon-reload
# /etc/systemd/system service systemd
#
$ systemctl is-enabled [service_name]
# enable
$ systemctl enable [service_name]
# disable
$ systemctl disable [service_name]


반응형