CS/iOS, Swift
18
[iOS] xcode์์ ํ์ ํด๋ ๋ณด์ด์ง ์๋ ๋ฌธ์
2023.04.07
A. ๋ฌธ์ ์ํฉ xcode์์ git์ผ๋ก ๋ค๋ฅธ branch์ ์์
์ฌํญ pullํ ํ workspace๋ฅผ ์ฌ๋ project navigator์ ํด๋ ๋ด ๋ค๋ฅธ ์ฌ๋์ด ์์
ํ ํ์ผ์ด ๋ณด์ด์ง ์์์. ํ์ธ๋์์ ํด๋ ํ์ธํ ๊ฒฐ๊ณผ ์ ๋๋ก pull๋ ๋๊ณ ํ์ผ๋ ์กด์ฌํ์. B. ํด๊ฒฐ ๋ฐฉ๋ฒ project navigator์ ๋๋ฝ๋ ํ์ ํด๋๋ค์ ๋๋๊ทธํด์ ๋ฃ๊ณ added folders๋ฅผ create groups๋ก ์ค์ ํด์ ๋ฃ์ด์ฃผ๋ฉด ๋จ. ์๋๋ฉด project navigator ์ฐํด๋ฆญ → add files to “…” ์ ํ → ์ถ๊ฐํ๋ ค๋ ํด๋ ๋ฃ๊ณ ์ต์
์ ๋๊ฐ์ด create groups๋ก ์ค์ . ๊ทธ๋ฆฌ๊ณ add ํด์ฃผ๋ฉด ์ ๋ค์ด๊ฐ ์์.
[iOS] unix timestamp swift
2023.04.07
A. ์ค๋ช
iOS์ unixTimeStamp๋ฅผ ์ฌ์ฉํ ์ผ์ด ์์ด์ ์ฐพ์๋ณด๋ ๊ธฐ๋ณธ ์ ๊ณตํ๋ ๊ฒ์ด ์์. Date().timeIntervalSince1970๋ก ์ฌ์ฉํ๋ฉด ๋๊ณ 1970๋
1์ 1์ผ 00์ 00๋ถ 00์ด ๊ธฐ์ค์ผ๋ก ๋ช ์ด๊ฐ ์ง๋ฌ๋์ง ํ์ธํ ์ ์๋ ํ๋กํผํฐ์. ๋ด๊ฐ ํ์ํ๋ ๊ฒ์ ํ์ฌ๊น์ง 1357์ด๊ฐ ์ง๋ฌ๋ค๊ณ ํ์ ๋ 135๊น์ง ํ์ํ์ผ๋ฏ๋ก ์๋์ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ํด์คฌ์. (10์ผ๋ก ๋๋ ํ Int๋ก ํ๋ณํํ์ฌ ๋๋จธ์ง ์๋ผ๋ด๊ธฐ) import UIKit class TimeSynchronizer { init() { } func getTimeInfo() -> String { var unixTS = Date().timeIntervalSince1970 unixTS = trunc(unixTS / 10..
[iOS] ์๋ฒ ํต์ Base Service
2023.04.07
A. ์ค๋ช
api ํต์ ํ์ํ ๋๋ง๋ค ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๊ฐ ๋๋ฌด ๋ง์ด ์๊ธฐ๋ ๊ฒ ๊ฐ์ base๋ก ์ฌ์ฉํ ์ฝ๋ ๋ง๋ฆ. ํ๋กํ ์ฝ๋ก ์ ์ํด์ ์ฌ์ฌ์ฉ์ฑ ์ฉ์ดํ๋๋ก ๊ตฌํํจ. ์น ์ฐ๊ฒฐ์๋ Alamofire ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํจ. B. ์ฝ๋ import Foundation import Alamofire protocol BaseService { /// api request url var url: String { get set } var header: HTTPHeaders { get set } var param: Encodable? { get set } /// Request์ ๋ค์ด๊ฐ๋ .put, .get ๋ฑ method var method: HTTPMethod { get set } /// Request์ ๋ค์ด๊ฐ๋ P..
[iOS] ์น๋ทฐ ์ฟ ํค ๊ด๋ จ ์ ํธ
2023.04.07
๊ธฐ๋ก์ฉ์ผ๋ก ๋จ๊ฒจ๋๋ ๊ฒ์ผ๋ก, ๋ ๊น๋ํ๊ฒ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๊ฒ ์ง๋ง.. ํ๋ํ๋ ํ๋ผ๋ฏธํฐ๋ก ๋ค ๋๊ธฐ๊ธฐ ์ซ๊ณ ํจ์์ ๊ธธ์ด๋ ๊ธธ์ด์ง๋๊ฒ ์ซ์ด์ ์๋์ ๊ฐ์ด ์ ๋ ๊ตฌํํ์ต๋๋ค. ์๋ ํจ์๋ฅผ ํตํด ๋ง๋ค์ด์ง ์ฟ ํค๋ก ์น๋ทฐ์ ๋ฃ์์ ๋ ์ ์ ์๋ํ์ต๋๋ค. import UIKit class CookieUtil { private let path: String = "/" let cookieDomain = "_" private enum cookieBaseName: String { case appId = "_" // ... } func getAppCookie() -> HTTPCookie? { guard let cookie = HTTPCookie(properties: [ .domain: cookieDomain, .pa..
[iOS] ํค์ฒด์ธ ์ ํธ
2023.04.07
String ํ์
์ ๊ฐ ํค์ฒด์ธ์ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ ค๊ณ ๊ตฌํํด๋์ ํค์ฒด์ธ ์ ํธ ํด๋์ค์
๋๋ค. ์ฑ๊ธํค์ผ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค. store ์ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฐ์ด๋ฉด ์๋์ผ๋ก ์
๋ฐ์ดํธ๊ฐ ๋๋๋ก ๊ตฌํํ์ต๋๋ค. ๋ฐ์ํ๋ ๊ฐ์ข
์ค๋ฅ์ ๋ํ ์ค๋ช
์ ์ฃผ์์ผ๋ก ๋ฌ์์ต๋๋ค. import Foundation import Security enum KeyChainType: String { case tokenKey = "Token_Key" // ... } enum KeyChainError: Error { case invalidBundleID case invalidData case recognizedKeyChainError(OSStatus, CFString?) case unrecognizedKeyChainError case dataC..

[iOS] ํด์ฑ
2023.04.07
์ฉ์ด ์ ๋ฆฌ key : ํด์ฑ๋๊ธฐ ์ ์ ๊ฐ digest : ํด์ฑ๋ ํ์ ๊ฐ rainbow table : ์ฌ๋ฌ ๊ฐ๋ค์ ๋์
ํด๋ณด๋ฉด์ ์ป์ ๋ค์ด์ ์คํธ๋ค์ ๋ชจ์๋์ ํ
์ด๋ธ ํด์ ํจ์ ๋จ๋ฐฉํฅ ํจ์๋ก๋ง ์๋ํจ input ๊ฐ์ด ์์ฃผ ๋ฏธ์ธํ๊ฒ ๋ฌ๋ผ์ ธ๋ output ๊ฐ์ ์ ํ ๋ฌ๋ผ์ง → Avalanche Effect ํด์ ํจ์์ ์๋ ์ค๊ณ ๋ชฉ์ ์ ๋น ๋ฅธ ๊ฒ์์ ์ํจ์ (OS ๋ถ๋ถ ํด์ํ
์ด๋ธ ์ฐธ๊ณ ) input ๊ฐ์ด ๊ฐ์ผ๋ฉด output ๊ฐ์ ํญ์ ๊ฐ์ (์ฆ ํจ์๋ก์ ๊ธฐ๋ฅํจ) ํด์ ํจ์์ ์ํ์ฑ input์ด ๊ฐ์ผ๋ฉด output์ ํญ์ ๊ฐ์ผ๋ฏ๋ก ํด์ฑ๋ ๋ฌธ์์ด์ ์๋ฌธ์ ๋ ์ธ๋ณด์ฐ ํ
์ด๋ธ์์ ์ฐพ์ ์ํ์ฑ์ด ์กด์ฌํจ. brute-force ์๋ ํด์ ํจ์๊ฐ ๋น ๋ฅธ ๊ฒ์์ ์ํด ์ค๊ณ๋์๋ค ๋ณด๋ ์ค์ ๋ฐํ์์์์ ์๋๋ ๋น ๋ฅธ ๊ฑด ๋ง์. ํ์ง๋ง ๊ทธ..