반응형

폰에 Frida 설치 

https://www.frida.re/docs/ios/#with-jailbreak

 

Sources 추가 및 Frida 설치 

https://build.frida.re

 

Frida 설치 

pip install frida 

pip install frida -- upgrade

pip3 install frida

pip3 install frida -- upgrade

 

frida-ps 옵션을 확인한다. 

frida-ps -h

 

 

 

기기에서 실행중인 프로세스 목록 출력

frida-ps -U

-U : USB로 연결된 기기에 접속.

-D : Device ID로 기기에 접속.

-R : Remote Server(원격서버)에 접속

-H : Host의 Remote Server(원격서버)에 접속

 

연결되어있는 기기 목록 출력 

frida-ls-devices

 

 

 

USB에 연결된 기기의 실행중인 프로세스 목록 출력 

frida-ps -Uai

 

 

 

메모리 덤프 실행 

python fridump.py -U -s -r AppName 

 

다음과 같은 에러 출력시 관리자 권한으로 실행 

python fridump.py -U -s -r AppName 

Traceback (most recent call last):

File "fridump.py", line 2, in <module> 

import frida ImportError: No module named frida

 

관리자 권한으로 메모리 덤프 실행 

sudo -H python fridump.py -U -s -r APPNAME

 

2020/05/19 - [iOS/Jailbreak] - Fridump 사용법 (1/4) - iOS디바이스 환경 구축

2020/05/19 - [iOS/Jailbreak] - Fridump 사용법 (2/4) - Mac OS X 환경 구축

2020/05/19 - [iOS/Jailbreak] - Fridump 사용법 (3/4) - 메모리 덤프

