1. WatchOS 개발을 위한 첫 단계
이전까지 iOS App 개발을 위해서 Tuist를 사용했지만, WatchOS App Target으로 Tuist를 생성한 적이 없어서 꽤나 어려웠다.
iOS처럼 단순하게 아래처럼 생성하게 된 기본 Project.swift 파일로 destination을 iOS에서 WatchOS로만 바꾸면 해결될 것으로 기대했다. Project는 생성되었을 지 몰라도 정상적으로 빌드 및 실행이 되지 않았다.
tuist init {projectName}
이런 삽질을 시간이 지나 까먹어서(..) 다시 하지 않는 불상사를 저지르지 않고자 기록한다!
결론만 보고 싶다면 가장 최 하단에 코드를 남겨 놓으니 참고해주세요!
2. Project.swift
최대한 간결하게 Project.swift를 작성했다.
아래처럼 작성한 후에 적당한 sources, resources 폴더를 만들어 준 뒤 tuist generate를 하면 프로젝트는 잘 만들어진다.
import ProjectDescription
let project = Project(
name: "WatchOSTest",
packages: [:],
targets: [
.target(
name: "WatchOSTest",
destinations: .watchOS,
product: .app,
bundleId: "com.jjikkyu.WatchOSTest",
infoPlist: .extendingDefault(with: [:]),
sources: ["WatchOSTest/Sources/**"],
resources: ["WatchOSTest/Resources/**"],
dependencies: []
),
]
)
Apple Watch 시뮬레이터로 빌드가 정상적으로 되지 않는다. (ㅠㅠ)
이전에는 프로젝트가 만들어지면 웬만한 파일 누락이 아니라면 실행이 되지 않는 일은 없었는데 WatchOS는 유독 위와 같은 오류를 뿜으면서 빌드가 안된다..
2-1. infoPlist를 고쳐보자
infoPlist: .extendingDefault(
with: [
"WKWatchKitApp": .boolean(true)
]
)
오류에서 말하는 것은 굉장히 심플한 것처럼 보인다.
"WKWatchKitApp '또는' WKApplication Key를 true로 바꾸지 않았다."
위 팝업에서는 "또는" 으로 묶여 있어서 둘 중 하나만 하면 되겠구나.. 싶어서 문장의 가장 앞에서 제시되고 있는
"WKWatchKitApp"을 true로 바꾸는 코드를 tuist에 추가했다.
그러니 아래와 같은 또다른 오류가 나를 반기고 있다.
근데 이 오류는 우리가 알고 있는 익숙한 오류라는 것을 알 수 있다.
"Extension은 appTarget의 app Identifier를 따라야한다!"
예를 들면 iOS 앱이 com.jjikkyu.testWatchOS 라고 한다면, extension은 그 부모의 identifier를 따라야 한다는 것이다.
com.jjikkyu.testWatchOS.test 이런식으로..
이것도 tuist에 다시 추가 해보았다.
2-2. infoPlist를 고쳐보자 (2)
그런데, 나는 iOS 앱의 Extension으로 Watch App을 만들고자 하는 것이 아니라, WatchOS 단독 실행 앱을 만들고자 하는 것인데..
이 Watch extension을 지탱하는 iOS 앱이 없다는 것이다.
이상하긴 하지만 "com.jjikkyu" 로만 입력을 해보았다.
infoPlist: .extendingDefault(
with: [
"WKWatchKitApp": .boolean(true),
"WKCompanionAppBundleIdentifier": "com.jjikkyu"
]
)
"com.jjikkyu"가 아닌 "com.jjikkyu.watchOSTest" 등 모든 것들을 다 해봤는데 아래 오류는 없어지지 않았다.
이걸로 며칠, 몇주는 삽질하면서 결국 WatchOS 단독 실행 앱은 tuist로 생성할 수 없구나.. 하고 자포자기 했었다.
왜냐하면 같은 단독 실행 앱이어도 XCode에서 생성한 프로젝트는 너무나 빌드가 잘되었기 때문이다..
3. 다시 Project.swift
"WKWatchKitApp '또는' WKApplication Key를 true로 바꾸지 않았다."라는 팝업의 메세지가 자꾸 마음에 걸렸다.
WKWatchKitApp이라는 것과 WKApplication 이라는 Key에 대한 차이점을 생각하지 않았던 것이 결국 원인이었는데
Key 이름에서 알 수 있듯이,
WatchOS를 iOS App의 Extension으로 활용하고자 한다면 WKWatchKitApp.
WatchOS를 단독 실행 App으로 하고자 한다면 WKApplication.
으로 사용해야 하는 것이었다.. (아니 이걸 그냥 이렇게 "또는" 으로 묶어서 알려줄 간단한 오류였냐고.. ㅠ)
그래서 다시 infoPlist를 바꿔보았다.
3-1. 다시 infoPlist를 고쳐보자
infoPlist: .extendingDefault(
with: [
"WKApplication": .boolean(true),
"WKCompanionAppBundleIdentifier": "com.jjikkyu"
]
)
그제서야 빌드가 되는 것을 확인했다. 야호 ㅜㅜ..
4. 최종 코드
import ProjectDescription
let project = Project(
name: "WatchOSTest",
packages: [],
targets: [
.target(
name: "WatchOSTest",
destinations: .watchOS,
product: .app,
bundleId: "com.jjikkyu.WatchOSTest",
infoPlist: .extendingDefault(
with: [
"WKApplication": .boolean(true),
"WKCompanionAppBundleIdentifier": "com.jjikkyu"
]
),
sources: ["WatchOSTest/Sources/**"],
resources: ["WatchOSTest/Resources/**"],
dependencies: []
)
]
)
WatchOS 공부/사이드 프로젝트 진행을 위해서 프로젝트를 만드는 첫 걸음이 이렇게 성공적으로 마무리 되었다.
공부를 대부분 주말에 시간을 투자하는 편인데, 그래서 그런지 2-3주 내내 삽질하면서 그 다음주까지 찝찝함을 참지 못하는 불상사로 인해, 샤워할 때, 회사에서도, 퇴근할 때도 이 문제가 머리에서 떠나지 않았다.
이전 사이드 프로젝트는 모듈화를 처음 진행했기 때문에, Tuist 옵션을 고려하지 않았다.
무려 2년 전 iOS 만 0년차 응애시절이었기 때문..
이번에는 큰 사이드 프로젝트는 아니지만, 작은 프로젝트인 만큼 조금 더 확실하게 공부하고자 Tuist 도입으로 시작해보려 한다.
화이팅!