Swift 프레임 워크에서 CommonCrypto 가져 오기


184

CommonCryptoiOS 용 Swift 프레임 워크에서 어떻게 가져 옵니까?

CommonCryptoSwift 앱에서 사용하는 방법을 이해합니다 #import <CommonCrypto/CommonCrypto.h>. 브리징 헤더에 추가 합니다. 그러나 Swift 프레임 워크는 브리징 헤더를 지원하지 않습니다. 문서는 말합니다 :

순수한 Objective-C 코드베이스, 순수한 Swift 코드베이스 또는 혼합 언어 코드베이스가있는 외부 프레임 워크를 가져올 수 있습니다. 외부 프레임 워크를 가져 오는 프로세스는 프레임 워크가 단일 언어로 작성되었는지 또는 두 언어의 파일을 포함하는지에 관계없이 동일합니다. 외부 프레임 워크를 가져올 때 가져 오려는 프레임 워크에 대한 모듈 빌드 정의 설정이 예로 설정되어 있는지 확인하십시오.

다음 구문을 사용하여 다른 대상 내의 Swift 파일로 프레임 워크를 가져올 수 있습니다.

import FrameworkName

불행히도 가져 오기 CommonCrypto가 작동하지 않습니다. #import <CommonCrypto/CommonCrypto.h>우산 헤더에 추가하지 않습니다 .


CommonCrypto는 Objective-C 프레임 워크가 아닌 C 기반 프레임 워크입니다.
rmaddy

1
@rmaddy Objective-C는 C 수퍼 셋입니다. Swift에서 CommonCrypto를 사용할 수 없다고 말씀하십니까?
hpique

4
@rmaddy 방금 모듈 맵을 사용하여 CommonCrypto를 작동시킬 수있었습니다. 솔루션을 연마하고 오늘 나중에 게시하겠습니다.
hpique

당신이 그것을 편리 성, 그리고 당신이 이미 구현되어 찾고 찾으면, 당신은에 시도 줄 수 CryptoSwift을
마르신

1
애플은 오픈 소스 CommonCrypto를 공개했다. 소스가 있으면 작동시킬 수도 있습니다.
eyeballz

답변:


137

조금 더 간단하고 강력한 것은 Run Script 단계로 "CommonCryptoModuleMap"이라는 집계 대상을 생성하여 올바른 Xcode / SDK 경로로 모듈 맵을 자동으로 생성하는 것입니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

스크립트 실행 단계에는 다음 bash가 포함되어야합니다.

# This if-statement means we'll only run the main script if the CommonCryptoModuleMap directory doesn't exist
# Because otherwise the rest of the script causes a full recompile for anything where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger the rest of the script to run
if [ -d "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap" ]; then
    echo "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap directory already exists, so skipping the rest of the script."
    exit 0
fi

mkdir -p "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap"
cat <<EOF > "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap/module.modulemap"
module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
EOF

쉘 코드를 사용 ${SDKROOT}하면 Xcode.app 경로를 하드 코딩 할 필요가 없으며 특히 시스템을 사용하는 경우 시스템마다 다를 수 있습니다xcode-select 베타 버전으로 전환하거나 여러 버전이 설치된 CI 서버에 구축하는 경우 비표준 위치. 또한 SDK를 하드 코딩 할 필요가 없으므로 iOS, macOS 등에서 작동합니다. 또한 프로젝트의 소스 디렉토리에 아무것도 없어도됩니다.

이 대상을 만든 후 대상 종속성 항목을 사용하여 라이브러리 / 프레임 워크에 종속되도록하십시오.

여기에 이미지 설명을 입력하십시오

이를 통해 프레임 워크가 빌드되기 전에 모듈 맵이 생성됩니다.

macOS 참고 : 지원하는 경우 방금 만든 새 집계 대상 의 빌드 설정에 macOS추가해야합니다 . 그렇지 않으면 나머지 맵이있는 올바른 파생 데이터 폴더 에 모듈 맵이 배치되지 않습니다 . 프레임 워크 제품.macosxSupported PlatformsDebug

여기에 이미지 설명을 입력하십시오

다음으로 ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMapSwift 섹션 ( SWIFT_INCLUDE_PATHS) 아래의 "Import Paths"빌드 설정에 모듈 맵의 상위 디렉토리를 추가하십시오 .

여기에 이미지 설명을 입력하십시오