2020/06/12 - [iOS/Jailbreak] - Fridump 사용법 (4/4) - 결과물 바이너리 검색

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 사용하기 (1/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 사용하기 (2/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 사용하기 (3/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 사용하기 (4/4)

2020/05/19 - [OS/Mac OS X] - gdb 설치

2020/05/19 - [OS/Mac OS X] - Mac에서 Node.js 설치

2020/05/19 - [iOS/Jailbreak] - Tcpdump 사용법

2020/05/19 - [개발노트] - UUID의 구성 요소

2020/05/18 - [iOS/etc] - APNs

2020/05/18 - [iOS/Swift] - Multiple font colors in a single UILabel

2020/05/18 - [개발툴/Xcode] - Storyboard References (스토리보드 분리)

2020/05/18 - [iOS/Jailbreak] - OpenSSL Mac 연동

2020/05/18 - [iOS/Objective-C] - NSLog 출력 크기 제한 풀기

2020/05/18 - [OS/Mac OS X] - Symbolic Link

2020/05/18 - [개발툴/Xcode] - Release 모드에서 디버깅

2020/05/18 - [iOS/Jailbreak] - 탈옥후 안정화

2020/05/15 - [iOS/Swift] - 다중 문자열 / 캐릭터 제거

2020/05/15 - [iOS/Swift] - String substring

2020/05/15 - [iOS/Swift] - Framework 경로

 

 

 

반응형

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

Fridump 사용법 (1/4) - iOS디바이스 환경 구축  (0) 2020.05.19
Fridump, Tcpdump, OpenSSL Quick Guide  (0) 2020.05.19
Tcpdump 사용법  (0) 2020.05.19
APNs - 기능 및 유실 사례  (0) 2020.05.18
Multiple font colors in a single UILabel  (0) 2020.05.18
블로그 이미지

SKY STORY

,

gdb 설치

개발/Note 2020. 5. 19. 10:54
반응형

gdb 설치


터미널에서 다음과 같이 brew 설치 (설치되어있을 경우 패스)

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


만약 다음과 같은 에러가 발생할 경우 다음과 같이 라이센스 동의를 해준다.

You have not agreed to the Xcode license.

Before running the installer again please agree to the license by opening Xcode.app or running:

sudo xcodebuild -license


라이센스 동의

sudo xcodebuild -license



스페이스를 눌러 다음 진행하다보면 다음과같이 ‘agree’라고 타이핑하라는 문구가 뜬다. 타이핑해준다.


다음과 같은 메시지가 출력되면 완료

You can view the license agreements in Xcode's About Box, or at /Applications/Xcode.app/Contents/Resources/ English.lproj/License.rtf


brew 설치 재시도 (설치되어있을 경우 패스)

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


gdb 설치

brew install gdb 



키체인 설정

키체인 접근 - 인증서 지원 - 인증서 생성 


이름은 gdb-cert로 설정 

코드서명으로 인증서 유형을 설정하고 계속


유효기간은 설정


마지막에 키체인을 시스템으로 설정후 생성


생성되었따면,키체인 검색에서 gdb-cert를 찾아 정보 가져오기를 눌러서 신뢰 부분에 항상신뢰로 설정 


gdb 코드사인 저장을 시도하고 맥 아이디/패스워드를 입력한다.


우클릭을 한뒤 카피


odesign -s gdb-cert /usr/local/bin/gdb

계정 정보 입력창이 나타나면 맥 ID/PW를 입력해 준다. 

gdb실행하여 확인



2020/05/19 - [OS/Mac OS X] - Mac에서 Node.js 설치

2020/05/19 - [iOS/Jailbreak] - Tcpdump 사용법

2020/05/19 - [개발노트] - UUID의 구성 요소

2020/05/18 - [iOS/etc] - APNs

2020/05/18 - [iOS/Swift] - Multiple font colors in a single UILabel

2020/05/18 - [개발툴/Xcode] - Storyboard References (스토리보드 분리)

2020/05/18 - [iOS/Jailbreak] - OpenSSL Mac 연동

2020/05/18 - [iOS/Objective-C] - NSLog 출력 크기 제한 풀기

2020/05/18 - [OS/Mac OS X] - Symbolic Link

2020/05/18 - [개발툴/Xcode] - Release 모드에서 디버깅

2020/05/18 - [iOS/Jailbreak] - 탈옥후 안정화

2020/05/15 - [iOS/Swift] - 다중 문자열 / 캐릭터 제거

2020/05/15 - [iOS/Swift] - String substring

2020/05/15 - [iOS/Swift] - Framework 경로

2020/05/15 - [iOS/Objective-C] - Frameworks 경로







반응형

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

HMAC SHA256  (0) 2020.05.28
gdb 사용  (0) 2020.05.19
Mac에서 Node.js 설치  (0) 2020.05.19
UUID의 구성 요소  (0) 2020.05.19
Storyboard References (스토리보드 분리)  (0) 2020.05.18
블로그 이미지

SKY STORY

,
반응형

Node.js를 설치하기 위한 가장 쉬운 방법은 공식사이트인 http://www.nodejs.org 에서 설치 파일을 받는 것이겠지만, 이 방법은 두 가지 큰 단점을 가지고 있습니다.

첫째, 기본적으로 /usr/local에 설치가 되므로 관리자 권한이 없이는 제대로 실행되지 않습니다. 특히 -g 옵션을 줘서 global로 모듈을 설치할 때 마다 sudo를 해줘야 하는 불편함이 따릅니다. 물론 /usr/local 자체의 퍼미션을 변경하는 방법도 있지만, 보안상 권장하진 않습니다.

둘째, 노드의 여러 버전을 관리할 수가 없습니다. 프로젝트 별로 다른 버전을 써야 할 경우나, 여 러 노드 버전에 맞춰 테스트를 해야 할 때 매우 불편합니다.

Homebrew를 사용하여 설치하는 방법도 있지만, El Capitan에서 새로 추가된 SIP(System Integrity Protection) 때문에 권한 문제가 발생할 때가 종종 있어서, 이 글에서는 제외시켰습 니다.

기존에 이미 노드를 설치하셨다면,

노드는 깔끔하게 삭제하기가 매우 어렵습니다. 아래의 방법으로 삭제하시기 바랍니다. (참고 자 료: http://benznext.com/completely-uninstall-node-js-from-mac-os-x/)

1. /usr/local/lib 에 있는 node와 node_modules를 삭제

2. /usr/local/include 에 있는 node와 node_modules를 삭제

3. Homebrew로 설치하셨다면, brew uninstall node를 실행

4. ~/local 또는 ~/lib 또는 ~/include 디렉토리 밑에 존재하는 node와 node_modules 삭 제

5. /usr/local/bin 에 있는 node 관련 실행파일들 삭제 

 

추가로, 필요에 따라 아래 명령어들을 실행하시면 됩니다. (다른 파일까지 삭제하지 않도록 주 의!)

1. sudo rm /usr/local/bin/npm

2. sudo rm /usr/local/share/man/man1/node.1

3. sudo rm /usr/local/lib/dtrace/node.d

4. sudo rm -rf ~/.npm

5. sudo rm -rf ~/.node-gyp

6. sudo rm /opt/local/bin/node

7. sudo rm /opt/local/include/node

8. sudo rm -rf /opt/local/lib/node_modules

 

nvm 설치하기

그럼, nvm(Node Version Manager)을 사용하여 노드를 설치하는 방법을 알아보겠습니다. 먼저 터미널에서 아래의 명령어를 입력해 nvm을 설치합니다.

$ curl https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh | bash 그 다음, 쉘을 재시작하거나, 아래의 명령어를 실행합니다.

$ source ~/.bash_profile 제대로 설치되었는지 확인해 볼 수 있습니다.

$ nvm --version

 

Node.js 설치하기

가장 최신의 stable 버전을 설치하려면, 다음과 같이 실행하면 됩니다. $ nvm install stable 혹은, 원하는 특정 버전을 설치하려면, $ nvm install v5.5.0 이런 식으로 실행하시면 됩니다.

설치할 수 있는 버전 목록을 보려면 다음과 같이 실행합니다.

$ nvm ls-remote 여러 버전의 노드를 설치하셨다면, 아래의 명령어로 원하는 버전으로 전환할 수 있습니다. $ nvm use v4.2.6

 

테스트

시험삼아 grunt-cli를 설치해보면 sudo 필요없이 설치가 되는 것을 볼 수 있습니다. 

$ npm install -g grunt-cli

 

2020/05/29 - [OS/Mac OS X] - iPhone SDK location on hard drive

2020/05/29 - [iOS/Objective-C] - NSString <-> CBUUID 변환

2020/05/29 - [개발노트] - HTTP Content-Type

2020/05/28 - [iOS/Swift] - SEED 블록암호 알고리즘 CBC (Cipher Block Chaining) 예제

2020/05/28 - [개발노트] - HMAC SHA256

2020/05/26 - [iOS/Swift] - Array <-> Data 변환

2020/05/25 - [분류 전체보기] - UserAgent 추가

2020/05/25 - [iOS/Swift] - RSA 암호화 / 복호화

2020/05/25 - [iOS/Swift] - Base64 인코딩/디코딩

2020/05/19 - [AI/Algorithm] - Generic algorithm

2020/05/19 - [AI/Algorithm] - neural network

2020/05/19 - [AI/Algorithm] - minimax full search example

2020/05/19 - [AI/Algorithm] - minimax, alpha-beta pruning

2020/05/19 - [iOS/Tips] - Bitbucket Carthage 사용

2020/05/19 - [iOS/Jailbreak] - Fridump 사용법 (3/3) - 메모리 덤프

반응형

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

gdb 사용  (0) 2020.05.19
gdb 설치  (0) 2020.05.19
UUID의 구성 요소  (0) 2020.05.19
Storyboard References (스토리보드 분리)  (0) 2020.05.18
Symbolic Link  (0) 2020.05.18
블로그 이미지

SKY STORY

,

Tcpdump 사용법

개발/iOS 2020. 5. 19. 09:50
반응형

tcpdump 리모트 패킷캡쳐

rvictl [-h][-l][-s <udid1> ... <udidN>][-x <udid1> ... <udidN>]

 

Remote Virtual Interface Tool starts and stops a remote packet capture instance for any set of attached mobile devices. It can also provide feedback on any attached devices that are currently relaying packets back to this host.

 

Options:

-l, -L List currently active devices

-s, -S Start a device or set of devices

-x, -X Stop a device or set of devices

 

주어진 UUID를 Virtual interface로 등록

rvictl -s [UUID] 

rvictl -s 00008020-000915301AF2002E

 

등록된 virtual interface 이름 확인

rvictl -l

virtual interface이름은 rvi0, rvi1, rvi2 등으로 구성된다.

 

네트워크로 등록되어 있는지 확인된 이름으로 조회

Ifconfig rvi0

 

등록이 잘 됬는지 확인

ifconfig -l

 

rvi0 등록여부 체크

 

virtual interface를 삭제하려면

rvictl -x [UUID] 

rvictl -x 00008020-000915301AF2002E

 

패킷캡쳐

sudo tcpdump -n -i rvi0

 

패킷캡쳐 (간략버전)

sudo tcpdump -n -t -i rvi0 -q tcp

 

패킷캡쳐 (아스키)

sudo tcpdump -n -t -i rvi0 -q -A tcp

 

중단은 Ctrl+C

 

WireShark 툴을 사용할 수 있다.

https://www.wireshark.org/download.html

 

[분할 저장] 

10초단위로 끈어서 시간명으로 파일생성

sudo tcpdump -nn net 115.68 -G 10 -w tcpdump_%Y%m%d_%H:%M:%S.pcap -Z root'

 

10초단위로 끈어서 시간명으로 파일생성하되 촤대 파일갯수는 5개

tcpdump -nn net 115.68 -G 5 -w tcpdump2_%Y%m%d_%H:%M:%S.pcap -Z root -W 5

 

저장된 파일 리스트 

ls -al trace_2014-09-11*

 

파일사이즈단위로 끈어서 저장 (1M 단위로 끈어서 저장)

tcpdump -nn net 115.68 -C 1 -w tcpdump3_%Y%m%d_%H:%M:%S.pcap -Z root

 

Wireshark 에서 tcpdump파일 읽기

sudo tcpdump -i any -s 0 port 80 -w test.pcap

 

콘솔에서 읽기

tcpdump -r test.pcap 

tcpdump -r test.pcap -X

 

 

2020/05/19 - [개발노트] - UUID의 구성 요소

2020/05/18 - [iOS/etc] - APNs

2020/05/18 - [iOS/Swift] - Multiple font colors in a single UILabel

2020/05/18 - [개발툴/Xcode] - Storyboard References (스토리보드 분리)

2020/05/18 - [iOS/Jailbreak] - OpenSSL Mac 연동

2020/05/18 - [iOS/Objective-C] - NSLog 출력 크기 제한 풀기

2020/05/18 - [OS/Mac OS X] - Symbolic Link

2020/05/18 - [개발툴/Xcode] - Release 모드에서 디버깅

2020/05/18 - [iOS/Jailbreak] - 탈옥후 안정화

2020/05/15 - [iOS/Swift] - 다중 문자열 / 캐릭터 제거

2020/05/15 - [iOS/Swift] - String substring

2020/05/15 - [iOS/Swift] - Framework 경로

2020/05/15 - [iOS/Objective-C] - Frameworks 경로

2020/05/15 - [iOS/Objective-C] - iOS디바이스 설정창 이동

 

반응형

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

Fridump, Tcpdump, OpenSSL Quick Guide  (0) 2020.05.19
Frida 설치 및 사용법  (0) 2020.05.19
APNs - 기능 및 유실 사례  (0) 2020.05.18
Multiple font colors in a single UILabel  (0) 2020.05.18
OpenSSL Mac 연동  (0) 2020.05.18
블로그 이미지

SKY STORY

,

UUID의 구성 요소

개발/Note 2020. 5. 19. 09:39
반응형

UUID 의 구성 요소

⁃ 범용 고유 번호(Universally Unique IDentifiers) 라고 불리며, 128 비트의 숫자들을 조합한다.

⁃ UUID = (time_low) - (time_mid) - (time_high_and_version) - (clock_seq_hi_and_reserved) (clock_seq_low_node) 

ex) 000011001-0000-1000-8000-00805F9B34FB

⁃ time_low : 타임 스탬프(시간표시) 의 최하위 32 비트.

⁃ 안드로이드 플랫폼의 단말기끼리는 어떤 UUID를 사용하여도 되지만 특정 프로토콜의 device에 접근하 기 위해서는 각각의 프로토콜 UUID 를 사용하여만 한다.

⁃ 범용적으로 사용할 수 있는 고유의 ID를 사용하기 위해 생성되며, 그렇기 때문에 128 비트의 HEX 조합 은 unique 하여야 한다.

⁃ 블루투스 device 끼리 통신을 하기 위해서 소켓 생성시 UUID 가 필요한데 이는 해당 프로토콜을 의미 한다.

⁃ Bluetooth 에서는 device에서 제공하는 service를 검색하여 각 service 마다 UUID 를 부여하는 등 많은 부분에서 사용된다.

 

2020/05/18 - [iOS/etc] - APNs

2020/05/18 - [분류 전체보기] - Multiple font colors in a single UILabel

2020/05/18 - [개발툴/Xcode] - Storyboard References (스토리보드 분리)

2020/05/18 - [iOS/Jailbreak] - OpenSSL Mac 연동

2020/05/18 - [iOS/Objective-C] - NSLog 출력 크기 제한 풀기

2020/05/18 - [OS/Mac OS X] - Symbolic Link

2020/05/18 - [개발툴/Xcode] - Release 모드에서 디버깅

2020/05/18 - [iOS/Jailbreak] - 탈옥후 안정화

2020/05/15 - [iOS/Swift] - 다중 문자열 / 캐릭터 제거

2020/05/15 - [iOS/Swift] - String substring

2020/05/15 - [iOS/Swift] - Framework 경로

2020/05/15 - [iOS/Objective-C] - Frameworks 경로

2020/05/15 - [iOS/Objective-C] - iOS디바이스 설정창 이동

2020/05/15 - [iOS/Objective-C] - Xcode 한글 깨짐 복구

 

반응형

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

gdb 설치  (0) 2020.05.19
Mac에서 Node.js 설치  (0) 2020.05.19
Storyboard References (스토리보드 분리)  (0) 2020.05.18
Symbolic Link  (0) 2020.05.18
Release 모드에서 디버깅  (0) 2020.05.18
블로그 이미지

SKY STORY

,
반응형

APNs 이란?

APNs(Apple Push Notification Service)는 Apple Device에 Push를 보내줄 수 있는 서비스이다. 지원하는 방식으로는 다음과 같다.

 

Legacy Push

- TLS(SSL) 소켓 통신

- Production(gateway.push.apple.com:2195) / Development(gateway.sandbox.push.apple.com:2195) 

Push

- HTTP/2 통신

- Production(api.push.apple.com:443) / Development(api.sandbox.push.apple.com:443) HTTP/1.1 통신을 지원하지 않는다.

 

APNS 기능

기본적으로 Push Notification 은 단방향 서비스이다.

개발 서버에서 APNS 에 푸쉬 알림을 요청하면 APNS가 알아서 디바이스에 전송한다.

개발 서버는 APNS에 요청하면 할 일은 끝이다.

개발 서버는 APNS 에 푸쉬 알림을 요청할 때, 데이터 format 등에 대한 정상 여부는 리턴 받지 만 실제 도착여부에 대해서는 리턴을 받지 못한다.

사용자가 설정에서 알림을 끄더라도 알림이 출력되지 않지만 알림 수신은 된다.

사용자가 알림을 중지했는지 여부는 알 수 없다. (즉 앱에서만 알 수 있음)

 

 

APNS 유실되는 사례

디바이스 전원이 꺼져있는 경우 APNS의 QoS (Quality of Service) 컴포넌트는 디바이스 전원이 꺼져있는 경우, Notification을 잠시 저장했다가 다시 사용 가능해질 때 Notification이 전달되도록 하지만, 다 음의 경우 저장된 Notification이 폐기된다.

 

- 잠시 꺼져 있는 경우(얼마나 잠시인지 명시되지 않았음) , APNS는 Notification을 저장을

하는데 저장 가능한 Notificaiton은 하나다. 디바이스가 꺼졌있는 동안 하나의 앱에서 여러

개의 푸쉬 알림을 보낸다면, 제일 나중에 보내진 Notification만 저장되어 전달된다. 이전

에 저장된 Notification 은 폐기된다.

 - 장시간 꺼져 있는 경우 (장시간이 얼마나인지는 명시되지 않았음), 저장된 Notification은 폐기된다.

 

APNS 서버 응답 코드

- 200 성공 

- 400 잘못된 요청 

- 403 인증서 또는 공급자 인증 토큰에 오류가 발생했습니다.

- 405 요청에 bad : 메서드 값이 사용되었습니다. POST 요청 만 을 지원합니다. 

- 410 장치 토큰이 해당 항목에 대해 더 이상 활성화되지 않습니다.

- 413 알림 페이로드가 너무 큽니다.

- 429 서버가 동일한 장치 토큰에 대해 너무 많은 요청을 수신했습니다.

- 500 내부 서버 오류 503 서버가 종료되어 사용할 수 없습니다.

- 503 서버가 종료되어 사용할 수 없습니다.

 

 

Feedback Service

Feedback 서비스는 Notification 전달 실패 정보를 개발 서버에 알려주기 위한 서비스다. 푸쉬 알림이 앱이 삭제된 이유로 전달되지 못했다면 , APNS 는 이를 Feedback 서비스에 알리 고 Feedback 서비스는 실패한 디바이스의 토큰을 리스트에 저장한다.

APNS 에서 푸쉬 알림을 디바이스로 전송하기 전에 실패한 – data format error 등 – 경우에 는 Feedback 서비스의 리스트에 등록되지 않는다.(즉, 전송자체가 성공한경우 Feedback 서 비스 사용이 가능함) 개발 서버는 APNS 연결과는 별개로 Feedback 서비스에 접속해서 디바이스 토큰 리스트를 요 청해야 한다. Feedback 서비스는 리스트가 요청될 때마다 리스트를 전달한 후 리스트를 초기화 (clear) 한다.

Feedback 서비스로부터 받은 리스트의 데이터에는 timestamp 정보가 포함되어 있다. 이를 이용하여 리스트에 있는 디바이스 토큰이 Push Service에 재등록되어 있는지를 확인할 수 있 다. (푸쉬 알림을 보낸 시각과 디바이스 토큰의 timestamp 를 비교하면 디바이스 토큰의 재등록 여부를 확인할 수 있다.)

 

Feedback 서비스로의 요청을 위한 url, port 및 format 등의 내용은 아래 링크 참조.

https://developer.apple.com/library/archive/documentation/NetworkingInternet/ Conceptual/RemoteNotificationsPG/BinaryProviderAPI.html

 

 

2020/05/19 - [개발노트] - UUID의 구성 요소

2020/05/18 - [분류 전체보기] - Multiple font colors in a single UILabel

2020/05/18 - [개발툴/Xcode] - Storyboard References (스토리보드 분리)

2020/05/18 - [iOS/Jailbreak] - OpenSSL Mac 연동

2020/05/18 - [iOS/Objective-C] - NSLog 출력 크기 제한 풀기

2020/05/18 - [OS/Mac OS X] - Symbolic Link

2020/05/18 - [개발툴/Xcode] - Release 모드에서 디버깅

2020/05/18 - [iOS/Jailbreak] - 탈옥후 안정화

2020/05/15 - [iOS/Swift] - 다중 문자열 / 캐릭터 제거

2020/05/15 - [iOS/Swift] - String substring

2020/05/15 - [iOS/Swift] - Framework 경로

2020/05/15 - [iOS/Objective-C] - Frameworks 경로

2020/05/15 - [iOS/Objective-C] - iOS디바이스 설정창 이동

2020/05/15 - [iOS/Objective-C] - Xcode 한글 깨짐 복구

 

반응형

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

Frida 설치 및 사용법  (0) 2020.05.19
Tcpdump 사용법  (0) 2020.05.19
Multiple font colors in a single UILabel  (0) 2020.05.18
OpenSSL Mac 연동  (0) 2020.05.18
NSLog 출력 크기 제한 풀기  (0) 2020.05.18
블로그 이미지

SKY STORY

,
반응형

Type 1

  • The way to do it is to use NSAttributedString like this:

NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithAttributedString: label.attributedText];

[text addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(10, 1)];

[label setAttributedText: text];

 

 

 

Type 2

  • First of all initialize of you NSString and NSMutableAttributedString as below.

var myString:NSString = "I AM KIRIT MODI"

var myMutableString = NSMutableAttributedString()

 

In ViewDidLoad

override func viewDidLoad() {

    myMutableString = NSMutableAttributedString(string: myString, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 18.0)!])

    myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange(location:2,length:4))

    // set label Attribute

    labName.attributedText = myMutableString

    super.viewDidLoad()

}

 

 

  • MULTIPLE COLOR

