반응형

방법 1

// Swift
let sd = self.view.window.windowScene.delegate

// Objective-C
SceneDelegate *sd = self.view.window.windowScene.delegate;

 

방법 2

Swift :

//
// UIResponder+Scene.swift
//

import UIKit

@available(iOS 13.0, *)
extension UIResponder {
    @objc var scene: UIScene? {
        return nil
    }
}

@available(iOS 13.0, *)
extension UIScene {
    @objc override var scene: UIScene? {
        return self
    }
}

@available(iOS 13.0, *)
extension UIView {
    @objc override var scene: UIScene? {
        if let window = self.window {
            return window.windowScene
        } else {
            return self.next?.scene
        }
    }
}

@available(iOS 13.0, *)
extension UIViewController {
    @objc override var scene: UIScene? {
        // Try walking the responder chain
        var res = self.next?.scene
        if (res == nil) {
            // That didn't work. Try asking my parent view controller
            res = self.parent?.scene
        }
        if (res == nil) {
            // That didn't work. Try asking my presenting view controller 
            res = self.presentingViewController?.scene
        }

        return res
    }
}

 

Objective-C :

//
// UIResponder+Scene.h
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIResponder (Scene)

@property (nonatomic, readonly, nullable) UIScene *scene API_AVAILABLE(ios(13.0));

@end

NS_ASSUME_NONNULL_END





// 
// UIResponder+Scene.m
//

#import "ViewController+Scene.h"

@implementation UIResponder (Scene)

- (UIScene *)scene {
    return nil;
}

@end

@implementation UIScene (Scene)

- (UIScene *)scene {
    return self;
}

@end

@implementation UIView (Scene)

- (UIScene *)scene {
    if (self.window) {
        return self.window.windowScene;
    } else {
        return self.nextResponder.scene;
    }
}

@end

@implementation UIViewController (Scene)

- (UIScene *)scene {
    UIScene *res = self.nextResponder.scene;
    if (!res) {
        res = self.parentViewController.scene;
    }
    if (!res) {
        res = self.presentingViewController.scene;
    }

    return res;
}

@end

 

원문 : 
stackoverflow.com/questions/56588843/uiapplication-shared-delegate-equivalent-for-scenedelegate-xcode11

 

반응형

'개발 > iOS' 카테고리의 다른 글

ARC or Non-ARC Compile Flag 설정  (0) 2021.02.05
String to CGFloat  (0) 2021.01.06
앱 호출 (URL scheme)  (0) 2021.01.05
URL query 파싱 및 json string 변환  (0) 2020.12.17
디버깅 차단 처리 (Anti Debug)  (0) 2020.12.15
블로그 이미지

SKY STORY

,
반응형

스마트폰 BTC 채굴앱

https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site

 

앱에서 앱으로 호출

Info.plist 설정 후 OpenURL함수를 통해 호출한다.

 

Info.plist 설정

  • 호출하는 쪽 URL Scheme 설정 (샘플앱 명 : sendApp)

 

  • 호출받는 쪽 URL Scheme 설정 (샘플앱 명 : receiveApp)

 

※ Xcode 11부터 SceneDelegate가 기본 iOS 앱 프로젝트 템플릿으로 자동으로 추가되면서 AppDelegate의 openURL 함수가 호출 되지 않으므로 SceneDelegate의 openURLContexts 함수에서 처리해야 한다.

// SceneDelegate.swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    if let url = URLContexts.first?.url {
        print("url = \(url)")
    }
}
// SceneDelegate.m
- (void)scene:(UIScene *)scene openURLContexts:(NSSet *)URLContexts {
    UIOpenURLContext *context = URLContexts.anyObject;
    NSURL *url = context.URL;
    NSLog(@"url = %@",url);
}
// Swift 앱 호출 샘플코드
if UIApplication.shared.canOpenURL(url) {
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, options: [:], completionHandler: { (success) in

        })
    } else {
        UIApplication.shared.openURL(url)
    }
}
        
// Objective-C 앱 호출 샘플코드
if (YES == [[UIApplication sharedApplication] canOpenURL:url]) {
    if (@available(iOS 10.0, *)) {
        [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {}];
    } else {
        [[UIApplication sharedApplication] openURL:url];
    }
    return;
}

 

 

모바일 웹에서 앱 호출

  • 웹 브라우저(사파리,크롬 등)을 통한 웹사이트에서 앱 호출
window.location = "receiveApp://";

 

  • 웹뷰(WKWebView)를 통한 웹사이트에서 앱 호출

      ※ 주의 : 이 경우 해당 URL scheme이 호출될 때 직접 코드로 호출 해 주어야 한다. 

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    guard let url = navigationAction.request.url else {
        decisionHandler(.cancel)
        return
    }
    
    if (url.absoluteString.hasPrefix("receiveApp://")) {
        if UIApplication.shared.canOpenURL(url) {
            if #available(iOS 10.0, *) {
                UIApplication.shared.open(url, options: [:], completionHandler: { (success) in
                    
                })
            } else {
                UIApplication.shared.openURL(url)
            }
        }
        decisionHandler(.cancel)
        return
    }
    
    ... 중간생략 ...
}

 

스마트폰 BTC 채굴앱

https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site

 

2021/01/06 - [iOS/Swift] - String to CGFloat

2021/01/05 - [iOS/Tips] - SceneDelegate 포인터 구하기

2021/01/05 - [iOS/Tips] - 앱 호출 (URL scheme)

2020/12/24 - [개발노트] - 라이선스 종류

2020/12/24 - [OS/Mac OS X] - MacBook을 AP로 설정하는 방법

2020/12/18 - [Arduino] - Bit Rate, Baud Rate

2020/12/18 - [Arduino] - RS232 Serial 통신 불량체크

2020/12/17 - [프로그래밍/Java] - Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

2020/12/17 - [OS/Mac OS X] - OpenSSL을 이용한 Key 정보 Text 변환

2020/12/17 - [프로그래밍/Java] - RSA 암복호화

2020/12/17 - [iOS/Tips] - URL query 파싱 및 json string 변환

2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

반응형

'개발 > iOS' 카테고리의 다른 글

String to CGFloat  (0) 2021.01.06
SceneDelegate 포인터 구하기  (0) 2021.01.05
URL query 파싱 및 json string 변환  (0) 2020.12.17
디버깅 차단 처리 (Anti Debug)  (0) 2020.12.15
bundle id 알아내기  (0) 2020.12.14
블로그 이미지

SKY STORY

,

라이선스 종류

개발/Note 2020. 12. 24. 11:33
반응형

라이선스 종류

  • Apache License
     
    아파치 라이선스는 아파치소프트웨어재단이 자기네 SW에 적용하기 위해 자체적으로 만 든 라이선스다. 소스코드 공개 의무 같은 의무사항은 없지만, 아파치 라이선스 소스코드를 수정해 배포하는 경우 아파치 라이선스 버전 2.0을 꼭 포함시켜야 하며 아파치재단에서 만 든 소프트웨어임을 밝혀야 한다.
     
    적용 사례 : 안드로이드(v2.0), 하둡(v2.0)

  • GNU(Gnu is Not Unix) General Public License(GPL)
     
    자유소프트웨어재단에서 만든 라이선스다. GNU 프로젝트로 배포하는 소프트웨어 (Emacs, GNU 디버거(GDB), GNU 컴파일러 모음(GCC) )에 적용하기 위해 리처드 스톨만이 만들었다. 가장 큰 특징은 자유소프트웨어재단답게 가장 강력한 제약 조건을 포함 하고 있는 카피레프트 조항이다. GPL 프로그램은 어떤 목적으로, 어떤 형태로든 사용할 수 있지만 사용하거나 변경된 프로그램을 배포하는 경우 무조건 동일한 라이선스 즉, GPL로 공 개해야 한다.
     
    적용 사례 : 모질라 파이어폭스(v2.0), 리눅스 커널(v2.0), (v2.0), 마리아
    DB(v2.0), 워드프레스(v2.0), 드루팔(v2.0)

  • GNU Affero GPL(AGPL)
    – GPL
    을 기반으로 만든 라이선스로 버전1, 2는 아페로, 가장 최신 버전인 버전3은 자유소 프트웨어재단에 의해 개발됐다. 수정한 소스코드를 서버에서만 사용하는 개발자가 그 프로 그램을 배포하지 않을 경우 사용자는 소스코드를 가질 수가 없는 문제를 해결하기 위해 마련 됐다. 서버에서 프로그램을 실행해 다른 사용자들과 통신하면, 실행되고 있는 프로그램의 소 스코드를 사용자들이 다운로드할 수 있게 해야 한다는 독특한 조항을 담고 있다.
     
    적용 사례 : 몽고DB(v3.0)

  • GNU Lesser GPL(LGPL)
     
    자유소프트웨어재단의 강력한 철학이 담긴 GPL의 카피레프트 조항을 보완하기 위해 만든 라이선스다. GPL은 단순히 소프트웨어를 사용하기만 하더라도 해당 소스코드를 GPL로 공 개해야 하는 부담감 때문에 상용 소프트웨어로 쓰기 부담스럽다는 단점이 있다. 그래서 좋은 자유 소프트웨어 제품이 더 많이 쓰이고 표준이 되도록 유도하기 위해 단순한 라이브러리·모 듈 링크를 허용한 라이선스이다. 원래는 한정된 라이브러리에만 적용하려는 의도로 ‘Library GPL’이라는 이름을 붙였으나, 모든 라이브러리에 적용된다는 오해를 사 ‘Lesser GPL’로 변경됐다.
     
    적용 사례 : 모질라 파이어폭스(v2.1)

  • MIT License
    – MIT 
    라이선스는 미국 매사추세츠공과대학교(MIT)에서 해당 대학 SW 공학도들을 돕기 위해 개발한 라이선스다. 라이선스와 저작권 관련 명시만 지켜주면 되는 라이선스로, 가장 느슨한 조건을 가진 라이선스 중 하나이기 때문에 인기가 많다.
     
    적용 사례 : 부트스트랩 , Angular.js, Backbone.js, jQuery

  • Artistic License
     
    펄 프로그래밍 언어를 사용하던 래리 월이 표준 펄 기능을 위해 만든 라이선스다. 이 단어의 어원은 문학에서 문법상 틀린 표현이라도 시적인 효과를 위해 허용한다는 걸 의미하는 ‘Articstic License'(시적 허용)를 참조해 만들어졌다.
    – 적용 사례 NPM(Node Package Manager)(v2.0)

  • Eclipse License
     
    이클립스사에서 비즈니스 환경에 적합하도록 만든 기업 친화적인 라이선스로, 강력한 카피 레프트 조항이 담긴 GPL보다 제약 조건이 완화된 라이선스이다.
     
    적용 사례 : 이클립스(v1.0)

  • Berkeley Software Distribution(BSD) License
     
    버클리의 캘리포니아대학에서 배포하는 공개 SW 라이선스다. BSD 자체가 공공기관에서 만들어낸 것이므로 공공의 몫으로 돌려주자는 의미가 강하므로, 라이선스 자체에는 아무런 제한 없이 누구나 자신의 용도로 사용할 수 있다. 라이선스 및 저작권 표시 조건 외엔 제약이 없는, 굉장히 자유로운 라이선스 중 하나이다.
     
    적용 사례 : Nginx(The BSD 2-Clause License)

  • Mozilla Public License(MPL)
     
    모질라 공용 허가서는 과거 넷스케이프 웹브라우저의 소스코드를 공개하기 위해 개발된 라 이선스다. 초기 1.0버전은 넷스케이프 커뮤니케이션의 변호사였던 밋첼 베이커가 작성했고, 1.1 2.0버전은 모질라재단이 작성했다. MPL의 특징은 소스코드와 실행파일의 저작권을 분리했다는 점이다. 수정한 소스코드는 MPL로 공개하고 원저작자에게 수정한 부분에 대해 알려야 하지만, 실행파일은 독점 라이선스로 배포할 수 있다. 즉 사용한 MPL 소프트웨어와 수정한 MPL 소프트웨어에 대한 공개 의무만 가지며, 별도의 소스코드와 실행파일은 독점 라이선스를 가질 수 있다.
     
    적용 사례 : 모질라 파이어폭스(v1.1), 모질라 썬더버드(v1.1)

 