$(inherited)프로젝트 또는 xcconfig 수준에서 검색 경로를 정의한 경우 줄 을 추가해야 합니다.

그게 다야 이제는 import CommonCrypto

Xcode 10 업데이트

Xcode 10은 이제 CommonCrypto 모듈 맵과 함께 제공되어이 해결 방법이 불필요합니다. Xcode 9와 10을 모두 지원하려면 스크립트 실행 단계에서 모듈 맵의 존재 여부를 확인하십시오.

COMMON_CRYPTO_DIR="${SDKROOT}/usr/include/CommonCrypto"
if [ -f "${COMMON_CRYPTO_DIR}/module.modulemap" ]
then
   echo "CommonCrypto already exists, skipping"
else
    # generate the module map, using the original code above
fi

8
이 답변은 맨 위에 있어야합니다. 간단하고 우아함
압둘라 세이드

1
이것에 대한 게임에 늦었지만-이것이 정답입니다. 간단하고 다른 개발자가 동일한 프로젝트에서 작업하여 요구 사항을보다 쉽게 ​​볼 수 있습니다.
fatuous.logic

1
좋은 대답입니다. 감사!
클라우스 버스

1
내 .framework 에서이 작업을 수행하는 경우이 프레임 워크를 포함하는 프로젝트에서 동일한 작업을 수행해야합니까?
라비 키란

2
@IanDundas 위의 코드를 재 컴파일 문제에 대한 수정과 macOS에서 이것을 사용하기위한 수정으로 업데이트했습니다
iwasrobbed at

91

실제로 "작동하는"솔루션을 만들 수 있습니다 ( 여기에서 다른 솔루션에 필요한대로 module.modulemapSWIFT_INCLUDE_PATHS설정을 프로젝트 에 복사 할 필요는 없음 ).하지만 더미 프레임 워크 / 모듈을 만들어야합니다. 프레임 워크로 가져옵니다. 우리는 또한이 플랫폼에 관계없이 작동하는지 확인 할 수 있습니다 ( iphoneos, iphonesimulator또는 macosx).

  1. 당신의 프로젝트에 새 프레임 워크 대상을 추가하고 시스템 라이브러리 후 이름을 예를 들어 , "CommonCrypto". (우산 헤더 CommonCrypto.h를 삭제할 수 있습니다 .)

  2. 구성 설정 파일을 추가 하고 이름을 지정하십시오 ( 예 : "CommonCrypto.xcconfig"). 포함 할 대상을 확인하지 마십시오. 다음으로 채워 넣으십시오.

    MODULEMAP_FILE[sdk=iphoneos*]        = \
        $(SRCROOT)/CommonCrypto/iphoneos.modulemap
    MODULEMAP_FILE[sdk=iphonesimulator*] = \
        $(SRCROOT)/CommonCrypto/iphonesimulator.modulemap
    MODULEMAP_FILE[sdk=macosx*]          = \
        $(SRCROOT)/CommonCrypto/macosx.modulemap
  3. 위의 세 가지 참조 모듈 맵 파일을 작성하고 다음으로 채우십시오.

    • iphoneos.modulemap

      module CommonCrypto [system] {
          header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h"
          export *
      }
    • iphonesimulator.modulemap

      module CommonCrypto [system] {
          header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/CommonCrypto/CommonCrypto.h"
          export *
      }
    • macosx. 모듈 맵

      module CommonCrypto [system] {
          header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/CommonCrypto/CommonCrypto.h"
          export *
      }

    베타 버전을 실행중인 경우 "Xcode.app"를 "Xcode-beta.app"로 바꾸 10.11십시오. El Capitan을 실행하지 않는 경우 현재 OS SDK로 교체하십시오 .

  4. 프로젝트 설정 의 정보 탭에서 구성 아래 의 디버그릴리스 구성을 설정하십시오. CommonCrypto을CommonCrypto (참조 CommonCrypto.xcconfig ).

  5. 프레임 워크 대상의 빌드 단계 탭에서 CommonCrypto 프레임 워크를 대상 종속성에 추가하십시오. . 또한 라이브러리와 바이너리 연결 빌드 단계 에 libcommonCrypto.dylib 를 추가하십시오 .

  6. 제품 에서 CommonCrypto.framework 를 선택 하고 랩퍼 대상 멤버쉽선택 사항 으로 설정되어 .

이제 import CommonCrypto래퍼 프레임 워크에서 빌드, 실행 및 실행할 수 있어야합니다 .

