1์ 10์ผ (์)
- ์คํ ๋ง์ผ ํ๋ก์ ํธ STEP 2
- Multipart/form-data ๋๋ฌธ์ 9์๊ฐ ์ฝ์ง..
ย
[๋คํธ์ํน ํ ๋ dataTask ํจ์ ๋ด๋ถ์์ ์ํ์ฝ๋์ ์๋ต๋ฉ์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ]
- ๋ญ๊ฐ ์ํ์ฝ๋๊ฐ ์๋ฌ๊ฐ ๋ฌ์ ๋ ๋ฆฌ์คํฐ์ค์ ์ํ๋ฉ์ธ์ง๊ฐ ๋ด๊ธฐ๋ ์ค ์์๋๋ฐ, data์ json ํ์์ผ๋ก ๋ด์์ฃผ๋๋ผ... ์ผ๋จ ์ด๊ฑฐ ์์๋ด๋๋ฐ ์ฝ์ง..
// dataTask ๋ด๋ถ. resoponse ๋ฐ์ธ๋ฉ ์ฒ๋ฆฌ ์ดํ...
guard (200...299).contains(response.statusCode) else {
completion(.failure(NetworkError.statusCode(response.statusCode))) // ์๋ฌ ์ฒ๋ฆฌ
print("---")
print(httpResponse.statusCode) // ์ํ์ฝ๋ ์ถ๋ ฅ
if let convertedJsonIntoDict = try? JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary {
// ์๋ต๋ฉ์ธ์ง๋ฅผ data > Json > NSDictionary๋ก ๋ณํํด์ ์ถ๋ ฅ
print(convertedJsonIntoDict)
}
print("---")
return // ํด๋ก์ ๋ฆฌํด
}
- ๊ทธ๋์ ์์ data๋ฅผ JSONSerialization๋ก json์ผ๋ก ๋ณํ ํ NSDictionary๋ก ๋ค์ด์บ์คํ ํด์ฃผ๋ฉด ์ํ๋ฉ์ธ์ง๊ฐ ์๋์ฒ๋ผ ๋์จ๋ค.
- ์๋ ๋ฉ์ธ์ง๋ ์ฝ์งํ๋ค๊ฐ ๊ฒฝํํ๋ ์ฝ๋๋ ๋ฉ์ธ์ง์ค ํ๋.. 406๋ ๋ณด์๋ค.
{
code = 500;
message = "Cannot invoke \"java.awt.image.BufferedImage.getWidth()\" because \"buffer\" is null";
}
[URLRequest์ ๋ฑ๋กํ ํค๋, ๋ฐ๋๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ]
- ํค๋๋ ์๋ ํ๋กํผํฐ์ ์ ๊ทผํด์ print๋ฅผ ์ฐ์ผ๋ฉด ์ถ๋ ฅํด์ฃผ๋๋ผ
request.allHTTPHeaderFields
- Request์ ๋ฐ๋ ๋ด๋ถ ๋ฌธ์์ด์ String ๋ด๋ถ init์ ํ์ฉํ๋ค.
String(data: request.httpBody!, encoding: .utf8)
[์ฝ์ง ๊ธฐ๋ก]
- ์ฝ์งํ๊ณ ๋๋ฉด ๋ฟ๋ฏํจ๋ณด๋ค ํํ๊ฐ ์จ๊ฒ ์ฐพ์์จ๋ค... ์ ์์ธ๊ฐ...
- ์์์ ๋ค๋ฅธ ํ๋ค์ด ํ ์คํธ๋ก ์ํ๋ฑ๋ก์ ํ๊ฑธ ๋ณด๊ณ ์ฐ๋ฆฌ ์ฝ๋๋ก๋ ์ํ ๋ฑ๋ก์ด ๋๋ ํ์ธ์ฐจ ํ ์คํธ๋ฅผ ํ๊ฒ ์์์ด์๋ค. ๊ทธ๊ฒ ์ ๋ 9์์ฏค์ด์๋...
- ๊ทผ๋ฐ ์ ๋๋ก ๋์ง ์์๋ค. ์ํ์ฝ๋, ์๋ต๋ฉ์ธ์ง, multipart form-data ์์์ ๊ผผ๊ผผํ ์ดํด๋ณด๋ฉด์ ์ฝ์งํ๊ธฐ ์์ํ๋ค.
- 406 ์๋ฌ๊ฐ ๋์ ํค๋๊ฐ ๋ฌธ์ ์ธ ์ค ์์๋๋ฐ, ๊ทธ๊ฑด ์๋์๋ค.
- ๊ฒฐ๊ตญ ๋ฌธ์ ๋ ํ๋์ฝ๋ฉ์ ๊ฐ์ ํ๋ ค๊ณ ๋ง๋ค์ด ๋์๋ ํ์
์์ ์ฐ๊ด๊ฐ์ ํ์ฉํด Data ํ์
๊ณผ ๋ฌธ์์ด์ ํจ๊ป String ํ์
์ผ๋ก ๋ฐํํ๋ ๊ฒ์ด ๋ฌธ์ ์๋ค.
- ์๋ฅผ ๋ค๋ฉด ์ด๋ฐ์..
"\(data)\r\n"
- ์๋ฅผ ๋ค๋ฉด ์ด๋ฐ์..
- ๊ทธ๋์ ๋ฌธ์์ด์ ๋ฌธ์์ด๋๋ก append ์ํค๊ณ , Dataํ์
์ ๋ ๋ฐ๋ก.. ๊ฐ ํ์
๋ณ๋ก append๋ฅผ ๋ถ๋ฆฌํด์ฃผ๋ ํด๊ฒฐ๋์๋ค.
- ํธ์๋ฅผ ์ํด ๋ง๋ค์๋
append(_ string:)
๋ฅผ ์๋ชป์จ๋จน๊ณ ์์๋ค...
- ํธ์๋ฅผ ์ํด ๋ง๋ค์๋
- ํด๊ฒฐํ๊ณ ๋๋ ํ๋ก์ ํธ ์ฝ๋์ ๋ฌธ์ ์ ๋ค์ด ๊ฝค๋ ๋ง์์๋ค. ๋ฆฌํฉํ ๋ง์ ๋ง์ด ํด์ผํ ๊ฒ ๊ฐ๋ค.
body.append("--\(boundary)\r\n")
body.append("Content-Disposition: form-data; name=\"params\"\r\n")
body.append("Content-Type: application/json\r\n\r\n")
body.append(encodeData) // ์ค ๋ฐ์ดํฐ๋ผ ๋ฐ๋ก append
body.append("\r\n")
- Mock ํ
์คํธํ ๋ ๋ฌธ์ ์์๋๋ฐ, ์ค์ ๋ก API๋ฅผ ์ฐ๋ฅด๋ ํ
์คํธ๋ฅผ ํ๋ค๋ณด๋ ๋ฐ๊ฒฌํ ๋ฌธ์ ์ ๋ค์ด๋ค.
- ๊ทธ๋ฆฐ ๋ง๋๋ก fake ํ ์คํธ๋ ๊ผญ ํ์ํ ๊ฒ ๊ฐ๋ค.
- ๋ค ๋ง์น๊ณ ๋๋ ์ค์ 6์์๋ค. 3์์ฏค ํด๊ฒฐ๋ชปํ๋ ๋์์ ํํ ๋นก์ณ์ ์๋ ค๊ณ ๋์ ์๋๋ฐ, ์ฐ์ฐํจ์ ์ ์ด ์ค์ง ์์๋ค. ๊ฒฐ๊ตญ์ ๋ค ํด๊ฒฐํ๊ณ ์ชฝ์ 3์๊ฐ์ ์ค๋ค ๐
[iOS File System]
- ํ์ผ/์๋ฃ๋ฅผ ํ์/์ ๊ทผ/๋ณด๊ด ๋ฑ์ ๊ธฐ๋ฅ์ผ๋ก ํ์ผ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์์คํ
* ์๊ตฌ ์ ์ฅ์ ๊ด๋ฆฌ
- OS <-> File System <-> Disk
- ์ ํ ํ์ผ ์์คํ
- Apple file system, APFS๋ก ๋ถ๋ฆฌ๋ฉฐ ์ ํ์์ macOS, iOS, watchOS, tvOS ๋ชจ๋์์ ๋ฒ์ฉ์ผ๋ก ์ฌ์ฉํ๋๋ก ๋ง๋ ํ์ผ์์คํ
- ๋์คํฌ ํ์ผ ์์คํ (๋์คํฌ ๋๋ผ์ด๋ธ ๊ด๋ฆฌ)
- ๊ธฐ์กด HFS+ ๋์ฒดํ๋ ์ ๊ท ํ์ผ ์์คํ
- iOS์์๋ 10.3 ๋ฒ์ ๋ถํฐ macOS์์๋ ํ์ด ์์๋ผ ๋ฒ์ ๋ถํฐ ๋์
- ์ ํ ํ์ผ ์์คํ
์ ๊ธฐ๋ฅ
- ์ปจํ ์ด๋ ๋ฐฉ๋ฒ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋ ๋ด ํํฐ์ ์ฉ๋ ์กฐ์
- ์นดํผ ์จ ๋ผ์ดํธ ์ง์ -> ์ค๋ ์ท ์ฉ์ด
- ๊ฐ๋ ฅํ ์ํธํ ๊ธฐ๋ฅ ์ถ๊ฐ
- iOS file system
- iOS ํ์ผ ์์คํ ์ ํด๋น ๊ฐ๊ฐ์ ์ฑ์ ๋ง์ถฐ์ ธ์๋ค. (์์คํ ๊ฐ๊ฒฐ์ฑ ๋ฐ ๋ณด์ ์ธก๋ฉด)
- ์ฑ SandBox ๋๋ ํ ๋ฆฌ ๋ด๋ถ์์ ํ์ผ ์์คํ ๊ณผ ์ํธ์์ฉ (์ฑ ์ค์น์ ๊ฐ ๊ธฐ๋ฅ์ ์ปจํ ์ด๋๋ฅผ SandBox์ ๋ด์)
- budle Container: ์ฑ ๋ฒ๋ค
- Data Container: ์ฑ/์ ์ ๋ฐ์ดํฐ ํด๋น ์ปจํ ์ด๋ ์์ ์๋ธ ๋๋ ํ ๋ฆฌ๊ฐ ์์ฑ๋์ด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ
- iCloud Container: iCloud ๊ด๋ จ ๋ฐ์ดํฐ
- ๋ค์ํ ๋๋ ํ ๋ฆฌ
- Bundle(MyApp.app)
- ์ด ๋๋ ํ ๋ฆฌ๋ ์ฑ๊ณผ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํฌํจํ๋ค.
- ์ฐ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ณ์กฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด bundle ๋๋ ํ ๋ฆฌ๋ app ์ค์น์ ์๋ช ๋๋ค.
- ์ด ๋๋ ํ ๋ฆฌ์์ ์ฐ๊ธฐ๋ฅผ ํ๊ฒ ๋๋ฉด ์๋ช ์ด ๋ณ๊ฒฝ๋๊ณ , app์ด launch๋์ง ์๋๋ค.
- app bundle์ ์ ์ฅ๋ ๋ชจ๋ ๋ฆฌ์์ค์ ๋ํ ์ฝ๊ธฐ ์ ์ฉ ์ ๊ทผ ๊ถํ์ ์ป์ ์ ์๋ค.
- iCloud / iTunes ๋ฐฑ์ ๋ถ๊ฐ
- iTunes๋ App Store์์ ๊ตฌ์ ํ ๋ชจ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ด๊ธฐ ๋๊ธฐํ๋ฅผ ์ํํ๋ค.
- Documents
- ์ฌ์ฉ์ ์์ฑ ์ฝํ ์ธ ์ ์ฅ
- ํ์ผ ๊ณต์ ๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์์๊ฒ ๊ณต๊ฐํ ์ ์๋ ํ์ผ๋ง ํฌํจ๋์ด์ผ ํ๋ค.
- ์ฌ์ฉ์๊ฐ ์์ /์ถ๊ฐ/์ญ์ ๊ฐ๋ฅ(iTunes ํ์ผ ๊ณต์ )
- ์ฌ์ฉ์์๊ฒ ๋ ธ์ถ ๊ฐ๋ฅ
- iCloud / iTunes ๋ฐฑ์
- Inbox
- ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌ ์๋ฃ ์ ์ฅ
- iCloud / iTunes ๋ฐฑ์
- Documents/Inbox
- ์ฑ์ด ์ธ๋ถ ์ํฐํฐ์์ ์ด๋๋ก ์์ฒญํ ํ์ผ์ ์ ๊ทผํ๋ค.
- ํน์ด ๋ฉ์ผ์ ์ฑ๊ณผ ๊ด๋ จ๋ ์ด๋ฉ์ผ ์ฒจ๋ถ ํ์ผ์ inbox์ ์ ์ฅํ๋ค.
- Document interaction controllers๋ ํ์ผ์ ํ์ผ app์ ๋ฐฐ์นํ ์๋ ์๋ค.
- ๋ค๋ฅธ ์ฑ์ ํตํด ์ ์ก๋ฐ์ ํ์ผ์ด ์ ์ฅ๋๋ ๋๋ ํ ๋ฆฌ
- ํ์ผ์ ์ฝ๊ฑฐ๋ ์ญ์ ๋ ๊ฐ๋ฅํ์ง๋ง ์ถ๊ฐ ๋ฐ ์์ ์ ์๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ด ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ํธ์งํ๋ ค๊ณ ํ๋ฉด ๋ณ๊ฒฝํ๊ธฐ ์ ์ ๋๋ ํ ๋ฆฌ์์ ์ฑ์ ์ด๋ํด์ผํ๋ค.
- ์ ์ ๊ฐ ์ง์ ์์ฑ ๋ถ๊ฐ
- iCloud / iTunes ๋ฐฑ์ ๊ฐ๋ฅ
- Library
- ์ฌ์ฉ์ ๋ฐ์ดํฐ ํ์ผ์ด ์๋ ํ์ผ์ ์ต์์ ๋๋ ํ ๋ฆฌ
- ์ฌ๋ฌ ํ์ค ํ์ ๋๋ ํ ๋ฆฌ ์ค ํ๋์ ํ์ผ์ ์ ์ฅํ๋ค
- iOS app์ ์ผ๋ฐ์ ์ผ๋ก Application support์ Caches์ ํ์ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ์ฉ
- ์ฌ์ฉ์ ์ง์ ํ์ ๋๋ ํ ๋ฆฌ ์์ฑ ๊ฐ๋ฅ
- ์ฌ์ฉ์์๊ฒ ๋ ธ์ถ์ํค์ง ์์ผ๋ ค๋ ํ์ผ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ธ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
- ์ฑ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ ํ์ผ์ฉ์ผ๋ก ์ด๋ฌํ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์์ผ ํ๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ ๋ฆฌ์ Contents (Caches ์๋ธ ๋๋ ํ ๋ฆฌ ์ ์ธ)๋ iCloud / iTunes์ ์ํด ๋ฐฑ์ ๋๋ค.
- Library/Application Support
- ์ฑ์ ๊ธฐ๋ฅ ๊ด๋ฆฌ๋ฅผ ์ํด ์ง์์ ์ผ๋ก ๊ด๋ฆฌํด์ฃผ์ด์ผํ๋ ํ์ผ์ ์ ์ฅํ๋ ๊ฒฝ๋ก
- CoreData ๊ธฐ๋ณธ ์ ์ฅ ๊ฒฝ๋ก
- ํธ๋ํฐ ๊ธฐ๊ธฐ ๋ด์ ์ฑ ํด๋(sandbox)๊ฐ ์๊ธฐ๊ณ , ์ฌ์ฉ์๋ Application Support๋ ์ด์ด๋ณผ ์ ์๋ค.
- Document๋ ์ฑ์์ ํ์ฉํ์ ๊ฒฝ์ฐ์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
- ๋น์ฐํ ๊ฐ๋ฐ์ ์ ์ฅ์์๋ Application Support์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
- Library/Caches
- ์ฑ์ ๋์ ์๋, ๋ฐ์ดํฐ ์ ์ฝ ๋ฑ์ ์ํด ์ฌ์ฉํ๋ ๊ณต๊ฐ
- ์ฝ๊ฒ ์ฌ์์ฑํ๊ณ ๋ค์ด๋ก๋ ํ ์ ์๋ ํ์ผ๋ง ์ ์ฅ
- ๋์คํฌ ๊ณต๊ฐ์ด ๋ถ์กฑํ๊ฑฐ๋ ์์คํ ๋ณต์์ ๊ฒฝ์ฐ ์์คํ ์ ์ํด ์๋์ผ๋ก ํ์ผ์ด ์ญ์ ๋ ์ ์๋ ๋๋ ํ ๋ฆฌ
- ์ญ์ ๋์ด๋ ๋ฌด๋ฐฉํ ํ์ผ๋ง ์ ์ฅํ์.
- iCloud / iTunes ๋ฐฑ์ ๋ถ๊ฐ
- tmp
- ์ฑ ์คํ ์ฌ์ด์ ์ ์งํ ํ์๊ฐ ์๋ ์์ํ์ผ์ ์ ์ฅํ๋ ๊ณณ
- ๋์ด์ ํ์ํ์ง ์์ผ๋ฉด ์ฑ์์ ์ด ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ์ญ์ ํด์ผ ํ๋ค.
- ์ฑ์ด ์คํ๋๊ณ ์์ง ์์ ๋๋ ์์คํ ์์ ์ด ๋๋ ํ ๋ฆฌ๋ฅผ ์ ๊ฑฐํ ์ ์๋ค.
- iCloud / iTunes ๋ฐฑ์ ๋ถ๊ฐ
- Bundle(MyApp.app)
[FileManager]
- ๋ฌธ์์ด์ ๋ด์ .txt ํ์ผ์ ์์ฑ
let fileManager = FileManager.default
// ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก
let applicationSupportURL = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0]
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let tmpURL = fileManager.temporaryDirectory
// ์์ฑํ ํ์ผ ๊ฒฝ๋ก
let fileURL = tmpURL.appendingPathComponent("abc.txt")
// ์ฝ์
ํ ๋ฌธ์์ด
let text = NSString(string: "Hello, Files!")
do {
try text.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8.rawValue)
print(fileURL)
} catch {
print("์คํจ")
}
- ํ์ผ์ ์ฝ์ด์ ์ถ๋ ฅํ๊ธฐ
do {
let dataFromPath: Data = try Data(contentsOf: fileURL) // URL์ ๋ถ๋ฌ์์ Dataํ์
์ผ๋ก ์ด๊ธฐํ
let text: String = String(data: dataFromPath, encoding: .utf8) ?? "๋ฌธ์์์" // Data to String
print(text) // ์ถ๋ ฅ
} catch let e {
print(e.localizedDescription)
}
- ํ์ผ์ ์ญ์ ํ๊ธฐ
do {
try fileManager.removeItem(at: fileURL) // ์ญ์ ํ ํ์ผ์ ๊ฒฝ๋ก
print(fileURL)
} catch {
print("์คํจ")
}
- ์ฐธ๊ณ ๋งํฌ