우선 해결책은 이 링크를 보면 된다.

Swift Concurrency를 설레는 마음으로 이래저래 써보고 있는데, Xcode 에서 빌드하고 실행한 앱을 홈화면에서 실행할 때마다 Concurrency 관련 기능을 수행하면 갑자기 앱이 강제종료가 되는 상황. 찾아보니 iOS 14 기기에서만 발생하는 것 같다. 위의 링크로 들어가 사람들 얘기하는걸 들어보면 알겠지만, 간단하게 원인을 설명하자면 Swift Concurrency가 이전 버전에서도 동작되도록 넣어준 libswift_Concurrency.dylib 가 일부 환경(Xcode 13.2.1, iOS 14)에서 복수개의 아키텍처에 대한 슬라이스가 동시에 포함되면서 앱이 올바른 라이브러리를 링크하지 못해서 발생하는 상황이었다고. 이를 해결하기 위해서는 결국 해당 dylib가 꼭 필요한 가용한 아키텍처에 대한 슬라이스만 남겨야 하는데, 이를 매 빌드마다 스크립트를 실행하도록 해서 해결할 수 있다고 한다.

아래 이미지와 같이 앱 Scheme 에디터로 들어가서 Build > Post-actions 에 스크립트를 추가한다. 이 때 Provide build settings from: 바로 뒤에 앱 타겟을 지정해준다.

Xcode의 스킴 설정 화면에서 Build 안의 Post-actions에 해당하는 부분을 수정하는 모습

그리고 그 아래 다음의 스크립트를 넣어주면 해결이다.

FRAMEWORK_EXECUTABLE_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}/Frameworks/libswift_Concurrency.dylib"
if test -f "$FRAMEWORK_EXECUTABLE_PATH"; then
  EXTRACTED_ARCHS=()

  for ARCH in $ARCHS
  do
    echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_PATH"
    lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
    EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
  done

  lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
  rm "${EXTRACTED_ARCHS[@]}"

  echo "Replacing original executable with thinned version"
  rm "$FRAMEWORK_EXECUTABLE_PATH"
  mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
fi

맨 위에 링크 건 스레드의 맨 마지막에 보면 Xcode를 13.3 이상으로 업그레이드했을 때 위 스크립트때문에 문제가 발생할 수 있다고 하니 업그레이드 이후에는 꼭 제거하도록 하자.

물론 macOS Monterey로 업그레이드할 수 있는 환경이라면 이런 뻘짓하지 말고 걍 Xcode 업그레이드하는게 답이다.

참고 링크