예를 들어, SQLite.swift 가 더미 sqlite3.framework를 사용하는 방법을 보십시오 .


4
단계 (5)없이 나를 위해 작동합니다. 그것으로 빌드 오류가 발생합니다 :ld: cannot link directly with /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.2.sdk/usr/lib/system/libcommonCrypto.dylib. Link against the umbrella framework 'System.framework' instead. for architecture x86_64
stannie

4
우수한! 이것을 사용하여 github.com/soffes/Crypto 를 만들지 않아도 링크 할 필요가 없습니다 System.framework. 프레임 워크가 크로스 플랫폼이라면 Mac과 iOS 용으로 별도의 래퍼 프레임 워크를 만들어야합니다.
Sam Soffes

32
사람들은 이런 것들을 어떻게 또는 어디서 찾습니까?
hola

5
1 단계에서 Objective-C를 언어로 선택해야 함을 명심하십시오. 이것은 쉽게 간과됩니다. 또한 .dylib가 없기 때문에 5 단계에서 .framework를 추가해야했습니다.
Teo Sartori

7
이것은 끔찍하다. 나는 각각 다른 방식으로 깨진 Xcode 동물원을 가지고 있으며 모든 곳의 헤더에 대한 절대 경로를 갖는 것은 puke를 호출하는 것입니다. 뭔가 쿠퍼 티노에서 굉장히 잘못된 것, 또는 누구와 적어도이 modulemap 혼란의 책임입니다
안톤 Tropashko

82

Swift 프레임 워크에서 CommonCrypto를 성공적으로 사용하는 GitHub 프로젝트를 발견했습니다 : SHA256-Swift . 또한 sqlite3의 동일한 문제 에 대한이 기사 가 유용했습니다.

위의 단계에 따라 단계는 다음과 같습니다.

1) CommonCrypto프로젝트 디렉토리 안에 디렉토리를 만듭니다 . 안에 module.map파일을 만듭니다 . 모듈 맵을 통해 CommonCrypto 라이브러리를 Swift 내에서 모듈로 사용할 수 있습니다. 내용은 다음과 같습니다.

module CommonCrypto [system] {
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/usr/include/CommonCrypto/CommonCrypto.h"
    link "CommonCrypto"
    export *
}

2) 빌드 설정의 Swift Compiler-Search Paths 에서 CommonCrypto디렉토리를 Import Paths ( SWIFT_INCLUDE_PATHS)에 추가하십시오 .

빌드 설정

3) 마지막으로 Swift 파일에서 CommonCrypto를 다른 모듈로 가져옵니다. 예를 들면 다음과 같습니다.

import CommonCrypto

extension String {

    func hnk_MD5String() -> String {
        if let data = self.dataUsingEncoding(NSUTF8StringEncoding)
        {
            let result = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))
            let resultBytes = UnsafeMutablePointer<CUnsignedChar>(result.mutableBytes)
            CC_MD5(data.bytes, CC_LONG(data.length), resultBytes)
            let resultEnumerator = UnsafeBufferPointer<CUnsignedChar>(start: resultBytes, length: result.length)
            let MD5 = NSMutableString()
            for c in resultEnumerator {
                MD5.appendFormat("%02x", c)
            }
            return MD5
        }
        return ""
    }
}

한계

컴파일시 다른 프로젝트에서 사용자 지정 프레임 워크를 사용하면 오류가 발생하여 실패합니다 missing required module 'CommonCrypto'. CommonCrypto 모듈이 사용자 지정 프레임 워크에 포함되어 있지 않기 때문입니다. 해결 방법은 Import Paths프레임 워크를 사용하는 프로젝트에서 2 단계 (설정 ) 를 반복 하는 것입니다.

모듈 맵은 플랫폼 독립적이지 않습니다 (현재는 특정 플랫폼, iOS 8 시뮬레이터를 가리킴). 현재 플랫폼을 기준으로 헤더 경로를 만드는 방법을 모르겠습니다.

iOS 8 업데이트 <= 줄을 제거해야합니다 성공적인 컴파일을 위해 "CommonCrypto" 링크를 .

업데이트 / 편집

다음과 같은 빌드 오류가 계속 발생했습니다.

ld : x86_64 아키텍처의 -lCommonCrypto 라이브러리를 찾을 수 없음 : 오류 : 종료 코드 1에서 링커 명령이 실패했습니다 (호출을 보려면 -v 사용).