Add the line code below in your ViewDidLoad to get multiple colors in a string.

var myMutableString = NSMutableAttributedString(string: str, attributes: [NSAttributedStringKey.font :UIFont(name: "Georgia", size: 18.0)!])

myMutableString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: NSRange(location:2,length:4))

 

 

 

 

Type 3

  • By using following extension function, you can directly set a color attribute to an attributed string and apply the same on your label.

extension NSMutableAttributedString {

    func setColorForText(textForAttribute: String, withColor color: UIColor) {

        let range: NSRange = self.mutableString.range(of: textForAttribute, options: .caseInsensitive)

 

        // Swift 4.2 and above

        self.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)

 

        // Swift 4.1 and below

        self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)

    }

}

 

 

  • Try above extension, using a label:

let label = UILabel()

label.frame = CGRect(x: 60, y: 100, width: 260, height: 50)

let stringValue = "stackoverflow"

 

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)

attributedString.setColorForText(textForAttribute: "stack", withColor: UIColor.black)

attributedString.setColorForText(textForAttribute: "over", withColor: UIColor.orange)

attributedString.setColorForText(textForAttribute: "flow", withColor: UIColor.red)

label.font = UIFont.boldSystemFont(ofSize: 40)

 

label.attributedText = attributedString

self.view.addSubview(label)

 

 

 

 