조건표

라이선스

필수 사항(Required)

허락 조건(Permitted)

금지 조건(Forbidden)

Apache License

제약조건:

라이선스 저작권 명시

변경사항 안내

상업적 이용 가능

배포 가능

수정 가능

특허 신청 가능

사적 이용 가능

2 라이선스

보증책임 없음

상표권 침해 금지

GPL

v2.0/v3.0

제약조건:

수정한 소스코드 혹은 GPL 소스코드를 활용한 소프트웨어 모두 GPL 공개

라이선스 저작권 명시

변경사항 안내

상업적 이용 가능

배포 가능

수정 가능

특허 신청 가능

사적 이용 가능

보증책임 없음

2 라이선스

GNU AGPL

(Affero GPL)

v3.0

제약조건:최상

수정한 소스코드 혹은 AGPL 소스코드를 활용한 소프트웨어 모두 AGPL 공개

라이선스 저작권 명시

변경사항 안내

네트워크상 소프트웨어 사용자에게 소스코드 공개

상업적 이용 가능

배포 가능

수정 가능

특허 신청 가능

사적 이용 가능

보증책임 없음

2 라이선스

GNU LGPL

(Lesser GPL)

v2.1/v3.0

제약조건:

수정한 소스코드 LGPL 공개(단순 활용시 공개 의무 없음)

라이선스 저작권 명시

상업적 이용 가능

배포 가능

수정 가능

특허 신청 가능

사적 이용 가능

2 라이선스

보증책임 없음

MIT

License

제약조건:

라이선스 저작권 명시

상업적 이용 가능

배포 가능

수정 가능

사적 이용 가능

2 라이선스

보증책임 없음

Artistic

License

제약조건:

라이선스 저작권 명시

변경사항 안내

상업적 이용 가능

배포 가능

수정 가능

사적 이용 가능

2 라이선스

보증책임 없음

상표권 침해 금지

Eclipse

License

제약조건:

수정한 소스코드 Eclipse 공개(단순 활용시 공개 의무 없음)

라이선스 저작권 명시

상업적 이용 가능

배포 가능

수정 가능

특허 신청 가능

사적 이용 가능

2 라이선스

보증책임 없음

BSD

License

제약조건:

라이선스 저작권 명시

상업적 이용 가능

배포 가능

수정 가능

사적 이용 가능

2 라이선스

보증책임 없음

MPL v2.0

(Mozilla Public License)

제약조건:

수정한 소스코드 MPL 공개(단순 활용시 공개 의무 없음)

라이선스 저작권 명시

특허기술이 구현된 프로그램의 경우 관련 사실을 ‘LEGAL’파일에 기록하여 배포

상업적 이용 가능

배포 가능

수정 가능

특허 신청 가능

사적 이용 가능

2 라이선스

 

 

 

2020/12/24 - [OS/Mac OS X] - MacBook을 AP로 설정하는 방법

2020/12/18 - [Arduino] - Bit Rate, Baud Rate

2020/12/18 - [Arduino] - RS232 Serial 통신 불량체크

2020/12/17 - [프로그래밍/Java] - Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

2020/12/17 - [OS/Mac OS X] - OpenSSL을 이용한 Key 정보 Text 변환

2020/12/17 - [프로그래밍/Java] - RSA 암복호화

2020/12/17 - [iOS/Tips] - URL query 파싱 및 json string 변환

2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

 

반응형
블로그 이미지

SKY STORY

,
반응형
반응형
블로그 이미지

SKY STORY

,

Bit Rate, Baud Rate

IOT/Arduino 2020. 12. 18. 13:51
반응형

Bit Rate, Baud Rate

 

1. Bit Rate의 정의 

 

비트 레이트(Bit Rate)는 초당 얼마나 많은 데이터 비트(1 또는 0)를 전송할 수 있는가를 나타내는 말. 

자주 쓰는 BPS(Bit Per Second)는 초당 보낼 수 있는 비트의 수를 나타낸다. 

 

이는 모뎀의 전송 속도를 측정하는 단위로 사용됐다. 

일반적으로 28,800 모뎀이라면 28,800bps의 전송 속도를 나타내는 것이다. 

 

ex) 2400bit/second(bps) 라면 초당 2400개의 비트 정보를 전달할 수 있다는 뜻이다. 

이는 반대로 이야기하면 비트 정보를 보내기 위해서 416.6us의 시간(1s/2400bit)이 필요하다는 뜻이다. 

 

2. Baud(보오) Rate의 정의 

 

보 레이트(Baud Rate)는 초당 얼마나 많은 심볼(Symbol, 의미 있는 데이터 묶음)을 전송할 수 있는가를 나타내는 말. 

이는 이론적인 통신 단위로 초당 신호(Signal) 요소의 수를 나타낸다. 

 

만약 하나의 신호 요소가 2bit로 구성되어 있는 경우라면 Baud는 BPS의 반이 된다. 

즉, 1 Baud 동안 2 Bit가 전송된다. 

일반적으로 신호를 1 Bit로 여긴다면 BPS와 같은 단위가 된다. 

 

Symbol 이란 의미 있는 데이터 비트의 묶음이다.  

시리얼 통신에서는 Data bit가 8-bit를 사용하므로 이를 하나의 심볼이라고 이야기할 수 있다. 

 

1개의 symbol(또는 character)는 8개의 bit 정보와 같다. 

 

ex) 2400 baud rate를 갖는다는 말은 1초에 2400개의 의미 있는 심볼, 즉 캐릭터를 송신할 수 있다는 이야기다. 

1초에 2400개의 ASCII 코드를 전송할 수 있다는 말과 동일하다. 

 

3. Bit Rate와 Baud Rate의 차이점 

 

시리얼 통신 시, ASCII Code를 사용하여 통신을 할 때, 9600bps의 통신 속도는 1200 Baud로 표현할 수 있다. 

이는 9600bit/8bit 로서 1200의 character로 표현된다. 

그러나, Baud는 상대적인 개념이다. 

만약, Character를 사용하지 않고 일반적인 bit가 정보의 기본단위라면 bit rate는 baud rate와 같아진다. 

ASCII Code 아니라 bit 정보로 받아들인다면 9600bps 9600 Baud 표현될  있다.

 

원문 :
m.blog.naver.com/gmqgufrn/220862079486

 

2020/12/18 - [Arduino] - Bit Rate, Baud Rate

2020/12/18 - [Arduino] - RS232 Serial 통신 불량체크

2020/12/17 - [프로그래밍/Java] - Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

2020/12/17 - [OS/Mac OS X] - OpenSSL을 이용한 Key 정보 Text 변환

2020/12/17 - [프로그래밍/Java] - RSA 암복호화

2020/12/17 - [iOS/Tips] - URL query 파싱 및 json string 변환

2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

 

반응형

'IOT > Arduino' 카테고리의 다른 글

RS232 Serial 통신 불량체크  (0) 2020.12.18
블로그 이미지

SKY STORY

,
반응형

시리얼 통신을 하기 전에 해당 케이블 이상유무를 확인해야한다.

방법은 TX, RX를 연결해 주면, 내가 보낸 시리얼 통신 데이터가 TX에서

RX로 되돌아와 에코 처리된다.

아래 그림에서 2번(TX)과 3번(RX)를 연결하여 테스트가 가능하다.

 

각 핀의 명칭 및 기능은 다음 표와 같다.