내가 만든 파일 에서 줄 link "CommonCrypto"을 제거하지 않으면 module.map이 줄을 제거하면 정상적으로 빌드되었습니다.


30
Gee, Apple은 확실히 일을 어렵게 만들고 싶어합니다. 이 모든 BS를 거치지 않고 파일 / 프레임 워크를 가져올 수 있도록 Swifties를 죽일 수 있습니까?
zaph

4
$SDKROOT변수가 플랫폼에 무관심한 경로를 허용해야하기 때문에 이것은 분노 입니다.
danimal

2
나를 link "CommonCrypto"위해 module.map 파일에서를 제거 할 때까지 작동하지 않았습니다 .
Teo Sartori 2016 년

1
누구나 Xcode 7.3 에서이 작업을 확인할 수 있습니까? 이 솔루션은 업데이트 후 작동이 중지되었습니다.
Nikita Kukushkin

1
수정 : 시뮬레이터를 빌드 할 때 제대로 작동하지만 "ld : 아키텍처 arm64 용 -lCommonCrypto에 대한 라이브러리를 찾을 수 없음"으로 iOS 9.3 장치를 빌드 할 때 @ 링크에 실패 함
Nikita Kukushkin

50

이 답변에서는 프레임 워크 내에서 Cocoapods 및 Carthage와 함께 작동하는 방법에 대해 설명합니다.

🐟 모듈 맵 접근법

modulemapCommonCrypto https://github.com/onmyway133/arcane , https://github.com/onmyway133/Reindeer 주변 래퍼에서 사용합니다 .

받는 사람 header not foundhttps://github.com/onmyway133/Arcane/issues/4를 보거나 실행하십시오.xcode-select --install

  • CCommonCrypto포함 하는 폴더 만들기module.modulemap

      module CCommonCrypto {
        header "/usr/include/CommonCrypto/CommonCrypto.h"
        export *
      }
  • 기본 설정으로 이동-> 경로 가져 오기

      ${SRCROOT}/Sources/CCommonCrypto

🌳 모듈 식 접근 방식의 Cocoapods

🐘 공개 헤더 접근

공개 헤더 접근 방식의 Cocoapod

🐝 재미있는 관련 게시물


1
와! 놀랍게도, 이전 접근 방식 (module.modulemap 파일 작성)의 헤더 경로는 이전에 모듈 맵 파일이 많은 문제를 일으켰을 때 훌륭하게 작동했습니다. /CommonCrypto/CommonCrypto.hwithin에 대한 절대 경로가있는 module.modulemap 파일을 사용하는 동안이 문제로 어려움을 겪었습니다 Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS.....XCode의 이름을 바꾼 사람들에게는 수동 수정이 필요했습니다. 해당 줄을 전환 "/usr/include/CommonCrypto/CommonCrypto.h"하여 여러 XCode 버전을 가진 팀에게는 잘 작동하는 것 같습니다. 정말 고맙습니다!
Natalia

3
포드를 만들면서 SWIFT_INCLUDE_PATHS 및 preserve_paths를 설정했습니다. 내가 실행할 때 pod lib lint오류가 발생하여 빌드가 실패했습니다 : 해당 모듈 'CommonCrypto'가 없습니다. 어떻게 처리 할 수 ​​있습니까?
Klein Mioke

1
문제와 관련이 없지만 이모지를 총알로 사용하는 것을 좋아합니다! 😊
Fomentia

2
@ onmyway133 바꿀 경우 지역 개발 포드의 작품을 사용 $(PODS_ROOT)/CommonCryptoSwift/Sources/CCommonCrypto하여 $(PODS_TARGET_SRCROOT)/Sources/CCommonCrypto. PODS_TARGET_SRCROOT로컬 포드에 올바르게 설정되어 있습니다.
Orkhan Alikhanov

큰 답변, 내 생명을 구했습니다! 감사합니다 백만
Hassan Shahbazi

45

좋은 소식! 스위프트 4.2 (Xcode 10)는 마침내 CommonCrypto를 제공합니다!

import CommonCrypto신속한 파일을 추가 하십시오.


좋은 소식! 문서에 대한 링크를 추가 할 수 있습니까?
Kryštof Matěj 2016 년

문서에 대한 링크가 없으며 Xcode 10으로 해결 방법 중 하나가있는 프로젝트를 컴파일하려고 시도하면서 이것을 발견했습니다.이 CommonCrypto모듈을 찾을 수 있다고 불평했습니다. '봐라! 사실이었다. 나는 그것에 대해 트윗했고 애플 엔지니어는 그것이 의도되었다는 것을 확인하면서 대답했다.
mxcl