Type 4

  • You can easily use html inside attributedText property of the UILabel to easily do various text formatting.

    let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"

    let encodedData = htmlString.data(using: String.Encoding.utf8)!

    let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]

    do {

        let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)

        label.attributedText = attributedString

    } catch _ {

        print("Cannot create attributed String")

    }

 

 

 

 

Type 5

  • In my case, I needed to be able to set different colors/fonts within labels frequently so I made a UILabel extension using Krunal's NSMutableAttributedString extension.

    func highlightWords(phrases: [String], withColor: UIColor?, withFont: UIFont?) {

    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.text!)

    for phrase in phrases {

        if withColor != nil {

            attributedString.setColorForText(textForAttribute: phrase, withColor: withColor!)

        }

        if withFont != nil {

            attributedString.setFontForText(textForAttribute: phrase, withFont: withFont!)

        }

    }

    self.attributedText = attributedString

}

 

  • It can be used like this:

yourLabel.highlightWords(phrases: ["hello"], withColor: UIColor.blue, withFont: nil)

yourLabel.highlightWords(phrases: ["how are you"], withColor: UIColor.green, withFont: nil)

 

 

 

 

Type 6

  • Here is an extension for NSMutableAttributedString, that add/set color on string/text.

extension NSMutableAttributedString {

