티스토리 뷰

반응형

 

안녕하세요 :) Zedd입니다.

오늘은 Swift Package에 리소스를 번들링 할 때 Rule이 2가지가 있는데, 요걸 공부해볼거에요.

🚨 이 글에서는!! 막 Swift Package를 사용하는 프로젝트에서 어떻게 리소스를 가져오냐~ 이게 아니라 

Resource Rule의 Copy와 Process의 차이점에 대해서만 볼겁니다. 참고해주세요!!🚨

 

Swift Package를 사용하는 프로젝트에서 어떻게 리소스를 가져오는지는 이 글을 참고해주세요~

 

# 현재 Swift Pakage 구조 

1. xcassets에 있는 이미지

2. 그냥 json 파일

3. Images디렉토리 안에 있는 이미지 

 

# Bundle Path가져오기

아래에서 Bundle안에 있는 내용물을 볼건데, 그러기 위해서는 내 Swift Package Bundle Path를 알아야 합니다.

1) Swift Package를 사용하는 내 프로젝트

2) Swift Package

중 1번. Swift Package를 사용하는 내 프로젝트에 

print(Bundle.main)

를 print해줍니다. (저는 바로 볼 수 있도록 viewDidLoad에...)

NSBundle </Users/zedd/Library/Developer/CoreSimulator/Devices/4091D4AC-D9C4-41E8-BCDF-C6D18090EEC0/data/Containers/Bundle/Application/929495C0-D728-49C9-B2FC-70DC28946702/NSUserActivity_Example.app> (loaded)

그럼 뭐 이런식으로 뜰텐데요. 

이동해보면 뭐 이런식으로 들어있을겁니다.

저 앱 이름을 오른쪽 클릭하면

패키지 내용 보기를 할 수 있습니다. 이따가 여기에 들어갈거에요!

빌드 할 때 마다 ㅎㅎ..저 Path가 달라지니까 주의!

 

# Resource 

.target(
            name: "ResourceKit",
            dependencies: [],
            ✅ resources: [] ✅),

resources파라미터는 [Resource]타입을 받는데요. 

Swift Package에는 Resource타입을 리턴하는 2가지 메소드가 있습니다.

1. copy

2. process

 

# copy

- 각 리소스에 복사 규칙(Copy rule)을 적용하도록 Swift에 요청

- copy로 디렉토리를 타게팅 하는 경우, Swift는 구조를 유지.

- 따라서 디렉토리 구조를 유지하려는 경우에만 copy를 사용. 그렇지 않으면 process사용할 것

이게 뭔 소리인지 잘 모르겠죠!!

copy를 일단 사용해봅시다.

 

1. 그냥 파일을 명시하는 경우

resources: [.copy("Images/walker.jpg"), .copy("myName.json")]),

json파일이랑 Images 디렉토리 안에 있는 이미지 친구를 넣어줬습니다. 

Swift Package를 사용하는 프로젝트를 빌드해줍니다. 

그럼 아까 Bundle Path로 가서...패키지 내용보기를 하면

내 Swift Package bundle이 들어있을텐데, 역시나

패키지 내용보기를 해주세요.

짜잔~ 아까 넣어줬던 친구들이 

resources: [.copy("Images/walker.jpg"), .copy("myName.json")]),

여기에 들어가게 됩니다.

 

2. 디렉토리를 명시하는 경우

이미지의 경우 요런 디렉토리 구조를 가지고 있는데요. 

resources: [.copy("Images"), .copy("myName.json")]),

Images라는 디렉토리를 넣어주겠습니다.

그리고 빌드하면

이렇게 하위 디렉토리 구조를 유지하면서 복사가 됩니다.

 

# Process

process는 copy와 거의 동일합니다만 

Xcode가 패키지를 빌드하는 플랫폼에 따라 리소스를 처리하도록 합니다. 

만약 플랫폼이 최적화를 지원하면 Xcode는 이미지 파일에 대한 최적화 작업을 진행하게 됩니다.

그리고 copy처럼 디렉토리 구조를 유지하지 않고, 리소스를 리소스 번들의 최상위 디렉토리에 복사합니다.

한번 봅시다.

 

1. 그냥 파일을 명시하는 경우

copy에서 했던것 처럼 파일을 명시하되, process로 변경해줍니다. 

resources: [.process("Images/walker.jpg"), .process("myName.json")]),

 

결과

 

2. 디렉토리를 명시하는 경우

resources: [.process("Images"), .process("myName.json")]),

결과

 

 

# copy와 process

copy는 Image 디렉토리를 넣으면 Image > walker.jpg이렇게 디렉토리 구조가 유지됐었는데, 

process는 리소스를 리소스 번들의 최상위 디렉토리에 복사하기 때문에 디렉토리 구조 유지가 안됐습니다. 

 

그래서 중요한건..이런 디렉토리 구조를 유지하고 싶으면 copy, 아니라면 process를 사용해야 합니다.

대부분의 경우 process를 사용한다고 합니다. 최적화도 될 수 있으니까..? 

 

참고 

https://developer.apple.com/documentation/swift_packages/bundling_resources_with_a_swift_package

반응형

'공부' 카테고리의 다른 글

WWDC 21 ) Bring accessibility to charts in your app  (2) 2021.06.10
Bundling Resources with a Swift Package  (1) 2021.05.15
FlexLayout (2)  (0) 2021.05.05
앱 종료하기 with animation  (2) 2021.05.04
FlexLayout 사용해보기  (4) 2021.05.02