1
App Store는 9.4.7을 사용 가능한 업데이트로 표시합니다 .Xcode 10을 어떻게 얻었습니까?
Hammad Tariq 2016 년

1
사소한 Google 검색에서 알 수 있듯이 베타 버전입니다.
mxcl

1
@SmoyDasGupta 예. 이전 가져 오기를 제거하고 다시 컴파일하십시오. 즉, MikeWeller 응답에서 단계를 수행 할 필요가 없습니다
차가운 얼음

7

경고 : iTunesConnect는 이 방법을 사용하는 응용 프로그램을 거부 할 수 있습니다 .


우리 팀의 새 멤버가 실수로 최고의 답변 중 하나가 제공 한 솔루션을 중단했기 때문에 CommonCryptoModule 이라는 작은 래퍼 프로젝트로 솔루션을 통합하기로 결정했습니다 . 수동으로 또는 Cocoapods를 통해 설치할 수 있습니다.

pod 'CommonCryptoModule', '~> 1.0.2'

그런 다음 필요한 부분을 다음 CommonCrypto과 같이 가져 오면됩니다 .

import CommonCryptoModule

다른 사람이 이것을 유용하게 사용하기를 바랍니다.


경고 :이 방법을 사용하면 신청이 거부됩니다!
Segabond

그러나이 방법을 사용하여 몇 달 동안 아무런 문제없이 업로드했기 때문에 거부당했습니다.
Nikita Kukushkin

5

Mike Weller의 훌륭한 작품이 개선 된 것 같습니다.

Compile Sources이 bash를 포함하는 단계 전에 스크립트 실행 단계를 추가하십시오 .

# This if-statement means we'll only run the main script if the
# CommonCrypto.framework directory doesn't exist because otherwise
# the rest of the script causes a full recompile for anything
# where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger
# the rest of the script to run

FRAMEWORK_DIR="${BUILT_PRODUCTS_DIR}/CommonCrypto.framework"

if [ -d "${FRAMEWORK_DIR}" ]; then
echo "${FRAMEWORK_DIR} already exists, so skipping the rest of the script."
exit 0
fi

mkdir -p "${FRAMEWORK_DIR}/Modules"
cat <<EOF > "${FRAMEWORK_DIR}/Modules/module.modulemap"
module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
EOF

ln -sf "${SDKROOT}/usr/include/CommonCrypto" "${FRAMEWORK_DIR}/Headers"

이 스크립트는 올바른 위치에 module.map을 사용하여 베어 본 프레임 워크를 구성한 다음 Xcode의 자동 검색을 사용합니다. BUILT_PRODUCTS_DIR 프레임 워크 합니다.

원래 CommonCrypto include 폴더를 프레임 워크의 Headers 폴더로 연결 했으므로 Objective C 프로젝트에서도 결과가 작동해야합니다.


CocoaPods 사용법을 개선 한 내용은 dvdblk의 답변 을 참조하십시오 .
jjrscott


4

@mogstad는 Cocoapod에서 @stephencelis 솔루션을 포장 할만큼 친절했습니다.

포드 'libCommonCrypto'

사용 가능한 다른 포드가 작동하지 않았습니다.


4

모듈 맵 솔루션은 훌륭 할 수 있으며 SDK 변경에 대해 강력하지만 실제로는 사용하기 어색하지만 다른 사람들에게 나눠 줄만큼 신뢰할 수는 없습니다. 더 무모하게 만들려고 다른 길을 갔다.

헤더를 복사하십시오.

깨지기 쉽다. 그러나 Apple은 CommonCrypto를 거의 변경하지 않았으며 CommonCrypto를 모듈 식 헤더로 만들지 않으면 어떤 식으로도 변경하지 않을 것이라는 꿈을 꿉니다.

"헤더를 복사"한다는 것은 "전처리 기와 마찬가지로 필요한 모든 헤더를 잘라내어 프로젝트의 하나의 거대한 헤더에 붙여 넣습니다"라는 의미입니다. 복사하거나 적용 할 수있는 예로 RNCryptor.h를 참조하십시오 . .

이러한 모든 파일은 APSL 2.0에 따라 라이센스가 부여되며이 접근 방식은 의도적으로 저작권 및 라이센스 통지를 유지합니다. 연결 단계는 MIT에 따라 라이센스가 부여되며 다음 라이센스 통지에만 적용됩니다).