pin# 방향 명칭 설명
1 Input CD Carrier Detect: 핀이 논리 0 되므로써 장치가 보낸 데이터를 상대방 장치가  받았음을 있게 된다.
2 Input RxD Received Data: 데이터를 받는
3 Output TxD Transmitted Data: 데이터를 전송하는 . 장치가 대기 상태에 있을때는 논리 1 출력된다.
4 Output DTR Data Terminal Ready:  핀에 논리 0 출력함으로써 상대방 장치에게 데이터를 보낼 준비가 되었음을 알린다.
5
GND Signal Ground: 접지
6 Input DSR Data Set Ready:  핀이 논리 0 되므로써 상대방 장치가 데이터를 보낼 준비가 되었음을 알게된다.
7 Output RTS Request To Send: 핀에 논리 0 출력함으로써 상대방 장치에게 데이터를 받을 준비가 되었음을 알린다.
8 Input CTS Clear To Send: 핀이 논리 0 되므로써 상대방 장치가 데이터를 수신할 준비가 되었음을 알게된다.
9 Input RI Ring Indicator: 핀이 논리 0 되면 모뎀에 통신연결 요구가 들어왔음을 있다.

 

2020/12/17 - [프로그래밍/Java] - Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

2020/12/17 - [OS/Mac OS X] - OpenSSL을 이용한 Key 정보 Text 변환

2020/12/17 - [프로그래밍/Java] - RSA 암복호화

2020/12/17 - [iOS/Tips] - URL query 파싱 및 json string 변환

2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

반응형

'IOT > Arduino' 카테고리의 다른 글

Bit Rate, Baud Rate  (0) 2020.12.18
블로그 이미지

SKY STORY

,
반응형

다음과 같은 경고메시지 출력 안되도록 설정하는 방법은 다음과 같다.

Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

 

‘Preferences…’ 선택

 

‘Aync Stack Traces’ 선택

 

‘Instrumenting agent (requires debugger restart)’ 체크 없앰 

 

반응형

'개발 > Note' 카테고리의 다른 글

라이선스 종류  (0) 2020.12.24
MacBook을 AP로 설정하는 방법  (0) 2020.12.24
OpenSSL을 이용한 Key 정보 Text 변환  (0) 2020.12.17
RSA 암복호화  (0) 2020.12.17
Code 128 Barcode의 Check Digit 계산방법  (0) 2020.12.16
블로그 이미지

SKY STORY

,
반응형

rsa공개키 생성후 파일로 전달하므로 파일을 변환하여 공개/개인 키 구하는 방법을 알아보자.

 

openssl rsa -text -in public.key -inform DER -pubin

(base) netcanis@netcanis-MacBook-Pro KeyPair % openssl rsa -text -in public.key -inform DER -pubin
RSA Public-Key: (1024 bit)
Modulus:
    00:9f:41:52:c2:d0:82:17:18:29:6e:17:3a:ac:a2:
    1a:8c:de:17:5c:89:c1:15:18:78:90:88:53:03:92:
    7e:36:ab:83:26:7d:f5:4b:37:8e:2e:d9:f3:d9:7e:
    e1:b9:0b:fd:99:c9:f4:67:06:c0:df:9f:29:51:2f:
    2b:40:0b:9d:32:4c:47:38:02:f7:6c:d9:d1:72:b1:
    cb:f1:11:90:18:ca:28:dc:00:e3:f8:ce:a9:f9:b7:
    5b:d1:62:ae:5b:06:f8:b2:40:93:bb:31:c1:3a:63:
    76:82:65:11:76:67:db:8a:5d:76:2b:b0:42:ed:31:
    24:a1:76:4b:cb:53:ed:a8:7b
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfQVLC0IIXGCluFzqsohqM3hdc
icEVGHiQiFMDkn42q4MmffVLN44u2fPZfuG5C/2ZyfRnBsDfnylRLytAC50yTEc4
Avds2dFyscvxEZAYyijcAOP4zqn5t1vRYq5bBviyQJO7McE6Y3aCZRF2Z9uKXXYr
sELtMSShdkvLU+2oewIDAQAB
-----END PUBLIC KEY-----

 

openssl rsa -text -in private.key -inform DER

(base) netcanis@netcanis-MacBook-Pro KeyPair % openssl rsa -text -in private.key -inform DER
RSA Private-Key: (1024 bit, 2 primes)
modulus:
    00:9f:41:52:c2:d0:82:17:18:29:6e:17:3a:ac:a2:
    1a:8c:de:17:5c:89:c1:15:18:78:90:88:53:03:92:
    7e:36:ab:83:26:7d:f5:4b:37:8e:2e:d9:f3:d9:7e:
    e1:b9:0b:fd:99:c9:f4:67:06:c0:df:9f:29:51:2f:
    2b:40:0b:9d:32:4c:47:38:02:f7:6c:d9:d1:72:b1:
    cb:f1:11:90:18:ca:28:dc:00:e3:f8:ce:a9:f9:b7:
    5b:d1:62:ae:5b:06:f8:b2:40:93:bb:31:c1:3a:63:
    76:82:65:11:76:67:db:8a:5d:76:2b:b0:42:ed:31:
    24:a1:76:4b:cb:53:ed:a8:7b
publicExponent: 65537 (0x10001)
privateExponent:
    25:ca:9a:99:20:61:be:99:3d:3b:a2:c7:89:af:ee:
    1c:ff:97:0b:9e:a4:f3:1c:9b:7f:b0:da:02:3f:01:
    34:77:fe:e7:63:7c:92:1c:dc:e0:c1:57:dc:84:ff:
    8b:aa:0c:c4:31:e8:8d:8a:4c:ba:c4:4a:49:b9:a7:
    c9:ca:f7:c2:57:38:df:0a:95:27:da:42:66:b0:55:
    03:75:61:53:42:57:f6:8d:f5:d5:0c:f4:81:a9:6c:
    ae:37:9f:e1:39:02:69:11:ec:55:67:31:08:0b:b8:
    66:aa:19:6c:e5:f0:87:5a:16:c5:12:98:71:df:84:
    6c:e0:1a:ac:9b:b6:96:01
prime1:
    00:e5:8c:be:c1:67:56:95:fa:6b:39:8e:43:12:5b:
    fd:e1:e6:2f:86:cb:12:87:df:6d:19:d3:a7:a9:6c:
    70:c5:6f:11:92:4a:e8:ee:d1:70:0c:5d:82:ca:6c:
    03:e6:2a:7d:ce:49:9b:fd:39:3b:71:4a:9f:75:89:
    18:a9:95:23:4d
prime2:
    00:b1:9b:07:6b:e5:a4:c2:9e:1f:eb:24:98:c1:7e:
    c2:e1:3a:5c:d7:20:c0:4e:02:24:e1:3f:15:1c:0d:
    e2:78:c9:54:7e:86:54:92:e5:88:05:f8:90:6b:3c:
    c5:be:4f:61:b7:c3:c0:88:69:7d:34:f3:16:78:bc:
    2a:ec:23:06:e7
exponent1:
    00:b4:ff:2c:2d:dd:68:85:6b:65:fe:84:f0:d7:da:
    17:2e:76:cc:c4:b0:fc:94:8c:14:3f:88:07:2c:6c:
    e7:e2:95:38:3a:ac:bc:4c:0a:72:1a:1d:e5:91:ec:
    67:8a:a5:b8:7a:de:c9:93:79:fc:27:d1:5a:38:57:
    f8:4d:46:de:05
exponent2:
    00:aa:75:94:a5:e5:fe:40:1b:eb:9e:8f:bd:5c:d9:
    00:c9:92:6e:50:bb:4a:56:94:90:38:ef:86:9f:2a:
    64:56:71:44:fb:3a:8a:29:82:cb:0e:90:06:6c:26:
    23:d4:07:f4:4d:9f:3f:46:ad:98:52:1d:8d:4f:cb:
    a9:96:81:f7:b9
coefficient:
    0a:6e:ee:7a:01:58:9b:40:32:e0:d1:d7:d3:a1:45:
    c2:3b:60:9b:84:41:26:7d:01:bf:ec:db:bb:c9:5e:
    57:34:ef:e1:62:9b:a5:0b:b2:21:88:63:07:e5:ab:
    1d:9e:cf:f4:83:ed:5f:0c:78:6a:62:34:e8:51:f8:
    85:13:d3:7c
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCfQVLC0IIXGCluFzqsohqM3hdcicEVGHiQiFMDkn42q4MmffVL
N44u2fPZfuG5C/2ZyfRnBsDfnylRLytAC50yTEc4Avds2dFyscvxEZAYyijcAOP4
zqn5t1vRYq5bBviyQJO7McE6Y3aCZRF2Z9uKXXYrsELtMSShdkvLU+2oewIDAQAB
AoGAJcqamSBhvpk9O6LHia/uHP+XC56k8xybf7DaAj8BNHf+52N8khzc4MFX3IT/
i6oMxDHojYpMusRKSbmnycr3wlc43wqVJ9pCZrBVA3VhU0JX9o311Qz0galsrjef
4TkCaRHsVWcxCAu4ZqoZbOXwh1oWxRKYcd+EbOAarJu2lgECQQDljL7BZ1aV+ms5
jkMSW/3h5i+GyxKH320Z06epbHDFbxGSSuju0XAMXYLKbAPmKn3OSZv9OTtxSp91
iRiplSNNAkEAsZsHa+Wkwp4f6ySYwX7C4Tpc1yDATgIk4T8VHA3ieMlUfoZUkuWI
BfiQazzFvk9ht8PAiGl9NPMWeLwq7CMG5wJBALT/LC3daIVrZf6E8NfaFy52zMSw
/JSMFD+IByxs5+KVODqsvEwKchod5ZHsZ4qluHreyZN5/CfRWjhX+E1G3gUCQQCq
dZSl5f5AG+uej71c2QDJkm5Qu0pWlJA474afKmRWcUT7OoopgssOkAZsJiPUB/RN
nz9GrZhSHY1Py6mWgfe5AkAKbu56AVibQDLg0dfToUXCO2CbhEEmfQG/7Nu7yV5X
NO/hYpulC7IhiGMH5asdns/0g+1fDHhqYjToUfiFE9N8
-----END RSA PRIVATE KEY-----

 

