10월, 2019의 게시물 표시

블로그/웹 소스코드 정리하기 (Code Prettify 사용하기)

이미지
  블로그/웹 소스코드 정리하기 (Code Prettify 사용하기) 안녕하세요. 오늘은  기존에 사용중이던, ColorScripter (정리된글 : https://xodhks0113.blogspot.com/2018/08/additing-blog-sourcecode.html ) 갑자기 접속이 되지 않고 있어서 블로그를 쓰다가 난처해 졌습니다. (2019년 10월 30일 블로그 글쓰다보니깐 사이트가 다시 접속되내요 ^^) 그래서 추가적으로 다른방법으로 소스코드 정리하는 방법에 대해 알아보았습니다. Code Prettify ( git :  https://github.com/google/code-prettify  ) 해당 방식은 블로그 글의 HTML 부분의 script를 삽입하여 <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script> class 의 prettyprint 를 찾아 CSS를 입혀주는 방식입니다. <pre class="prettyprint">class Voila { public: // Voila static const string VOILA = "Voila"; // will not interfere with embedded tags . } </pre>   테마와 지원언어 필자의 경우 블랙테마를 선호하며, Swift 언어를 지원하는걸로 Script 선어하여 미리 사용해 보았다. (두가지 테마를 한 HTML 에서 쓸 수 없어 사진과 링크로 공유합니다.) 블랙테마, Swift 적용된 링크 Git 주소의 들어가면 자세한 설명이 있으나 필자가 적용한 정보도 공유드립니다. 필자의 경우 lang =swift, skin =desert 적용하였습니다. &l

iPhone to iPhone 기기옮기기

이미지
  iPhone to iPhone 기기옮기기 iPhone 개발일을 하면서 아이폰을 지원 받는데, 개인용으로 쓸때도 있고 개발용으로만 쓸때도 있다. 개인적으로는 백업을 iCloud 통해서 받을수도 있지만 iPhone to iPhone 으로 옮기는 방법도 매우좋은것 같아서 포스팅 한다. 1. 인근에 새 iPhone이 있으면 설정할 것 인지 물어봄. 2. 원형 홀로그램같은 이미지가 새 iPhone에 뜨고, 기존에 쓰던 iPhone으로 인증함. 3. 기다리기... (생각보다 오래걸림. 12:30분 시작함) 4. 여기서 선택을 할 수 있습니다. iPhone to iPhone (오래걸린다는 가이드) iCloud 다운로드 (덜걸린다는 가이드) 필자는 기본적인 정보는 이미 옮겨졌고, 앱다운로드는 iCloud 통해서 받기로 선택함. 5. 여기서 부터는 기존 iPhone 필요없음. 6. 많은 기다림의 시간.. 7. 복원 완료까지 1시간 30분 걸렸다. #. 필자는 글을쓰고 있는 와중에도 아직도 앱들이 전체 설치 되지 않았다. (4:40분) 보통 6시간 정도면 거의다 되는것 같다. 끝.

iPhone 11 Pro 미드나잇그린

이미지
매년 iPhone 새폰을 회사에서 받는데, 이번에는 미드나잇그린색이 이쁜것 같아서 받았다. 이제는 뭐 매년 받으니 개봉기는 할 것 없고, 그냥 이쁜것 같다. 새기기 옮기기 :  iPhone to iPhone 기기옮기기 + 여기서 가장 이번에 좋게 느껴지는 18w 고속충전기 ㅎㅎ 쫌 써봐야겠지만 카메라 성능이 확실히 좋아진것 같다. 끝.

iOS13 _placeholderLabel.textColor 접근오류

  iOS13 _placeholderLabel.textColor 접근오류 기존의 UITextField 의 Placeholder Color 를 변경하려고 KVC 방식을 활용하여 사용하고 있었는데, Xcode 11, iOS 13 빌드시 앱이 죽는 현상을 발견하였습니다. (이번에 유독 이런 부분이 많아서 참 애플이 미워지고 있습니다.....)   기존 코드 [self.textFieldPassword setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"]; Extention을 활용하여 UITextField Placeholder Color를 변경하는 방법을 구현하였습니다.   변경 코드 [self.textFieldPassword setCommonPlaceholderColor:[UIColor lightGrayColor]];   내부 코드 import UIKit extension UITextField { /// UITextField Placeholder setColor (내부의 키값을 Class화 시켜서 작업함) /// - Parameter color: UIColor 값 @objc(setCommonPlaceholderColor:) // 함수인자가 존재시 objc 에서 인식못할때 이렇게 표현가능함. func setCommonPlaceholderColor(color:UIColor) { let ivar = class_getInstanceVariable(UITextField.self, "_placeholderLabel")! let placeholderLabel:UILabel = object_getIvar(self, ivar) as! UILabel placeholderLabel.textColor = color } } 이번에 느낌

iOS13 APNS deviceToken 관련

  iOS13 APNS deviceToken 관련 안녕하세요. 이번에 iOS13 부터 deviceToken 가져올 때 이슈사항에 대해 공유드립니다.   이슈사항 iOS12 환경  deviceToken 데이터 형식 < fa26d6a1 711c10f2 fe15aa98 8beb4a5e 385bc0a4 d6e8b839 07b4f501 648722eb > cs iOS13 환경  deviceToken 데이터 형식 {length  =   32 , bytes  =   0xfa26d6a1  711c10f2 fe15aa98 8beb4a5e ... 07b4f501 648722eb } cs   대응 iOS 12 환경 대응을 위해 두가지 동시에 사용하였습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 // 디바이스 토큰 획득 -  ( void )application:(UIApplication  * )app didRegisterForRemoteNotificationsWithDeviceToken:(NSData  * )deviceToken {      // iOS 13에서 deviceToken 값이 변경되어 처리 로직 수정함.     NSString  * tokenStr  =  @ "" ;      if  (@available(iOS  13. 0 ,  * )) {         NSUInteger length  =  deviceToken.length;          if  (length  ! =   0 ) {              const   unsigned   char   * buffer  =  deviceToken.bytes;       

iOS13 WKWebKit decidePolicyForNavigationAction: (iPad UserAgent Desktop 문제)

이미지
  iOS13 WKWebKit decidePolicyForNavigationAction: (iPad UserAgent Desktop 문제) 이번 iOS13 때 예상치 못했던 점인데, 유지보수건에서 확인하다보니 Objective C 언어로 설명하겠습니다. iOS Client만 개발을 하다보니 WebKit 관련해서 하이브리드 작업을 하든, 디스플레이만 하든 티가 안나서 문제 될 것은 없었습니다. "iPad에서 Useragent 값이 Desktop" 으로 표현되어, 기존에 Web부분에서 Mobile 과 Desktop 구분하여 사용 하던 WebPage 인 경우 작동이 다르게 되는 오류가 발견되었다. WKWebpagePreferences 추가로 현 디바이스를 Mobile, Desktop 으로 설정할 수 있어졌다. 그런데...  iOS 13 전용 decidePolicyForNavigationAction: Delegate 에서 추가해야한다는 점   이번에 신규 추가된 Navigation Delegate 참고 Apple :   webView:decidePolicyForNavigationAction:decisionHandler: 해당함수는 iOS13에서만 작동하고 해당함수가 작동하면, 기존에 있는 decidePolicyForNavigation 은 작동하지 않는다고 설명해져있다. 필자의 경우 로직 코드를 하나로 합치기 위해 아래와 같이 코드를 구현하였다.   샘플 코드 // 기존 iOS 13 미만 WKWebView Navigation Delegate -  ( void )webView:(WKWebView  * )webView decidePolicyForNavigationAction:(WKNavigationAction  * )navigationAction decisionHandler:( void  (^)(WKNavigationActionPolicy))decisionHandler {     

[iOS] iPad Multi Window Example (간략소개)

이미지
  iPad Multi Window Example (간략소개) iPad OS 올라가고 나서 부터 메모앱이 여러창이 띄워지기 시작하면서 어떻게 구성하는지 궁금해서 알아보기 시작하였다. 샘플 예제 구동 동영상 Xcode 11 이상 버전에서 Project > Target 의 Supports multiple windows 체크박스가 추가되었다. 설정 해준다. (여기까지만 해주어도 multiple windows 는 지원이 끝이다. 추가 Code 필요없음) 매우 심플.. 필자의 경우는 DragDelegate 를 UIView에 추가하여, UIView를 Drag시에도 multiple windows 를 지원하도록 예제를 만들어 놨습니다.   예제소스 Example(Git) :  https://github.com/kimjiwook/iPadMultiWindowExample

[iOS] UIView Shadow 효과

이미지
  UIView Shadow 효과 간략 샘플 코드 tempView.layer.shadowOpacity  =   0. 7 tempView.layer.shadowOffset  =  CGSize(width:  - 20 , height:  0 ) tempView.layer.shadowRadius  =   10 tempView.layer.masksToBounds  =   false cs shadowOffset 으로 그림자 효과의 위치값을 수정할 수 있다.

[Swift 공부] 접근제어

[Swift 공부] 접근제어 접근제어는 코드끼리 상호작용을 할 때 파일 간 또는 모듈간 접근을 제한할수 있는 기능이다. 불필요한 접근으로 코드가 의도치않은 결과값을 만들 수 있기에 접근이 가능 부터 불가능하게 만들수 있는 키워드이다. 5가지 정도 있다는 형식으로 알면 좋을것 같고, 실제로 사용할때는 public 과 private 를 가장 많이 사용한다. 접근수준 키워드 범위 비고 개방 접근수준 open 모듈 외부까지 Class 만 사용 공개 접근수준 public 모듈 외부까지 내부 접근수준 internal 모듈 내부 파일외부비공개 접근수준 fileprivate 파일 내부 비공개 접근수준 private 기능 정의 내부   공개 접근수준 public 자신이 구현된 소스, 파일, 모듈 등 접근이 가능하다.   개방접근 수준 open 클래스와 클래스의 맴버에서만 사용 가능.   내부 접근수준 internal 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준   파일외부비공개 접근수정 fileprivate 구현된 소스파일 내부에서만 사용할 수 있는 접근수준   비공개 접근수준 private 접근수준이 가장 한정적인 범위지정된 요소는 그 기능을 정의하고 구현한 범위내에서만 사용가능

[Swift 공부] Guard 알아보기.

  Guard 알아보기 Swift에서 {if let 변수명} 은 Objective C 에서는 느껴보지 못한 확인 절차가 너무 좋았던 점 중에 하나이다. 이런 확인절차에 사용할 수 있는 Guard 를 알아보려고한다.   if let 해당 코드가 맞다면, if {내부에 정상적인 코드 작성}   guard 해당코드가 아닌 경우 else{예외처리} 밖에서 변수 사용가능 guard 처리로 예외체크할 시에 라인이 깔끔하다는 점과 변수를 밖에서도 사용할 수 있다는 장점이 있다. 좀더 많은 예외처리항목과 그 변수값으로 다른 예외처리 체크까지 할 때 편리하게 사용할 수 있다. import  UIKit //1. Guard 를 if let 과 비교하기 // if let 옵셔널 활용시 func  ifMyName(name: String ?)  - >   String  {      if   "soo"   = =  name {          return   "당신의 이름은 [X] 입니다."     }               else   if   let  resultName  =  name {          return   "당신의 이름은 \(resultName)입니다."     }           else  {          return   "당신의 이름은 [X] 입니다."     } } // guard 옵셔널 활용시 func  guardMyName(name: String ?)  - >   String  {     guard  let  resultName  =  name, name  ! =   "soo"   else  {          return   "당신의 이름은 [X] 입니다."     }           return   &