나는 이것이 아름다운 해결책이라고 말하지는 않지만, 지금까지는 구현과 지원 모두에 대해 매우 간단한 해결책 인 것 같습니다.


나는 이것이 안정적으로 컴파일되는 것을 알았고 간단합니다. 프레임 워크를 사용하는 응용 프로그램이 특별한 링크를해야합니까, 아니면 CommonCrypto를 항상 사용할 수 있습니까?
codingFriend1 1

1
나는 Security.framework자동으로 연결되어 있다고 생각 합니다 (새 프로젝트를 시작한 이래 조금 시간이 걸립니다). 오류가 발생하면 이것이 연결되는 프레임 워크입니다.
Rob Napier

이것은 가장 간단한 솔루션처럼 보이며 한 컴퓨터에서 훌륭하게 작동하지만 다른 프레임 워크 또는 응용 프로그램에서 다른 프레임 워크 또는 응용 프로그램에서 프레임 워크를 사용할 때마다 'missing module'오류가 발생합니다.
richever

2

나는 이것이 오래된 질문이라는 것을 안다. 그러나 Swift 프로젝트에서 라이브러리를 사용하는 다른 방법을 알아 냈습니다.이 답변에 소개 된 프레임 워크를 가져오고 싶지 않은 사람들에게 도움이 될 수 있습니다.

Swift 프로젝트에서 Objective-C 브리징 헤더를 생성하고 Objective-C에서 NSData 범주 (또는 라이브러리를 사용할 사용자 정의 클래스)를 생성하십시오. 유일한 단점은 Objective-C로 모든 구현 코드를 작성해야한다는 것입니다. 예를 들면 다음과 같습니다.

#import "NSData+NSDataEncryptionExtension.h"
#import <CommonCrypto/CommonCryptor.h>

@implementation NSData (NSDataEncryptionExtension)
- (NSData *)AES256EncryptWithKey:(NSString *)key {
    //do something
}

- (NSData *)AES256DecryptWithKey:(NSString *)key {
//do something
}

그리고 objective-c 브리징 헤더에 이것을 추가하십시오

#import "NSData+NSDataEncryptionExtension.h"

그리고 Swift 클래스에서 비슷한 일을합니다.

public extension String {
func encryp(withKey key:String) -> String? {
    if let data = self.data(using: .utf8), let encrypedData = NSData(data: data).aes256Encrypt(withKey: key) {
        return encrypedData.base64EncodedString()
    }
    return nil
}
func decryp(withKey key:String) -> String? {
    if let data = NSData(base64Encoded: self, options: []), let decrypedData = data.aes256Decrypt(withKey: key) {
        return decrypedData.UTF8String
    }
    return nil
}
}

예상대로 작동합니다.


이것은 매우 매끄럽게 작동하며 내부를 유지할 NSData+NSDataEncryptionExtension.h수 있습니다 (공개 필요는 없습니다).
Raphael

그러나이 OS를 사용하려면 어떤 OS 프레임 워크를 연결해야합니까? 다른 것과는 달리-Obj-C 프로젝트에서 CommonCrypto와 함께 작업해야하며 MacOS-10.13 SDK를 사용하는 Xcode 9에서만 작동합니다.
Motti Shneor

@MottiShneor 10.9 이상의 OS를 연결하십시오. 나는 동일한 환경에서 일하고 있으며 잘 작동합니다.
Terence

2

cocoapods 라이브러리에서 CommonCrypto를 사용해야 할 경우를 대비하여 jjrscott의 답변에 cocoapods 마술을 추가했습니다.


1) 이 행을 podspec에 추가하십시오.

s.script_phase = { :name => 'CommonCrypto', :script => 'sh $PROJECT_DIR/../../install_common_crypto.sh', :execution_position => :before_compile }

2) 이것을 라이브러리 폴더 또는 원하는 곳에 저장하십시오 (단, 그에 따라 script_phase를 변경하는 것을 잊지 마십시오 ...)

# This if-statement means we'll only run the main script if the
# CommonCrypto.framework directory doesn't exist because otherwise
# the rest of the script causes a full recompile for anything
# where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger
# the rest of the script to run
FRAMEWORK_DIR="${BUILT_PRODUCTS_DIR}/CommonCrypto.framework"