2020/12/17 - [Android/Java] - RSA 암복호화

2020/12/17 - [iOS/Tips] - URL query 파싱 및 json string 변환

2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

반응형
블로그 이미지

SKY STORY

,

RSA 암복호화

개발/Note 2020. 12. 17. 16:18
반응형

결제 관련 API 연동(VAN, PG, 간편결제 등) 할 경우 RSA암복호화 과정을 거치게되는데

이 부분에 대한 샘플 코드를 작성해 보았다.

 

Apache Commons Codec 다운로드

commons.apache.org/proper/commons-codec/

 

Codec – Home

Apache Commons Codec Apache Commons Codec (TM) software provides implementations of common encoders and decoders such as Base64, Hex, Phonetic and URLs. Impetus Codec was formed as an attempt to focus development effort on one definitive implementation of

commons.apache.org

 

프로젝트 라이브러리에 추가. 

 

PublicKey와 PrivateKey 파일을 생성

package com.ubpay.keypair;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.PublicKey;

//
// RSA Key 파일 생성
//
// Created by netcanis on 2019/04/29.
// Copyright © 2019 netcanis. All rights reserved.
//

// Download Apache Commons Codec
// https://commons.apache.org/proper/commons-codec/download_codec.cgi

public class GenKeys
{
	private KeyPairGenerator keyGen;
	private KeyPair pair;
	private PrivateKey privateKey;
	private PublicKey publicKey;

	// RSA 초기화 및 키 생성 
	public GenKeys(int keysize) throws NoSuchAlgorithmException, NoSuchProviderException {
		this.keyGen = KeyPairGenerator.getInstance("RSA");
		this.keyGen.initialize(keysize);
		this.pair = this.keyGen.generateKeyPair();
		this.publicKey = pair.getPublic();
		this.privateKey = pair.getPrivate();
	}

	public PublicKey getPublicKey() {
		return this.publicKey;
	}
	
	public PrivateKey getPrivateKey() {
		return this.privateKey;
	}
	
	public void writeToFile(String path, byte[] key) throws IOException {
		File f = new File(path);
		f.getParentFile().mkdirs();

		FileOutputStream fos = new FileOutputStream(f);
		fos.write(key);
		fos.flush();
		fos.close();
	}

	
	
	public static void main(String[] args) {
		GenKeys genKeys;
		try {
			// 1024bit key pair 생성  
			genKeys = new GenKeys(1024);
			
			System.out.println(genKeys.publicKey);
			System.out.println(genKeys.privateKey);
			
			// 바이너리 파일로 저장 
			genKeys.writeToFile("KeyPair/public.key", genKeys.getPublicKey().getEncoded());
			genKeys.writeToFile("KeyPair/private.key", genKeys.getPrivateKey().getEncoded());
			
		} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
			System.err.println(e.getMessage());
		} catch (IOException e) {
			System.err.println(e.getMessage());
		}
	}
}

 

생성 결과

 

생성된 키를 이용하여 암복호화 테스트

package com.ubpay.rsaTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.DSAPrivateKeySpec;
import java.security.spec.DSAPublicKeySpec;
import java.security.spec.EncodedKeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import org.apache.commons.codec.binary.Base64;


//
// RSA 암복호화 및 테스트
//
// Created by netcanis on 2019/04/29.
// Copyright © 2019 netcanis. All rights reserved.
//

public class RSAEncryption
{
	private Cipher cipher;
	
	public RSAEncryption() throws NoSuchAlgorithmException, NoSuchPaddingException{
		this.cipher = Cipher.getInstance("RSA");
	}
	
	// 주어진 파일을 byte array로 읽기 
	public byte[] getFileInBytes(File f) throws IOException{
		FileInputStream fis = new FileInputStream(f);
		byte[] fbytes = new byte[(int) f.length()];
		fis.read(fbytes);
		fis.close();
		return fbytes;
	}
		
	// X509EncodedKey
	public PublicKey getPublic(String filename) throws Exception {
		byte[] keyBytes = Files.readAllBytes(new File(filename).toPath());
		X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
		KeyFactory kf = KeyFactory.getInstance("RSA");
		return kf.generatePublic(spec);
	}

	// PKCS8EncodedKeySpec
	public PrivateKey getPrivate(String filename) throws Exception {
		byte[] keyBytes = Files.readAllBytes(new File(filename).toPath());
		
		//byte[] decoded = Base64.getDecoder().decode(keyBytes);
		//println(new String(decoded));    // Outputs "Hello"
		
		//Base64 codec = new Base64();
		//byte[] decoded = codec.decode(keyBytes);
		//System.out.println( new String(decoded) );    // Outputs "Hello"
		
		PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory kf = KeyFactory.getInstance("RSA");
		return kf.generatePrivate(spec);
	}
	
	// public key로 암호화 
	public String encrypt(String str, PublicKey key) throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException{
		this.cipher.init(Cipher.ENCRYPT_MODE, key);
		return Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
	}
	
	// private key로 복호화 
	public String decrypt(String str, PrivateKey key) throws InvalidKeyException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException{
		this.cipher.init(Cipher.DECRYPT_MODE, key);
		return new String(cipher.doFinal(Base64.decodeBase64(str)), "UTF-8");
	}

	// hex to byte[]
	public byte[] hexStringToByteArray(String s) {
	    int len = s.length();
	    byte[] data = new byte[len / 2];
	    for (int i = 0; i < len; i += 2) {
	        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
	                             + Character.digit(s.charAt(i+1), 16));
	    }
	    return data;
	}
	
	// byte[] to hex
	public String byteArrayToHexString(byte[] bytes){ 
		StringBuilder sb = new StringBuilder(); 
		for(byte b : bytes){ 
			sb.append(String.format("%02X", b&0xff)); 
		} 
		return sb.toString(); 
	} 

	
    
	public static void main(String[] args) throws Exception {
		RSAEncryption ac = new RSAEncryption();
		
		// 공개키
		PublicKey publicKey = ac.getPublic("KeyPair/public.key");
		// 개인키 
		PrivateKey privateKey = ac.getPrivate("KeyPair/private.key");
		
		// 원문 
		String msg = "test message";
		
		
		System.out.println("----------------------------------------------------");
		System.out.println(":::: TEST 암호화 및 복호화 ::::");
		
		// 암호화 원문 BASE64
		String encryptedString = ac.encrypt(msg, publicKey);
		// 복호화
		String decryptedString = ac.decrypt(encryptedString, privateKey);
		
		System.out.println("----------------------------------------------------");
		System.out.println(
				"원문 = " + msg + "\n" +
				"공개키 암호화 = " + encryptedString + "\n" +
				"개인키 복호화 = " + decryptedString
				);
		System.out.println("----------------------------------------------------");
	}
}




결과 :
--------------------------------------------------------------------------
:::: TEST 암호화 및 복호화 ::::
--------------------------------------------------------------------------
원문 = test message
공개키 암호화 = gz2WQHCyHxsPV5IB0xehk8RSbGrhGR86nQRGj09CphxiIAjRsCony8myWfRGJgDVyK6ixuK13gtL/20j4K5c1GcCKxPT9xqYaa6tBxTakho9klHNAO6KhQJK0nGeIQRDpZ1qecB6pPMsRqVVO5rb81NFqbjLKMoqi2tO1f55/iM=
개인키 복호화 = test message
--------------------------------------------------------------------------

 

2020/12/17 - [OS/Mac OS X] - OpenSSL을 이용한 Key 정보 Text 변환

2020/12/17 - [iOS/Tips] - URL query 파싱 및 json string 변환

2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

 

반응형
블로그 이미지

SKY STORY

,
반응형
// 사용 방법
let url = URL(string:"https://www.test.com/myconmand?param1=ASDF&param2=1234")!
let qParams = url.queryParams().toJsonString()
let param2 = url.valueOf("param2")

print(
    """
    scheme      = \(url.scheme ?? "")
    host        = \(url.host ?? "")
    path        = \(url.path)
    query       = \(url.query ?? "")
    qParams     = \(qParams)
    param2      = \(param2 ?? "")
    """
)

// 결과 
scheme      = https
host        = www.test.com
path        = /myconmand
query       = param1=ASDF&param2=1234
qParams     = {"param1":"ASDF","param2":"1234"}
param2      = 1234
extension URL {
    
    func queryParams() -> [String:Any] {
        let queryItems = URLComponents(url: self, resolvingAgainstBaseURL: false)?.queryItems
        let queryTuples: [(String, Any)] = queryItems?.compactMap{
            guard let value = $0.value else { return nil }
            return ($0.name, value)
        } ?? []
        return Dictionary(uniqueKeysWithValues: queryTuples)
    }
    
    func valueOf(_ queryParamaterName: String) -> String? {
        guard let url = URLComponents(string: self.absoluteString) else { return nil }
        return url.queryItems?.first(where: { $0.name == queryParamaterName })?.value
    }
    
}
extension Dictionary {

    func toJsonData() -> Data {
        var jsonData: Data?
        do {
            jsonData = try JSONSerialization.data(withJSONObject: self, options: .init(rawValue: 0))
        } catch {
            print(error)
        }
        return jsonData!
    }

    func toJsonDataPrettyPrinted() -> Data {
        var jsonData: Data?
        do {
            jsonData = try JSONSerialization.data(withJSONObject: self, options: JSONSerialization.WritingOptions.prettyPrinted)
        } catch {
            print(error)
        }
        return jsonData!
    }
    
    func toJsonString() -> String {
        return toJsonData().toString()
    }
    
    func toPrettyPrintedJsonString() -> String {
        return toJsonDataPrettyPrinted().toString()
    }
    
}
extension Data {
    func hexString() -> String {
        return map { String(format: "%02hhx", $0) }.joined()
    }
    
