Apple silicon(M1) 및 Intel 기반 플랫폼에 멀티 아치 SDK 배포


Apple siliconMac가 등장했고 iOS 개발 커뮤니티에서 점점 보편화되었다.이러한 변화는 iOS SDK가 이 두 가지 유형의 iOS 에뮬레이터에서 코드를 실행할 수 있도록 M1과 Intel 아키텍처를 모두 지원해야 한다는 것을 의미합니다.이를 위해서는 바이너리 파일을 기존 프레임에서 XC 프레임으로 업데이트해야 합니다.

Xcode 프레임워크 및 Xcode 11 소개


과거에 SDK는 iOS 장치, iOS 시뮬레이터, Mac Catalyst와 Mac의 바이너리 버전을 묶어 lipo 명령으로 만들었다“fat" frameworks.그러나 lipo로 구축된fat 프레임워크는 같은 구축 목표의 여러 체계 구조를 지원하지 않는다.
이를 극복하기 위해 애플은 Xcode 11의 XCFramework 바이너리 파일 유형을 도입했다.XCFrameworks는 기존의 iOS 프레임워크 대신 동일한 구축 목표의 여러 아키텍처를 지원하고 동일한 아키텍처를 사용하는 여러 구축 목표를 지원할 수 있습니다.

Bash 스크립트를 사용하여 XC 프레임워크를 구축하는 방법:

  • 지원하려는 각 플랫폼과 선택한 아키텍처에 대한 아카이브를 만듭니다.
  • 새로운 xcodebuild 옵션을 추가해야 합니다: “BUILD_LIBRARIES_FOR_DISTRIBUTION”
  • M1 및 Intel 아키텍처를 지원하려면 대상의 대상을 "generic/platform=target platform HERE"로 설정하십시오.-destination="generic/platform=iOS Simulator"
  • 압축 파일을 만든 후 xcodebuild 명령-create-xcframework을 사용하고 바이너리 파일에 포함할 프레임워크를 사용합니다.
    <-kg 카드 시작: 코드 -->
  • #!/bin/bash
    set -e
    
    WORKING_DIR=$(pwd)
    
    FRAMEWORK_FOLDER_NAME="OneSignal_XCFramework"
    
    FRAMEWORK_NAME="OneSignal"
    
    FRAMEWORK_PATH="${WORKING_DIR}/${FRAMEWORK_FOLDER_NAME}/${FRAMEWORK_NAME}.xcframework"
    
    BUILD_SCHEME="OneSignalFramework"
    
    SIMULATOR_ARCHIVE_PATH="${WORKING_DIR}/${FRAMEWORK_FOLDER_NAME}/simulator.xcarchive"
    
    IOS_DEVICE_ARCHIVE_PATH="${WORKING_DIR}/${FRAMEWORK_FOLDER_NAME}/iOS.xcarchive"
    
    CATALYST_ARCHIVE_PATH="${WORKING_DIR}/${FRAMEWORK_FOLDER_NAME}/catalyst.xcarchive"
    
    rm -rf "${WORKING_DIR}/${FRAMEWORK_FOLDER_NAME}"
    echo "Deleted ${FRAMEWORK_FOLDER_NAME}"
    mkdir "${FRAMEWORK_FOLDER_NAME}"
    echo "Created ${FRAMEWORK_FOLDER_NAME}"
    echo "Archiving ${FRAMEWORK_NAME}"
    
    xcodebuild archive ONLY_ACTIVE_ARCH=NO -scheme ${BUILD_SCHEME} -destination="generic/platform=iOS Simulator" -archivePath "${SIMULATOR_ARCHIVE_PATH}" -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
    
    xcodebuild archive -scheme ${BUILD_SCHEME} -destination="generic/platform=iOS" -archivePath "${IOS_DEVICE_ARCHIVE_PATH}" -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
    
    xcodebuild archive -scheme ${BUILD_SCHEME} -destination='generic/platform=macOS,variant=Mac Catalyst' -archivePath "${CATALYST_ARCHIVE_PATH}" SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
    
    xcodebuild -create-xcframework -framework ${SIMULATOR_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework -framework ${IOS_DEVICE_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework -framework ${CATALYST_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework -output "${FRAMEWORK_PATH}"
    
    rm -rf "${SIMULATOR_ARCHIVE_PATH}"
    rm -rf "${IOS_DEVICE_ARCHIVE_PATH}"
    rm -rf "${CATALYST_ARCHIVE_PATH}"
    open "${WORKING_DIR}/${FRAMEWORK_FOLDER_NAME}"
    

    Swift Package Manager 및 Xcode12를 사용하여 XC 프레임워크 배포


    XCFrameworks가 애플에서 처음 출시되었을 때, 애플은 Swift Package Manager와 호환되지 않았다.현재 Xcode 12를 사용하면 Swift 패키지 관리자를 통해 Swift 패키지를 XCframework 바이너리 파일로 배포할 수 있습니다.
    이것은 당신과 소비자에게 많은 장점을 제공하였다.원본 코드의 비밀성을 유지할 수 있고, 애플의 강요된 구조에 가방 저장소를 제한하지 않는다.소비자들에게 이진 형식으로 대형 패키지를 가져오는 것은 전통적인 Swift 패키지보다 훨씬 빠르고 후자는 라이브러리나 프레임워크로 구축된 것이다.
    distribute your XCFramework using Swift Package Manager의 경우 새 대상 유형:binaryTarget을 사용해야 합니다.이 대상에서 다음 키에 대한 값을 제공합니다.

  • "name:"소포의 이름입니다.이 이름은 배포 중인 XCFramework의 모듈 이름과 일치해야 합니다.

  • "url:"압축 프레임워크의 원격 URL입니다.

  • "checksum:"압축된 XC 프레임워크의 체크섬 확인
  • 체크섬 계산을 하려면 먼저 명령줄이 // swift-tools-version:5.3 이상 버전(Xcode tools 12.0)을 사용하고 있는지 확인하고 패키지를 확인합니다.swift 파일이 생성되었습니다.그런 다음 패키지의 루트 디렉토리로 이동하여 실행합니다. swift package compute-checksum path/to/your/zipped/xcframework.zip
    // swift-tools-version:5.3
    // The swift-tools-version declares the minimum version of Swift required to build this package.
    import PackageDescription
    
    let package = Package(
       name: "OneSignal",
       products: [
           .library(
               name: "OneSignal",
               targets: ["OneSignal"]),
       ],
       targets: [
           .binaryTarget(
               name: "OneSignal",
               url: "iOS_SDK/OneSignalSDK/OneSigna_XCFramework/OneSignal.zip",
               checksum: "d9cf4274437a127108f6ec8f9bd424b1feb4f54dd240c2804d0a5bd31e068a70")
       ]
    )
    

    바이너리 패키지 배포는 Xcode 11 사용 시 지원


    바이너리 형식으로 Swift 패키지를 나눠주려면 패키지 사용자가 Swift 도구 5.3을 사용해야 하는데 이 도구는 Xcode 12에서만 사용할 수 있다.Xcode 11을 사용하고 있는 경우 Xcode 12가 설치되어 있고 명령행 도구가 Xcode 12 버전으로 설정되어 있어도 패키지를 가져올 수 없습니다.바이너리 패키지 배포와 Xcode 11을 지원하기 위해 SDK에는 2개의 Git 저장소가 필요합니다.
    원본 저장소는 모든 원본 코드를 저장할 수 있지만, 두 번째 저장소는 새 패키지만 포함합니다.압축된 XCFramew 파일의 swift 파일을 가리킵니다.나는 이 압축 파일을 관련 GitHub 발행판에 자산으로 추가할 것을 건의합니다.
    이 정책을 구현하려면 패키지를 업데이트해야 합니다.swift는 XCframework의 새 해시를 사용하고 새 버전의 버전 번호를 사용하여 링크 URL을 업데이트합니다.이것은 수동으로 완성할 수도 있고, bash 스크립트를 사용하여 자동으로 완성할 수도 있다.

    패키지를 업데이트합니다.Bash 스크립트를 사용하여 새 Swift 및 URL 릴리즈

  • 우선 이전의 압축 파일을 삭제하고 ditto 명령을 사용하여 새로운 압축 파일을 만듭니다.

  • # Remove the old Zipped XCFramework and create a new Zip
    echo "Removing old Zipped XCFramework ${FRAMEWORK_ZIP_PATH}"
    rm -rf "${FRAMEWORK_ZIP_PATH}"
    echo "Creating new Zipped XCFramework ${FRAMEWORK_ZIP_PATH}"
    ditto -c -k --sequesterRsrc --keepParent "${FRAMEWORK_PATH}" "${FRAMEWORK_ZIP_PATH}" 
    
  • 새 체크섬 계산
  • echo "Computing package checksum and updating Package.swift ${SWIFT_PACKAGE_PATH}"
    CHECKSUM=$(swift package compute-checksum "${FRAMEWORK_ZIP_PATH}")
    
  • 교체 명령(예: StreamEditor, sed)을 사용하여 이전 체크섬 행을 새 체크섬 행으로 대체합니다.
  • SWIFT_PM_CHECKSUM_LINE=" checksum: \"${CHECKSUM}\""
    # Use sed to remove line 17 from the Swift.package and replace it with the new checksum
    sed -i '' "17s/.*/$SWIFT_PM_CHECKSUM_LINE/" "${SWIFT_PACKAGE_PATH}"
    
  • read와sed를 사용하여 압축된 XCFramework의 URL을 최신 버전 번호로 업데이트합니다.
  • #Ask for the new release version number to be placed in the package URL
    echo -e "\033[1mEnter the new SDK release version number\033[0m"
    read VERSION_NUMBER
    SWIFT_PM_URL_LINE=" url: \"https:\/\/github.com\/OneSignal\/OneSignal-iOS-SDK\/releases\/download\/${VERSION_NUMBER}\/OneSignal.xcframework.zip\","
    
    # Use sed to remove line 16 from the Swift.package and replace it with the new URL for the new release
    sed -i '' "16s/.*/$SWIFT_PM_URL_LINE/" "${SWIFT_PACKAGE_PATH}"
    
    이렇게!이제 Swift Package Manager를 사용하여 Apple Silicon과 Intel Mac을 지원하는 닫힌 소스 코드 바이너리 파일을 배포할 수 있습니다.Apple announced가 WWDC 2020에서 인텔 칩에서 애플 실리콘 칩으로 넘어가기 시작한 이후 SDK 개발자들은 빠르게 변화를 일으켰다. M1 chipset는 이 전환을 추진하는 데 도움을 주었다.Cocoapods, Carthage, SwiftPM은 현재 XCframeworks를 지원하고 있으며, 현재 애플 개발자를 위해 건장하고 유니버설 SDK를 구축하는 가장 좋은 해결 방안이다.

    좋은 웹페이지 즐겨찾기