if [ -d "${FRAMEWORK_DIR}" ]; then
echo "${FRAMEWORK_DIR} already exists, so skipping the rest of the script."
exit 0
fi

mkdir -p "${FRAMEWORK_DIR}/Modules"
echo "module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}" >> "${FRAMEWORK_DIR}/Modules/module.modulemap"

ln -sf "${SDKROOT}/usr/include/CommonCrypto" "${FRAMEWORK_DIR}/Headers"

매력처럼 작동합니다 :)


포드 사양 파일과 함께 데모 또는 샘플 프레임 워크 프로젝트를 제공 할 수 있습니까?
Gowtham

0

Xcode 9.2로 변경된 것이 있는지 확실하지 않지만이를 달성하는 것이 훨씬 간단합니다. 내가해야 할 것은 프레임 워크 프로젝트 디렉토리에 "CommonCrypto"라는 폴더를 만들고 그 안에 다음과 같이 "cc.h"라는 두 개의 파일을 만드는 것입니다.

#include <CommonCrypto/CommonCrypto.h>
#include <CommonCrypto/CommonRandom.h>

또 다른 module.modulemap :

module CommonCrypto {
    export *
    header "cc.h"
}

(모듈 맵 파일에서 SDKROOT 영역의 헤더 파일을 직접 참조 할 수없는 이유는 모르겠지만 작동하지 못했습니다)

세 번째는 "Import Paths"설정을 찾아 $ (SRCROOT)로 설정하는 것입니다. 루트 수준에서 원하지 않는 경우 CommonCrypto 폴더 아래에있는 폴더로 설정할 수 있습니다.

이 후 당신은 사용할 수 있어야합니다

import CommonCrypto

신속한 파일과 모든 유형 / 기능 / 등. 사용할 수 있습니다.

경고의 한마디-앱에서 libCommonCrypto (또는 libcoreCrypto)를 사용하는 경우 너무 정교하지 않은 해커가 앱에 디버거를 연결하고 이러한 키가 어떤 함수에 전달되는지 알아내는 것은 매우 쉽습니다.


0

다음과 같은 문제가있는 경우 :

ld : -lapple_crypto clang에 대한 라이브러리를 찾을 수 없음 : 오류 : 종료 코드 1에서 링커 명령이 실패했습니다 (-v를 사용하여 호출 참조).

Xcode 10, Swift 4.0에서. CommonCrypto는 프레임 워크의 일부입니다.

더하다

 import CommonCrypto

없애다

  • 빌드 단계의 라이브러리와 링크 2 진의 CommonCrpto lib 파일
  • import CommonCrypto 브리징 헤더에서

이것은 나를 위해 일했다!


-1

Xcode를 업데이트 한 후에도 마찬가지입니다. cocoapods 재설치 및 프로젝트 정리와 같이 할 수있는 모든 것을 시도했지만 작동하지 않았습니다. 이제 시스템 을 다시 시작한 후에 해결되었습니다 .


-13

매우 간단합니다. 더하다

#import <CommonCrypto/CommonCrypto.h>

.h 파일 (프로젝트의 브리징 헤더 파일)에. 컨벤션으로 YourProjectName-Bridging-Header.h라고 부를 수 있습니다.

그런 다음 프로젝트 빌드 설정으로 이동하여 Swift Compiler-Code Generation을 찾으십시오. 그 아래에서 브리징 헤더 이름을 "Objetive-C 브리징 헤더"항목에 추가하십시오.

끝났습니다. Swift 코드에서 가져 오기가 필요하지 않습니다. 이 브리징 헤더 파일에 나열된 공개 Objective-C 헤더는 Swift에 표시됩니다.


방법은 오류를 반환합니다 : 프레임 워크 대상과 브리징 헤더를 사용하는 것은 지원되지 않습니다
gorgi93

5
@ gorgi93 오류에서 알 수 있듯이 프레임 워크 대상에서 브리징 헤더를 사용할 수 없습니다. 유일하게 옵션은 기본 프레임 워크 헤더 파일에 넣는 것입니다.
Charles A.

1
이 스레드의 제목을 실제로 빨간색으로 지정했다면 그 사람이 CommonCrypto 라이브러리를 Swift 프레임 워크로 가져오고 싶어한다는 것을 알았을 것입니다. 프레임 워크에서 브리징 헤더를 사용할 수 없으며 CommonCrypto 프레임 워크를 우산 헤더로 가져올 수 없습니다.
miken.mkndev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.