    func toString() -> String {
        return String(data: self, encoding: String.Encoding.utf8)!
    }
}

 

2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법 

반응형

'개발 > iOS' 카테고리의 다른 글

SceneDelegate 포인터 구하기  (0) 2021.01.05
앱 호출 (URL scheme)  (0) 2021.01.05
디버깅 차단 처리 (Anti Debug)  (0) 2020.12.15
bundle id 알아내기  (0) 2020.12.14
UIViewController 스위칭  (0) 2020.12.11
블로그 이미지

SKY STORY

,
반응형

일반적으로 많이 사용되는 Code 128 바코드 체크비트 내용에 대해 알아보자.

CODE 128은 전체 ASCII 128 문자를 모두 표현할 수 있는 연속형 심벌로지이며, 수치 데이터는 심벌 문자당 두 자리로 표현한다. 1981년 Computer Identics Corp. 사에서 개발한 CODE 128은 현재 UPCSKS EAN등 데이터의 고밀도 표현을 요하는 여러 분야에서 응용, 사용되고 있다. CODE 12I9은 시작과 끝 문자, 변동 가능한 길이의 데이터, 바와 스페이스 두 개 모두에 대한 캐릭터 패리티, 체크 문자, 함수 문자 등으로 구성되어 있으며 인쇄가 보다 용이하며 현재 사용되고 있는 각종 컴퓨터, 프린터에 적당하다. 

CODE 128의 심벌 구조는 좌우측 여백으로 인쇄돼지 않는 영역이 있고, 바코드화된 캐릭터의 연속은 단일한 시작 문자로 시작된다. 바로 옆에 가장 중요한 Most Significant가 오고 체크 문자 그리고 단일한 끝 문자가 온다.

CODE 128의 캐릭터 요소는 8개로 구성되며 각 요소들은 바 또는 바의 부분으로 이루어지면 각 캐릭터는 세 개의 바와 스페이스로 이루어진다. 각각의 바는 짝수 모듈(짝수 패리티)이고 스페이스는 홀수 모듈(홀수 패리티)로 이루어진다. 각 요소들의 폭은 1X, 2X, 3X, 4X의 네 가지로 바의 모듈은 '1'로, 여백의 모듈은 '0'으로 표시된다. 시작 문자는 세 종류의 문자 패턴(A, B, C)이 있으며 끝 문자는 네 개의 바와 세 개의 스페이스, 여기에 두 개의 모듈과 종료 바(2)가 합쳐져 13개의 모듈(13X)로 구성된다. 

CODE 128의 코드 구조는 A, B, C  가지 문자 집합이 있는데 심벌 시작문자가 A로 시작되면 코드 A의 집합으로 정의된다. 심벌의 중간에 전이 문자(shift character)를 사용해 다른 문자 집합으로 옮길 수 있다. 문자 집합 A는 모든 alphanumeric 문자의 특수 문자, 컨트롤 문자를 포함하며 문자 집합 B는 모든 alphanumeric 문자와 특수 문자, 컨트롤 문자를 포함하는데 alphanumeric 문자들의 낮은 경우가 포함된다. 문자 집합 C는 00에서 99까지의 디지트쌍 100개와 특수 문자를 갖는데 문자마다 두 자리를 수치로 표현하므로 데이터의 밀도가 두 배이다. CODE 128에는 문자 집합 선택 문자(A, B, C), 전이 문자, 기능 문자가 모두 특수 문자로 존재하며, 한 개의 심벌 안에서 또는 한 개의 코드 부분 집합에서 다른 코드의 부분 집합으로 변화가 가능하다. 

Code 128 3개의 각각 폭이 다른 검은 바와 흰 바가 조합되어 문자를 표시하는 1차원 바코드. 1981년 컴퓨터 아 이덴틱스사가 개발하였다. 문자 1개는 11 모듈로 구성되어있다. 모든 ASCII 문자를 지원하며 128∼255 범위의 문자도 입력 가능하다.7) Code 128 심벌 폭의 최소화를 위해 동일한 문자를 서로 다른 코드 세 트(코드 세트 A, B, C)의 조합을 통하여 표현하는 알고리즘을 가지고 있다. 심벌의 길이는 정해져 있지 않지만 판독기의 용량을 감안하면 최대 약 48개 문자로 된 데이터를 저장할 수 있다.

참고 원문 :
https://en.wikipedia.org/wiki/Code_128

https://courses.cs.washington.edu/courses/cse370/01au/minirproject/ModusPeons/index.htm

https://www.adams1.com/128code.html

https://www.adams1.com/128table.html

 

Code 128 Structure

 

 

  • Left Quiet Zone
  • Start character 
  • Data characters: any length
  • Checksum: one checksum in modulo 103
  • Stop character 
  • Termination bar
  • Right Quiet Zone

In ISO/IEC 15417 specification, the quiet zone should be at least ten times the width of the narrowest bar/space element. It is mandatory at the left and right side of the barcode.

 

Code 128 Encodable Character Set

  • Code 128 A (Code Set A): 0-9, A-Z, and special characters
  • Code 128 B (Code Set B): 0-9, A-Z, a-z, and special characters
  • Code 128 C (Code Set C): numeric digit pairs 00-99 and three special characters

 

Code 128 Barcode Table Of Characters
(For the complete Code 128 specification, see the Code 128 Page)

The table below shows the three different character sets along with the decimal values of each character, which is used in calculating the Check Character. The final column shows the bar/space pattern for the character. The numbers indicate the number of modules wide the given space or bar is. To get the extended ASCII decimal, add 32 to the decimal value in the first column. There is a nice extended ASCII table here. Please note that Code 128 can only encode the English alphabet.

Value

Code A

Code B

Code C

Pattern

B S B S B S

What ASCII Code Do I Print?

0

SP

SP

00

2 1 2 2 2 2

SP (ASCII 32)

1

!

!

01

2 2 2 1 2 2

! (ASCII 33)

2

"

"

02

2 2 2 2 2 1

" (ASCII 34)

3

#

#

03

1 2 1 2 2 3

# (ASCII 35)

4

$

$

04

1 2 1 3 2 2

$ (ASCII 36)

5

%

%

05

1 3 1 2 2 2

% (ASCII 37)

6

&

&

06

1 2 2 2 1 3

& (ASCII 38)

7

'

'

07

1 2 2 3 1 2

' (ASCII 39)

8

(

(

08

1 3 2 2 1 2

( (ASCII 40)

9

)

)

09

2 2 1 2 1 3

) (ASCII 41)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

10

*

*

10

2 2 1 3 1 2

* (ASCII 42)

11

+

+

11

2 3 1 2 1 2

+ (ASCII 43)

12

,

,

12

1 1 2 2 3 2

, (ASCII 44)

13

-

-

13

1 2 2 1 3 2

- (ASCII 45)

14

.

.

14

1 2 2 2 3 1

. (ASCII 46)

15

/

/

15

1 1 3 2 2 2

/ (ASCII 47)

16

0

0

16

1 2 3 1 2 2

0 (ASCII 48)

17

1

1

17

1 2 3 2 2 1

1(ASCII 49)

18

2

2

18

2 2 3 2 1 1

2 (ASCII 50)

19

3

3

19

2 2 1 1 3 2

3 (ASCII 51)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

20

4

4

20

2 2 1 2 3 1

4 (ASCII 52)

21

5

5

21

2 1 3 2 1 2

5 (ASCII 53)

22

6

6

22

2 2 3 1 1 2

6 (ASCII 54)

23

7

7

23

3 1 2 1 3 1

7 (ASCII 55)

24

8

8

24

3 1 1 2 2 2

8 (ASCII 56)

25

9

9

25

3 2 1 1 2 2

9 (ASCII 57)

26

:

:

26

3 2 1 2 2 1

: (ASCII 58)

27

;

;

27

3 1 2 2 1 2

; (ASCII 59)

28

<

<

28

3 2 2 1 1 2

< (ASCII 60)

29

=

=

29

3 2 2 2 1 1

= (ASCII 61)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

30

>

>

30

2 1 2 1 2 3

> (ASCII 62)

31

?

?

31

2 1 2 3 2 1

? (ASCII 63)

32

@

@

32

2 3 2 1 2 1

@ (ASCII 64)

33

A

A

33

1 1 1 3 2 3

A (ASCII 65)

34

B

B

34

1 3 1 1 2 3

B (ASCII 66)

35

C

C

35

1 3 1 3 2 1

C (ASCII 67)

36

D

D

36

1 1 2 3 1 3

D (ASCII 68)

37

E

E

37

1 3 2 1 1 3

E (ASCII 69)

38

F

F

38

1 3 2 3 1 1

F (ASCII 70)

39

G

G

39

2 1 1 3 1 3

G (ASCII 71)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

40

H

H

40

2 3 1 1 1 3

H (ASCII 72)

41

I

I

41

2 3 1 3 1 1

I (ASCII 73)

42

J

J

42

1 1 2 1 3 3

J (ASCII 74)

43

K

K

43

1 1 2 3 3 1

K (ASCII 75)

44

L

L

44

1 3 2 1 3 1

L (ASCII 76)

45

M

M

45

1 1 3 1 2 3

M (ASCII 77)

46

N

N

46

1 1 3 3 2 1

N (ASCII 78)

47

O

O

47

1 3 3 1 2 1

O (ASCII 79)

48

P

P

48

3 1 3 1 2 1

P (ASCII 80)

49

Q

Q

49

2 1 1 3 3 1

Q (ASCII 81)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

50

R

R

50

2 3 1 1 3 1

R (ASCII 82)

51

S

S

51

2 1 3 1 1 3

S (ASCII 83)

52

T

T

52

2 1 3 3 1 1

T (ASCII 84)

53

U

U

53

2 1 3 1 3 1

U (ASCII 85)

54

V

V

54

3 1 1 1 2 3

V (ASCII 86)

55

W

W

55

3 1 1 3 2 1

W (ASCII 87)

56

X

X