    func setColor(color: UIColor, forText stringValue: String) {

        let range: NSRange = self.mutableString.range(of: stringValue, options: .caseInsensitive)

        self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)

    }

}

 

  • Now, try above extension with UILabel and see result

let label = UILabel()

label.frame = CGRect(x: 40, y: 100, width: 280, height: 200)

let red = "red"

let blue = "blue"

let green = "green"

let stringValue = "\(red)\n\(blue)\n&\n\(green)"

label.textColor = UIColor.lightGray

label.numberOfLines = 0

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)

attributedString.setColor(color: UIColor.red, forText: red)   // or use direct value for text "red"

attributedString.setColor(color: UIColor.blue, forText: blue)   // or use direct value for text "blue"

attributedString.setColor(color: UIColor.green, forText: green)   // or use direct value for text "green"

label.font = UIFont.systemFont(ofSize: 26)

label.attributedText = attributedString

self.view.addSubview(label)

 

 

 

Type 7

  • HTML문자열 데이터를 특성 문자열 텍스트로 변환 

[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] 

                                                                                                          options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)

} documentAttributes:nil error:nil];

 

 

  • using NSMutableAttributedString from html string 

NSHTMLTextDocumentTypeNSString *s = @"<p><a href='https://itunes.apple.com/us/app/xxxx/xxxx?mt=8'>https://itunes.apple.com/us/app/xxxx/xxxx?mt=8</a></p>";

NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithData:[s dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil ];

myUILabel.attributedText = text;

 

 

 

 

 

참고

  • HTML to NSAttributedString

 NSString *htmlString=[[NSString alloc]initWithFormat:@"<!DOCTYPE html><html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html>"];

//Converting HTML string with UTF-8 encoding to NSAttributedString

 NSAttributedString *attributedString = [[NSAttributedString alloc]

                                        initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding]

                                        options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }

                                        documentAttributes: nil

                                        error: nil ];

 

  • NSAttributedString to HTML

//Dictionary to hold all the attributes of NSAttributed String

 NSDictionary *documentAttributes = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};

 //Saving the NSAttributedString with all its attributes as a NSData Entity

 NSData *htmlData = [attributedString dataFromRange:NSMakeRange(0, attributedString.length) documentAttributes:documentAttributes error:NULL];

 //Convert the NSData into HTML String with UTF-8 Encoding

 NSString *htmlString = [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];

 

 

출처 :

https://stackoverflow.com/questions/27728466/use-multiple-font-colors-in-a-single-label

 

 

 

 

반응형

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

Tcpdump 사용법  (0) 2020.05.19
APNs - 기능 및 유실 사례  (0) 2020.05.18
OpenSSL Mac 연동  (0) 2020.05.18
NSLog 출력 크기 제한 풀기  (0) 2020.05.18
탈옥후 안정화  (0) 2020.05.18
블로그 이미지

SKY STORY

,
반응형
반응형

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

gdb 설치  (0) 2020.05.19
Mac에서 Node.js 설치  (0) 2020.05.19
UUID의 구성 요소  (0) 2020.05.19
Symbolic Link  (0) 2020.05.18
Release 모드에서 디버깅  (0) 2020.05.18
블로그 이미지

SKY STORY

,