56

3 3 1 1 2 1

X (ASCII 88)

57

Y

Y

57

3 1 2 1 1 3

Y (ASCII 89)

58

Z

Z

58

3 1 2 3 1 1

Z (ASCII 90)

59

[

[

59

3 3 2 1 1 1

[ (ASCII 91)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

60

\

\

60

3 1 4 1 1 1

\ (ASCII 92)

61

]

]

61

2 2 1 4 1 1

] (ASCII 93)

62

^

^

62

4 3 1 1 1 1

^ (ASCII 94)

63

_

_

63

1 1 1 2 2 4

_ (ASCII 95)

64

NUL

'

64

1 1 1 4 2 2

` (ASCII 96)

65

SOH

a

65

1 2 1 1 2 4

a (ASCII 97)

66

STX

b

66

1 2 1 4 2 1

b (ASCII 98)

67

ETX

c

67

1 4 1 1 2 2

c (ASCII 99)

68

EOT

d

68

1 4 1 2 2 1

d (ASCII 100)

69

ENQ

e

69

1 1 2 2 1 4

e (ASCII 101)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

70

ACK

f

70

1 1 2 4 1 2

f (ASCII 102)

71

BEL

g

71

1 2 2 1 1 4

g (ASCII 103)

72

BS

h

72

1 2 2 4 1 1

h (ASCII 104)

73

HT

i

73

1 4 2 1 1 2

i (ASCII 105)

74

LF

j

74

1 4 2 2 1 1

j (ASCII 106)

75

VT

k

75

2 4 1 2 1 1

k (ASCII 107)

76

FF

l

76

2 2 1 1 1 4

l (ASCII 108)

77

CR

m

77

4 1 3 1 1 1

m (ASCII 109)

78

SO

n

78

2 4 1 1 1 2

n (ASCII 110)

79

SI

o

79

1 3 4 1 1 1

o (ASCII 111)

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

80

DLE

p

80

1 1 1 2 4 2

p (ASCII 112)

81

DC1

q

81

1 2 1 1 4 2

q (ASCII 113)

82

DC2

r

82

1 2 1 2 4 1

r (ASCII 114)

83

DC3

s

83

1 1 4 2 1 2

s (ASCII 115)

84

DC4

t

84

1 2 4 1 1 2

t (ASCII 116)

85

NAK

u

85

1 2 4 2 1 1

u (ASCII 117)

86

SYN

v

86

4 1 1 2 1 2

v (ASCII 118)

87

ETB

w

87

4 2 1 1 1 2

w (ASCII 119)

88

CAN

x

88

4 2 1 2 1 1

x (ASCII 120)

89

EM

y

89

2 1 2 1 4 1

y (ASCII 121

Value

Code A

Code B

Code C

Pattern

B S B S B S

 

90

SUB

z

90

2 1 4 1 2 1

z (ASCII 122)

91

ESC

{

91

4 1 2 1 2 1

{ (ASCII 123)

92

FS

|

92

1 1 1 1 4 3

| (ASCII 124)

93

GS

}

93

1 1 1 3 4 1

} (ASCII 125)

94

RS

~

94

1 3 1 1 4 1

~ (ASCII 126)

95 (Hex 7F)

US

DEL

95

1 1 4 1 1 3

DEL (ASCII 127)

96 (Hex 80)

FNC 3

FNC 3

96

1 1 4 3 1 1

Ç (ASCII 128)

97 (Hex 81)

FNC 2

FNC 2

97

4 1 1 1 1 3

ü (ASCII 129)

98 (Hex 82)

SHIFT

SHIFT

98

4 1 1 3 1 1

é (ASCII 130)

99 (Hex 83)

CODE C

CODE C

99

1 1 3 1 4 1

â (ASCII 131)

100 (Hex 84)

CODE B

FNC 4

CODE B

1 1 4 1 3 1

ä (ASCII 132)

101 (Hex 85)

FNC 4

CODE A

CODE A

3 1 1 1 4 1

à (ASCII 133)

102 (Hex 86)

FNC 1

FNC 1

FNC 1

4 1 1 1 3 1

å (ASCII 134)

 

Value

Start Code

Pattern

B S B S B S

What ASCII Code Do I Print?

103 (Hex 87)

START (Code A)

2 1 1 4 1 2

‡ (ASCII 135)

104 (Hex 88)

START (Code B)

2 1 1 2 1 4

ˆ (ASCII 136)

105 (Hex 89)

START (Code C)

2 1 1 2 3 2

‰ (ASCII 137)

106 (Hex 6A)

STOP (All Codes)

2 3 3 1 1 1 2

Š (ASCII 138)

 

 

Check Digit 계산 방법

ex) "BarCode 1" 에 대한 Code 128 Check Digit계산방법.
시작 코드셋이 START B일 경우 (START A:103, START B: 104, START C: 105)

START B = 104
B = 66 - 32 = 34
a = 97 - 32 = 65
r = 114 - 32 = 82
C = 67 - 32 = 35
o = 111 - 32 = 79
d = 100 - 32 = 68
e = 101 - 32 = 69
   = 32 - 32 = 0
1  = 49 - 32 = 17

// 아래와 같이 자리수 별로 곱을한 값들을 모두 더하고 시작 코드셋 값으로 나눈 나머지 값이 Check Digit이 된다.
Total = 104 + (34x1) + (65x2) + (82x3) + (35x4) + (79x5) + (68x6) + (69x7) + (0x8) + (17x9) = 2093
Check Digit = 2093 mod 104 = 33(A)
                   = 33 + 32 = 65 = 'A' // 최종 출력 값은 32를 더한 값인 65('A')를 출력.

Final message : (START B)BarCode 1(A)(STOP)

 

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

 

 

반응형

'개발 > Note' 카테고리의 다른 글

OpenSSL을 이용한 Key 정보 Text 변환  (0) 2020.12.17
RSA 암복호화  (0) 2020.12.17
PlantUML 설치 (Mac OS X)  (0) 2020.12.11
특수문자 발음  (0) 2020.12.11
Bluetooth UUID  (0) 2020.12.10
블로그 이미지

SKY STORY

,
반응형

스마트폰 BTC 채굴앱

https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site

 

앱 실행 시 디버깅 정보 접근 차단 처리

아래 클래스는 Objective-C, C 언어로 작성되었고

Swift 프로젝트에 사용되었습니다.

Release 빌드시에만 적용되도록 처리하였습니다. 

//
//  AntiDebug.h
//
//  Created by netcanis on 2020/05/22.
//  Copyright © 2020 netcanis. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface AntiDebug : NSObject

+ (BOOL)run;

@end

NS_ASSUME_NONNULL_END

 

//
//  AntiDebug.m
//
//  Created by netcanis on 2020/05/22.
//  Copyright © 2020 netcanis. All rights reserved.
//

#import "AntiDebug.h"
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>


////////////////////////////////////////////////////////////////////////
// 배포시 자동으로 안티디버깅 활성화 - 0:디버깅 연결, 1:디버깅 차단
#ifdef DEBUG
#define ANTI_DEBUG      (0) // 개발시 - 디버깅
#else
#define ANTI_DEBUG      (1) // 배포시 - 디버깅 차단
#endif//DEBUG
////////////////////////////////////////////////////////////////////////


//
// Anti Debug 처리
//

#if ANTI_DEBUG

// For debugger_ptrace.
// Ref: https://www.theiphonewiki.com/wiki/Bugging_Debuggers
#import <dlfcn.h>
#import <sys/types.h>

// For debugger_sysctl
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>
#include <stdlib.h>

// For ioctl
#include <termios.h>
#include <sys/ioctl.h>

// For task_get_exception_ports
#include <mach/task.h>
#include <mach/mach_init.h>

// For kdebug_signpost
#import <sys/kdebug_signpost.h>

typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);

#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif  // !defined(PT_DENY_ATTACH)

/*!
 @brief This is the basic ptrace functionality.
 @link http://www.coredump.gr/articles/ios-anti-debugging-protections-part-1/
 */
void debugger_ptrace()
{
    void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
    ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
    ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
    dlclose(handle);
}

/*!
 @brief This function uses sysctl to check for attached debuggers.
 @link https://developer.apple.com/library/mac/qa/qa1361/_index.html
 @link http://www.coredump.gr/articles/ios-anti-debugging-protections-part-2/
 */
static bool debugger_sysctl(void)
// Returns true if the current process is being debugged (either
// running under the debugger or has a debugger attached post facto).
{
    int mib[4];
    struct kinfo_proc info;
    size_t info_size = sizeof(info);
    
    // Initialize the flags so that, if sysctl fails for some bizarre
    // reason, we get a predictable result.
    
    info.kp_proc.p_flag = 0;
    
    // Initialize mib, which tells sysctl the info we want, in this case
    // we're looking for information about a specific process ID.
    
    mib[0] = CTL_KERN;
    mib[1] = KERN_PROC;
    mib[2] = KERN_PROC_PID;
    mib[3] = getpid();
    
    // Call sysctl.
    
    if (sysctl(mib, 4, &info, &info_size, NULL, 0) == -1)
    {
        perror("perror sysctl");
        exit(-1);
    }
    
    // We're being debugged if the P_TRACED flag is set.
    
    return ((info.kp_proc.p_flag & P_TRACED) != 0);
}

static bool antiDebug(void)
{
//    // Determine if iOS device is 32- or 64-bit
//    if (sizeof(void*) == 4) {
//        NSLog(@"32-bit App");
//    } else if (sizeof(void*) == 8) {
//        NSLog(@"64-bit App");
//    }
    
    
    // If enabled the program should exit with code 055 in GDB
    // Program exited with code 055.
    debugger_ptrace();
    NSLog(@"Bypassed ptrace()");
    
    // If enabled the program should exit with code 0377 in GDB
    // Program exited with code 0377.
    if (debugger_sysctl())
    {
        //return -1;
        return NO;
    } else {
        NSLog(@"Bypassed sysctl()");
    }
    
    // Another way of calling ptrace.
    // Ref: https://www.theiphonewiki.com/wiki/Kernel_Syscalls
    #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0
    // 'syscall' is deprecated: first deprecated in iOS 10.0 - syscall(2) is unsupported;
    // please switch to a supported interface.
    // For SYS_kdebug_trace use kdebug_signpost().
    syscall(26, 31, 0, 0);
    NSLog(@"Bypassed syscall()");
    #endif
    
    // Ref: https://reverse.put.as/wp-content/uploads/2012/07/Secuinside-2012-Presentation.pdf
    struct ios_execp_info
    {
        exception_mask_t masks[EXC_TYPES_COUNT];
        mach_port_t ports[EXC_TYPES_COUNT];
        exception_behavior_t behaviors[EXC_TYPES_COUNT];
        thread_state_flavor_t flavors[EXC_TYPES_COUNT];
        mach_msg_type_number_t count;
    };
    struct ios_execp_info *info = malloc(sizeof(struct ios_execp_info));
    kern_return_t kr = task_get_exception_ports(mach_task_self(), EXC_MASK_ALL, info->masks, &info->count, info->ports, info->behaviors, info->flavors);
    NSLog(@"Routine task_get_exception_ports : %d", kr);
    
    for (int i = 0; i < info->count; i++)
    {
        if (info->ports[i] !=0 || info->flavors[i] == THREAD_STATE_NONE)
        {
            NSLog(@"Being debugged... task_get_exception_ports");
        } else {
            NSLog(@"task_get_exception_ports bypassed");
        }
    }
    
    // Another way of figuring out if LLDB is attached.
    if (isatty(1)) {
        NSLog(@"Being Debugged isatty");
    } else {
        NSLog(@"isatty() bypassed");
    }
    
    // Yet another way of figuring out if LLDB is attached.
    if (!ioctl(1, TIOCGWINSZ)) {
        NSLog(@"Being Debugged ioctl");
    } else {
        NSLog(@"ioctl bypassed");
    }
    
    // Everything above relies on libraries. It is easy enough to hook these libraries and return the required
    // result to bypass those checks. So here it is implemented in ARM assembly. Not very fun to bypass these.
#ifdef __arm__
    asm volatile (
                  "mov r0, #31\n"
                  "mov r1, #0\n"
                  "mov r2, #0\n"
                  "mov r12, #26\n"
                  "svc #80\n"
                  );
    NSLog(@"Bypassed syscall() ASM");
#endif
#ifdef __arm64__
    asm volatile (
                  "mov x0, #26\n"
                  "mov x1, #31\n"
                  "mov x2, #0\n"
                  "mov x3, #0\n"
                  "mov x16, #0\n"
                  "svc #128\n"
                  );
    NSLog(@"Bypassed syscall() ASM64");
#endif
    
    return YES;
}
#endif//ANTI_DEBUG


@implementation AntiDebug

+ (BOOL)run {
#if ANTI_DEBUG
    return antiDebug();
#endif
    return YES;
}

@end

 

//
//  XXX-Bridging-Header.h
//
//  Created by netcanis on 2019/11/25.
//  Copyright © 2019 netcanis. All rights reserved.
//

#ifndef XXX_Bridging_Header_h
#define XXX_Bridging_Header_h

#import "AntiDebug.h"

#endif /* XXX_Bridging_Header_h */

 

//
//  AppDelegate.swift
//
//  Created by netcanis on 2019/11/25.
//  Copyright © 2019 netcanis. All rights reserved.
//

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        guard AntiDebug.run() else {
            return false
        }
        
		... 생략 ...
    
        return true
    }

 

스마트폰 BTC 채굴앱

https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site

 

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환

2020/08/11 - [iOS/Swift] - WKWebView 화면 출력 완료 이벤트

2020/08/06 - [iOS/Tips] - 개발관련 폴더 경로

2020/07/19 - [Android/Tips] - 안드로이드 원격 디버깅 방법

반응형

'개발 > iOS' 카테고리의 다른 글

앱 호출 (URL scheme)  (0) 2021.01.05
URL query 파싱 및 json string 변환  (0) 2020.12.17
bundle id 알아내기  (0) 2020.12.14
UIViewController 스위칭  (0) 2020.12.11
웹뷰에서 javascript 함수 동기식 호출  (0) 2020.12.10
블로그 이미지

SKY STORY

,

bundle id 알아내기

개발/iOS 2020. 12. 14. 15:15
반응형

스마트폰 BTC 채굴앱
https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site


iOS기기에 설치된 앱의 bundle id를 알아내는 방법을 알아보자.
직접 개발중이라면 당연히 알 수 있지만 앱스토어에서 설치한 앱의 번들아이디를 얻으려면 어떻게 할까.
물론 탈옥되지 않은 폰으로 말이다.

ipa 파일의 번들아이디를 구할 경우 :

- ipa확장자를 zip으로 변경한 뒤 압축을 푼다.
- 디렉토리 내에 XXX.app파일을 선택하고 우클릭하여 'Show Package Contents' 선택

- 폴더 내 'Info.plist'파일을 열어 원하는 정보를 취득한다.
- bundle id에 대한 키는 'CFBundleURLName'이다.

앱스토어에서 설치한 앱의 경우 :

- Console.app 실행

- 기기를 연결하고 앱을 실행한다.
- 좌측 Devices 목록에서 디바이스 선택
- 우측 상단 검색으로 '(bundle)'라고 입력

- 설치된 앱들의 bundle id중 찾고자 한 앱을 찾는다.


스마트폰 BTC 채굴앱
https://get.cryptobrowser.site/34473645

 

Earn coins while browsing the web

Earn bitcoins while watching videos, chatting, or playing online. It has never been so easy to increase your income! Tell your friends about CryptoTab Browser, invite them to join, and earn more together. Grow your network—get more profit!

get.cryptobrowser.site


2020/12/12 - [AI/Algorithm] - 2D 충돌처리
2020/12/11 - [iOS/Swift] - UIViewController 스위칭
2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)
2020/12/11 - [개발노트] - 특수문자 발음
2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)
2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

반응형

'개발 > iOS' 카테고리의 다른 글

URL query 파싱 및 json string 변환  (0) 2020.12.17
디버깅 차단 처리 (Anti Debug)  (0) 2020.12.15
UIViewController 스위칭  (0) 2020.12.11
웹뷰에서 javascript 함수 동기식 호출  (0) 2020.12.10
Fat Static Library 빌드 (2/2)  (0) 2020.12.10
블로그 이미지

SKY STORY

,
반응형

2D 충돌처리

(1) 선과

 -  Line 직선의 방정식을 구함.          
    P = P1 + u(P2 - P1), P' = P3 + v(P4 - P3)

    교차하는 점에선 P == P'이므로,              
    P1 + u(P2 - P1) = P3 + v(P4 - P3)

    각각 x y 대해 정리                          
    x1 + u(x2 - x1) = x3 + v(x4 - x3)
    y1 + u(y2 - y1) = y3 + v(y4 - y3)

    두 식을 이용해, u v 대해 풀어낸다.  
    u = ((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3)) / ((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1))
    v = ((x2-x1)*(y1-y3)-(y2-y1)*(x1-x3)) / ((x2-x1)*(y4-y3)-(x4-x3)*(y2-y1))

    두 선의 각각의 좌표를 이용해 u v 값을 구할 있음.
    이 u v 0이면 수평, 0 < u < 1이고 0 < v < 1이면 교점이 있는 것임. u v 1보다 크면, 만나지 않는 것임.
구한 u v 직선의 방정식에 대입하면교점의 좌표도 구할 있음.

 

(2) 선과 사각형

 - 사각형의 선분에 대해 선과 충돌을 검사.

float inputRotation = MathHelper.ToRadians(degree);
Rectangle destRect = new Rectangle(200, 200, 200, 200);
Vector2 vOrg = new Vector2(1, 0);

vOrg = Vector2.Transform(vOrg, Matrix.CreateRotationZ(inputRotation));
  
BoundingBox box = new BoundingBox(new Vector3(destRect.Left, destRect.Top, 0.0f),
                                  new Vector3(destRect.Right, destRect.Bottom, 0.0f));
Ray ray = new Ray(new Vector3(vStart, 0.0f), new Vector3(vOrg, 0.0f));

float? result = box.Intersects(ray);

if (result != null && result <= lineLength)
{

   // 충돌

}

 

3D에서 충돌을 감지하는 BoundingBox Ray 2D에서 사용하도록 처리한 것입니다.

3차원을 2차원으로 줄이기 위해 Z 값을 0.0f 설정했구요.

참고로 ray boundingbox 충돌의 결과는 거리가 나오는 데요.

충돌을 하지 않을 경우에는 null 나오고, 충돌을 하면 충돌된 거리가 나옵니다.

 

충돌된 거리가 직선의 길이보다 작아야 충돌로 인지하게 처리하면 끝이 납니다.

 

(3) 선과

 - 원의 중점Pc 에서 (P1->P2) 수직하는 (최단거리) 만든다선과 수선이 만나는 교점이 선의 범위 안에 있으면 충돌

   P = P1 + u(P2 - P1) -> P 교점이라 하면, (Pc - P) dot (P2 - P1) = 0(내적이 0이면 직각)

   식을 풀면 u = (Pc - P1) dot (P2 - P1) / (P2 - P1) dot (P2 - P1)

   u < 0이면, P1 원의 중점으로부터 최단 거리(u == 0 이면 P1 수직인 좌표)

   u > 1이면, P2 원의 중점으로부터 최단 거리(u == 1 이면 P2 수직인 좌표)

   u값을 처음의 식에 대입하면, 교점 P 나옴

   교점 P에서 원의 중점까지의 거리가 원의 반지름보다 작으면 충돌

 

(4) 사각형과 사각형

 - 사각형을 R1 R2라고 했을때, R1 네점이 R2 포함되는지, R2 네점이 R1 포함되는지 검사.

   하나라도 포함되면, 충돌

 

(5) 사각형과

 - 원의 중점에서 사각형의 꼭지점에 대한 거리가, 원의 반지름보다 작거나 같은 점이 하나라도 있으면 충돌

 

(6) 원과

 - 원의 중점간의 거리가 원의 반지름의 합보다 작거나 같으면 충돌.

 

 

직선의 교차점을 구하는 알고리즘

글은 선분의 교차점을 구하는 알고리즘이 작업에 필요해서 작성해둔 글이다. 참고로, 예전에 두선분의 교차점을 구하는 자체가 쉬울 것으로 생각하고 흔히 생각하는 기울기, y 절편을 이용하여 접근하려고 하였다. 이는 상당히 비효율적 방법이였고 조금 효율적인 방법으로 접근하였다


먼저 직선의 방정식으로써, 기울기와 절편으로 나타내지 말고, t 매개변수를 이용해 나타내면 다음과 같다. 

P1 P2 직선의 시작점과 끝점을 나타내며, t 범위는 0에서 1까지이다. (P1, P2에서 1, 2 아래첨자로 생각하기 바란다)

선의 식을 알았으니, 이제 두선의 교점을 구해보는 것으로 응용해보자. 먼저 아래 그림을 보자.

 

 

Line1 P1 P2 이루어져 있으며, Line2 P3 P4 이루어져 있다. 두개의 라인을 식으로 표현해보면 다음과 같다.

 

 

이미 알겠지만, t s 0에서 1부터의 값이며, 두선의 교점은 두선의 공통된 값이므로 P(t) P(s) 같으므로 위의 2개의 식은 아래의 1개의 식으로 나타낼 있다.

 ( 1 - t ) P1 + tP2 = ( 1 - s ) P3 + sP4

 

 

다시 위의 식을 x, y 분리해보면 아래와 같은 두개의 식들로 분리된다.

 

x로 분리  

P1 = x1; P2 = x2; P3 = x3; P4 = x4;

 

(1-t)x1 + tx2 = (1-s)x3 + sx4

x1 - tx1 + tx2 = x3 -sx3 + sx4

x1 + t (x1 + x2) = x3 + s (x4 - x3)

 

y로 분리 

P1=y1; P2 = y2; P3=y3; P4=y4;

y1 + t (y1 + y2) = y3 + s (y4 - y3)

 

 

위의 식을 t s 대해서 정리를 해보면 다음과 같다.

 

 

, 위의 t s 두선이 서로 만날때의 값이므로, 최종적으로 두선의 교점은 다음과 같이 나타낼 있다.

위의 x, y 우리가 구하고자하는 직선의 교점이다

마지막으로 t s 대해 정리해 보도록 하자.


s
t 값이 0 1 사이를 벗어나는 경우, 선은 교차하지 않는다고 판정해야 한다. 그리고 s t 구하는 공식에서 분모가 0 경우 선은 평행하다는 의미이므로 교점은 존재하지 않다. 분모와 분자 모두 0 경우 선은 동일한 선이다.


아래의 코드는 위의 설명을 토대로 작성하였다.

bool checkCross(const CPoint& AP1, const CPoint& AP2, const CPoint& BP1, const CPoint& BP2, CPoint* IP)

{
    double t;

    double s; 

    double under = (BP2.y-BP1.y)*(AP2.x-AP1.x)-(BP2.x-BP1.x)*(AP2.y-AP1.y);

    if(under==0) return false;

    double _t = (BP2.x-BP1.x)*(AP1.y-BP1.y) - (BP2.y-BP1.y)*(AP1.x-BP1.x);

    double _s = (AP2.x-AP1.x)*(AP1.y-BP1.y) - (AP2.y-AP1.y)*(AP1.x-BP1.x); 

    t = _t/under;

    s = _s/under; 


    if(t<0.0 || t>1.0 || s<0.0 || s>1.0) return false;

    if(_t==0 && _s==0) return false; 



    IP->x = AP1.x + t * (double)(AP2.x-AP1.x);

    IP->y = AP1.y + t * (double)(AP2.y-AP1.y);

    return true;
}

 

2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)

2020/12/14 - [iOS/Tips] - bundle id 알아내기

2020/12/12 - [AI/Algorithm] - 2D 충돌처리

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

 

반응형

'개발 > AI,ML,ALGORITHM' 카테고리의 다른 글

MNIST 데이터셋 다운로드  (0) 2023.07.19
Neural Network (XOR)  (0) 2022.11.18
Generic algorithm  (0) 2020.05.19
neural network  (0) 2020.05.19
minimax full search example  (0) 2020.05.19
블로그 이미지

SKY STORY

,
반응형

손쉬운 업데이트를 위해 대부분의 회사에서 하이브리드 앱으로 개발을 합니다.

이 과정에 특정 서비스의 경우 웹뷰를 따로 구성해야하는 상황이 발생합니다.

예를들어, AViewController, BViewController와 같이 UIViewController를 상속받는 ViewController를 따로 생성하여 웹뷰를 구성하게 됩니다. 이러한 구성에 따로 생성된 뷰컨트럴러간 스위칭이 필요한 경우가 발생합니다.

+ UINavigationController

   - AViewController

   - BViewController

   - CViewController

위와 같은 경우 마지막에 추가된 CViewController가 화면에 출력됩니다.

UINavigationController의 뷰컨트럴러 배열의 순서를 변경하면 원하는 뷰컨트럴러를 최상단으로 올릴 수 있습니다.

다음은 해당 기능을 구현한 클래스입니다.

extension UINavigationController {
	// 주어진 UIViewController를 제거합니다.
    func removeVC(_ kindClass: AnyClass) {
        self.viewControllers = self.viewControllers.filter {!$0.isKind(of:kindClass)}
    }
    
    // 주어진 UIViewController가 존재하는지 체크
    func containsVC(_ kindClass: AnyClass) -> Bool {
        return self.viewControllers.contains(where: {$0.isKind(of:kindClass)})
    }
    
    // 주어진 UIViewController를 최상위에 출력되도록 합니다.
    func setTopVC(_ kindClass: AnyClass) -> UIViewController? {
        var stack: [UIViewController] = self.viewControllers
        var index: Int = 0
        for vc in stack {
            if vc.isKind(of: kindClass) {
                stack.remove(at: index)
                stack.append(vc)
                self.viewControllers = stack
                return vc
            }
            index += 1
        }
        return nil
    }
    
    // 주어진 UIViewController를 존재하는 경우 최상위에 출력되도록 합니다.
    func activateVC(_ kindClass: AnyClass) {
        if containsVC(kindClass) {
            _ = setTopVC(kindClass)
        }
    }
}

extension UIViewController {
	// 옵져버 추가
    func addObserver(_ aSelector: Selector) {
        NotificationCenter.default.addObserver(self,
                                               selector: aSelector,
                                               name: NSNotification.Name(self.theClassName),
                                               object: nil)
    }
	
    // 옵져버 삭제
    func removeObserver() {
        NotificationCenter.default.removeObserver(self)
    }
    
    // 타깃 뷰컨트럴러로 데이터 전달 
    func post(_ targetClassName: String, _ userInfo: [AnyHashable : Any], _ delay: Double = 0.0) {
        let delayTime: Double = (delay < 0) ? 1.0 : delay
        Timer.scheduledTimer(withTimeInterval: delayTime, repeats: false, block: {_ in
            NotificationCenter.default.post(name: NSNotification.Name(targetClassName),
            object: nil,
            userInfo: userInfo)
        })
    }
}



//
// BViewController
// 

override func viewDidLoad() {
    super.viewDidLoad()
    addObserver(#selector(onCommand))
    ... 중간 생략 ...
}
        
deinit {
    removeObserver()
}

... 중간 생략 ...

@objc func onCommand(notification: Notification) {
    guard notification.name.rawValue == self.theClassName else { return }
    guard let userInfo = notification.userInfo else { return }
    
    let name = userInfo["name"] as? String ?? ""
    if name == "이벤트이름" {
        let paramString = userInfo["data"] as! String
        self.sendScript(name: "이벤트이름", result: paramString)
    }
    else {
        //self.userMethod = name
        //self.userInfo = userInfo["data"] as! Dictionary <String, Any>
    }
}

    

//
// 사용 방법
// : 아래 내용은 CViewController에서 BViewController로 이벤트 데이터를 전달 및 화면 스위칭한다.
//

// BViewController에 이벤트 데이터 정보 전달
post("BViewController", ["name" : "이벤트이름", "data" : "전달할 데이터 정보"])

// 0.5초 딜레이 주어 웹뷰 로딩 시간을 주었다.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
	self.navigationController?.activateVC(BViewController.self)
}

 

2020/12/11 - [iOS/Swift] - UIViewController 스위칭

2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)

2020/12/11 - [분류 전체보기] - Tones And I - Dance Monkey

2020/12/11 - [lyrics] - Beyonce - Halo

2020/12/11 - [개발노트] - 특수문자 발음

2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)

2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)

2020/12/10 - [iOS/Tips] - Custom UserAgent 설정

2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거

2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기

2020/12/10 - [개발노트] - Bluetooth UUID

2020/12/08 - [개발노트] - 모바일 앱 메모리덤프 이슈 해결방법

2020/12/08 - [프로그래밍/Java Script] - Android, iOS 앱 설치여부 체크 및 스토어 이동

2020/08/21 - [Android/Tips] - aab파일 apk파일로 변환

반응형

'개발 > iOS' 카테고리의 다른 글

디버깅 차단 처리 (Anti Debug)  (0) 2020.12.15
bundle id 알아내기  (0) 2020.12.14
웹뷰에서 javascript 함수 동기식 호출  (0) 2020.12.10
Fat Static Library 빌드 (2/2)  (0) 2020.12.10
Fat Static Library 빌드 (1/2)  (1) 2020.12.10
블로그 이미지

SKY STORY

,