Importación de CommonCrypto en un marco Swift

184

¿Cómo se importa CommonCryptoen un marco Swift para iOS?

Entiendo cómo usar CommonCryptoen una aplicación Swift: se agrega #import <CommonCrypto/CommonCrypto.h>al encabezado de puente. Sin embargo, los marcos Swift no admiten encabezados de puente. La documentación dice:

Puede importar marcos externos que tengan una base de código pura de Objective-C, una base de código de Swift pura o una base de código de lenguaje mixto. El proceso para importar un marco externo es el mismo si el marco está escrito en un solo idioma o contiene archivos de ambos idiomas. Cuando importe un marco externo, asegúrese de que la configuración de compilación del módulo Defines para el marco que está importando esté establecida en Sí.

Puede importar un marco en cualquier archivo Swift dentro de un destino diferente utilizando la siguiente sintaxis:

import FrameworkName

Desafortunadamente, la importación CommonCryptono funciona. Tampoco agrega #import <CommonCrypto/CommonCrypto.h>al encabezado paraguas.

hpique
fuente
CommonCrypto es un marco basado en C, no un marco Objective-C.
rmaddy
1
@rmaddy Objective-C es un superconjunto de C. ¿Estás diciendo que no podemos usar CommonCrypto de Swift?
hpique
44
@rmaddy Acabo de lograr que CommonCrypto funcione usando mapas de módulos. Puliré la solución y la publicaré más tarde hoy.
hpique
si le resulta conveniente, y lo que está buscando ya está implementado, puede probar CryptoSwift
Marcin el
1
Apple acaba de abrir CommonCrypto de fuente. Tal vez podamos hacerlo funcionar si tenemos las fuentes.
eyeballz

Respuestas:

137

Algo un poco más simple y robusto es crear un objetivo agregado llamado "CommonCryptoModuleMap" con una fase Ejecutar script para generar el mapa del módulo automáticamente y con la ruta correcta de Xcode / SDK:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

La fase Ejecutar script debe contener este 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

Usar el código de shell y ${SDKROOT}significa que no tiene que codificar la ruta Xcode.app que puede variar de un sistema a otro, especialmente si usa xcode-selectpara cambiar a una versión beta, o está construyendo en un servidor CI donde se instalan múltiples versiones en ubicaciones no estándar. Tampoco necesita codificar el SDK, por lo que debería funcionar para iOS, macOS, etc. Tampoco necesita tener nada en el directorio de origen de su proyecto.

Después de crear este objetivo, haga que su biblioteca / marco dependa de él con un elemento de Dependencias de destino:

ingrese la descripción de la imagen aquí

Esto asegurará que el mapa del módulo se genere antes de construir su marco.

nota de macOS : si también es compatible macOS, deberá agregar macosxa la Supported Platformsconfiguración de compilación en el nuevo destino agregado que acaba de crear, de lo contrario no colocará el mapa del módulo en la Debugcarpeta de datos derivados correcta con el resto del productos marco.

ingrese la descripción de la imagen aquí

A continuación, agregue el directorio principal del mapa del módulo ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap, a la configuración de compilación "Importar rutas" en la sección Swift ( SWIFT_INCLUDE_PATHS):

ingrese la descripción de la imagen aquí

Recuerde agregar una $(inherited)línea si tiene rutas de búsqueda definidas en el proyecto o en el nivel xcconfig.

Eso es todo, ahora deberías poder import CommonCrypto

Actualización para Xcode 10

Xcode 10 ahora viene con un mapa del módulo CommonCrypto que hace innecesaria esta solución alternativa. Si desea admitir Xcode 9 y 10, puede hacer una comprobación en la fase Ejecutar script para ver si el mapa del módulo existe o no, por ejemplo

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
Mike Weller
fuente
8
Esta respuesta debería estar en la parte superior. Simple y elegante
Abdullah Saeed
1
Tarde al juego en este caso, pero esta debería ser la respuesta elegida. Es simple y es más fácil para otros desarrolladores que trabajan en el mismo proyecto ver el requisito.
fatuous.logic
1
Gran respuesta. ¡Gracias!
Klaus Busse
1
Si hago esto en mi .framework, ¿debería hacer lo mismo en los proyectos donde incluyo este marco?
Ravi Kiran
2
@IanDundas He actualizado el código anterior con una solución para el problema re-compilación, así como una solución para el uso de esta en MacOS
iwasrobbed
91

En realidad, puede crear una solución que "simplemente funcione" (no es necesario copiar un módulo.modulemap y SWIFT_INCLUDE_PATHSconfiguraciones a su proyecto, como lo requieren otras soluciones aquí), pero sí requiere que cree un marco / módulo ficticio que usted ' Importaremos en su marco propiamente dicho. También podemos asegurar que funcione independientemente de la plataforma ( iphoneos, iphonesimulatoro macosx).

  1. Agregue un nuevo objetivo de marco a su proyecto y asígnele el nombre de la biblioteca del sistema, por ejemplo , "CommonCrypto". (Puede eliminar el encabezado general, CommonCrypto.h .)

  2. Agregue un nuevo archivo de ajustes de configuración y asígnele un nombre, por ejemplo , "CommonCrypto.xcconfig". (No marque ninguno de sus objetivos para su inclusión). Rellene con lo siguiente:

    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. Cree los tres archivos de mapa del módulo referenciados, arriba, y complételos con lo siguiente:

    • 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.modulemap

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

    (Reemplace "Xcode.app" con "Xcode-beta.app" si está ejecutando una versión beta. Reemplácelo 10.11con su SDK de sistema operativo actual si no está ejecutando El Capitan).

  4. En la pestaña Información de la configuración de su proyecto, en Configuraciones , configure las configuraciones Debug and Release de CommonCrypto en CommonCrypto ( haciendo referencia a CommonCrypto.xcconfig ).

  5. En la pestaña Fases de compilación del objetivo del marco , agregue el marco CommonCrypto a las dependencias de destino . Además, agregue libcommonCrypto.dylib a la fase de compilación Enlace binario con bibliotecas .

  6. Seleccione CommonCrypto.framework en Productos y asegúrese de que la Membresía de destino para su contenedor esté configurada como Opcional .

Ahora debería poder compilar, ejecutar y import CommonCryptoen su marco de envoltura.

Para ver un ejemplo, vea cómo SQLite.swift usa un sqlite3.framework ficticio .

stephencelis
fuente
44
Funciona para mí sin paso (5). Con él obtengo un error de compilación: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
44
¡Excelente! Usé esto para hacer github.com/soffes/Crypto , aunque no tuve que vincularlo System.framework. Vale la pena señalar, debe hacer un marco de envoltorio separado para Mac e iOS si su marco es multiplataforma.
Sam Soffes
32
¿Cómo o dónde descubre la gente cosas como esta?
hola
55
Solo una nota deja en claro que debe seleccionar Objective-C como lenguaje en el paso 1. Esto se pasa por alto fácilmente. Además, quizás porque no tenía un .dylib, necesitaba agregar el .framework en el paso 5.
Teo Sartori
77
Esto es horrible. Tengo un zoológico de códigos X cada uno roto de diferentes maneras y tener los caminos absolutos a los encabezados por todo el lugar es una invocación vomitiva. Algo va terriblemente mal en cupertino, o al menos con quien está a cargo de este desastre de mapa de módulos
Anton Tropashko
82

Encontré un proyecto de GitHub que utiliza con éxito CommonCrypto en un marco Swift: SHA256-Swift . Además, este artículo sobre el mismo problema con sqlite3 fue útil.

En base a lo anterior, los pasos son:

1) Cree un CommonCryptodirectorio dentro del directorio del proyecto. Dentro, crea un module.maparchivo. El mapa del módulo nos permitirá usar la biblioteca CommonCrypto como módulo dentro de Swift. Sus contenidos son:

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) En Configuración de compilación, dentro del compilador Swift - Buscar rutas , agregue el CommonCryptodirectorio a Importar rutas ( SWIFT_INCLUDE_PATHS).

Configuración de compilación

3) Finalmente, importe CommonCrypto dentro de sus archivos Swift como cualquier otro módulo. Por ejemplo:

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 ""
    }
}

Limitaciones

El uso del marco personalizado en otro proyecto falla en el momento de la compilación con el error missing required module 'CommonCrypto'. Esto se debe a que el módulo CommonCrypto no parece estar incluido con el marco personalizado. Una solución alternativa es repetir el paso 2 (configuración Import Paths) en el proyecto que usa el marco.

El mapa del módulo no es independiente de la plataforma (actualmente apunta a una plataforma específica, el simulador de iOS 8). No sé cómo hacer la ruta del encabezado en relación con la plataforma actual.

Actualizaciones para iOS 8 <= Debemos eliminar el enlace de línea "CommonCrypto" , para obtener una compilación exitosa.

ACTUALIZAR / EDITAR

Seguí recibiendo el siguiente error de compilación:

ld: biblioteca no encontrada para -lCommonCrypto para arquitectura x86_64 clang: error: el comando del enlazador falló con el código de salida 1 (use -v para ver la invocación)

A menos que elimine la línea link "CommonCrypto"del module.maparchivo que creé. Una vez que eliminé esta línea, se construyó bien.

hpique
fuente
30
Cielos, Apple seguramente quiere hacer las cosas difíciles. ¿Mataría a los Swifties simplemente dejarnos importar archivos / frameworks sin tener que pasar por todo este BS?
zaph
44
Esto es exasperante, ya $SDKROOTque se supone que la variable le permite caminos agnósticos de plataforma, pero no tengo idea de cómo llegar a eso en Swift.
danimal
2
Para mí no funcionó hasta que link "CommonCrypto"eliminé el archivo module.map.
Teo Sartori
1
¿Alguien puede confirmar que esto funciona en Xcode 7.3? Esta solución dejó de funcionar para mí después de la actualización.
Nikita Kukushkin
1
Corrección: funciona bien cuando compilo para el simulador, pero falla al vincular cuando compilo para un dispositivo iOS 9.3 con "ld: biblioteca no encontrada para -lCommonCrypto para arquitectura arm64"
Nikita Kukushkin
50

Esta respuesta discute cómo hacer que funcione dentro de un marco, y con Cocoapods y Carthage

Approach enfoque de mapa de módulo

Lo uso modulemapen mi contenedor alrededor de CommonCrypto https://github.com/onmyway133/arcane , https://github.com/onmyway133/Reindeer

Para aquellos que están obteniendo header not found, eche un vistazo https://github.com/onmyway133/Arcane/issues/4 o ejecutexcode-select --install

  • Hacer una carpeta que CCommonCryptocontengamodule.modulemap

      module CCommonCrypto {
        header "/usr/include/CommonCrypto/CommonCrypto.h"
        export *
      }
  • Vaya a Configuración integrada -> Importar rutas

      ${SRCROOT}/Sources/CCommonCrypto

🌳 Cocoapods con enfoque de mapa de módulo

Approach enfoque de encabezado público

🐏 Cocoapods con enfoque de encabezado público

🐝 Publicaciones relacionadas interesantes

onmyway133
fuente
1
¡Guauu! Para mi sorpresa, la ruta del encabezado desde el enfoque superior (creación del archivo module.modulemap) funcionó muy bien cuando anteriormente los archivos modulemap habían causado muchos problemas. Había estado luchando con esto durante un tiempo usando un archivo module.modulemap con una ruta absoluta hacia /CommonCrypto/CommonCrypto.hdentro Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS...., lo que requería una modificación manual para las personas que cambiaron el nombre de XCode. Cambiar esa línea para mirar "/usr/include/CommonCrypto/CommonCrypto.h"parece funcionar bien para un equipo con varias versiones de XCode. Muchas gracias!
Natalia
3
Estoy creando un pod, configuré SWIFT_INCLUDE_PATHS y preserve_paths. Cuando ejecuto pod lib lint, pero la compilación falló con un error: no existe tal módulo 'CommonCrypto'. ¿Cómo puedo lidiar con eso?
Klein Mioke
1
¡No está relacionado con el problema, pero me encanta el uso de emoji como balas! 😊
Fomentia
2
@ onmyway133 Usar el pod de desarrollo local funciona si lo reemplaza $(PODS_ROOT)/CommonCryptoSwift/Sources/CCommonCryptocon $(PODS_TARGET_SRCROOT)/Sources/CCommonCrypto. PODS_TARGET_SRCROOTestá configurado correctamente para los pods locales.
Orkhan Alikhanov
Gran respuesta, me salvó la vida! Un millón de gracias
Hassan Shahbazi,
45

¡Buenas noticias! ¡Swift 4.2 (Xcode 10) finalmente proporciona CommonCrypto!

Simplemente agregue import CommonCryptosu archivo rápido.

mxcl
fuente
¡Una gran noticia! ¿Puedes agregar el enlace a la documentación?
Kryštof Matěj
No tengo un enlace a la documentación, descubrí esto mientras intentaba compilar un proyecto donde tenía una de las soluciones aquí con Xcode 10. Se quejó de que podía encontrar dos CommonCryptomódulos, por lo que sospechaba que Apple ahora proporcionaba que eliminé mi solución y 'lo! Eso era cierto. Tuiteé al respecto y un ingeniero de Apple respondió confirmando que estaba destinado.
mxcl
1
La tienda de aplicaciones solo me muestra 9.4.7 como una actualización disponible, ¿cómo obtuviste Xcode 10?
Hammad Tariq
1
Está en beta como una búsqueda trivial de Google te hubiera dicho.
mxcl
1
@SomoyDasGupta sí. Simplemente elimine la importación anterior y compílela nuevamente. En otras palabras, no tiene que seguir los pasos de la respuesta de MikeWeller
COLD ICE
7

ADVERTENCIA: iTunesConnect puede rechazar aplicaciones que utilizan este método.


El nuevo miembro de mi equipo accidentalmente rompió la solución dada por una de las principales respuestas, por lo que decidí consolidarla en un pequeño proyecto de envoltura llamado CommonCryptoModule . Puede instalarlo manualmente o mediante Cocoapods:

pod 'CommonCryptoModule', '~> 1.0.2'

Luego, todo lo que tiene que hacer es importar el módulo donde lo necesite CommonCrypto, así:

import CommonCryptoModule

Espero que alguien más encuentre esto útil.

Nikita Kukushkin
fuente
Advertencia: su aplicación será rechazada si utiliza este método.
Segabond
Sí, también fuimos rechazados, muy extraño, porque estuvimos cargando sin problemas durante varios meses usando este método.
Nikita Kukushkin
5

Creo que tengo una mejora en el excelente trabajo de Mike Weller.

Agregue una fase Run Script antes de la Compile Sourcesfase que contiene este 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"

Este script construye un marco básico con el module.map en el lugar correcto y luego se basa en la búsqueda automática de BUILT_PRODUCTS_DIRmarcos de Xcode .

Vinculaba la carpeta de inclusión CommonCrypto original como la carpeta de encabezados del marco, por lo que el resultado también debería funcionar para proyectos de Objective C.

jjrscott
fuente
Vea la respuesta de dvdblk para una mejora que cubre el uso en CocoaPods.
jjrscott
5

Para cualquiera que use swift 4.2 con Xcode 10 :

El sistema proporciona ahora el módulo CommonCrypto, por lo que puede importarlo directamente como cualquier otro marco del sistema.

import CommonCrypto
kubrick G
fuente
Duplicado de la respuesta de @ mxcl: stackoverflow.com/a/50690346/9988514
Rainer Schwarz
4

@mogstad ha tenido la amabilidad de envolver la solución @stephencelis en un Cocoapod:

pod 'libCommonCrypto'

Las otras cápsulas disponibles no me funcionaron.

Jacob Jennings
fuente
4

Las soluciones de mapa de módulo pueden ser buenas y son robustas frente a los cambios del SDK, pero las encontré incómodas de usar en la práctica y no tan confiables como me gustaría al entregar cosas a otros. Para tratar de hacerlo todo más infalible, tomé un camino diferente:

Solo copia los encabezados.

Lo sé, frágil. Pero Apple casi nunca hace cambios significativos en CommonCrypto y estoy viviendo el sueño de que no lo cambiarán de manera significativa sin finalmente hacer de CommonCrypto un encabezado modular.

Por "copiar los encabezados" quiero decir "cortar y pegar todos los encabezados que necesita en un encabezado masivo en su proyecto al igual que lo haría el preprocesador". Como ejemplo de esto que puede copiar o adaptar, vea RNCryptor.h .

Tenga en cuenta que todos estos archivos tienen licencia bajo APSL 2.0, y este enfoque mantiene intencionalmente los avisos de derechos de autor y licencia. Mi paso de concatenación tiene licencia bajo MIT, y eso solo se aplica hasta el próximo aviso de licencia).

No digo que esta sea una solución hermosa, pero hasta ahora parece haber sido una solución increíblemente simple tanto para implementar como para soporte.

Rob Napier
fuente
Encontré esto para compilar de manera confiable y es simple. ¿La aplicación que usa el marco necesita vincularse a algo especial, o CommonCrypto está siempre disponible?
codingFriend1
1
Creo que Security.frameworkse vincula automáticamente (ha pasado un tiempo desde que comencé un nuevo proyecto). Si obtiene errores, ese es el marco para vincular.
Rob Napier
Esta parece ser la solución más simple y funciona muy bien en una máquina, pero cada vez que uso el marco en otro marco o aplicación, en otra máquina, aparece el error 'módulo faltante'.
cualquiera de
2

Sé que esta es una vieja pregunta. Pero descubro una forma alternativa de usar la biblioteca en el proyecto Swift, que podría ser útil para aquellos que no desean importar el marco presentado en estas respuestas.

En el proyecto Swift, cree un encabezado de puente Objective-C, cree una categoría NSData (o una clase personalizada que use la biblioteca) en Objective-C. El único inconveniente sería que tiene que escribir todo el código de implementación en Objective-C. Por ejemplo:

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

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

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

Y luego, en su encabezado de puente de Objective-C, agregue esto

#import "NSData+NSDataEncryptionExtension.h"

Y luego, en la clase Swift, haz algo similar:

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
}
}

Funciona como se esperaba.

Terence
fuente
Esto funciona sin problemas e incluso le permite mantener elementos internos internos ( NSData+NSDataEncryptionExtension.hno tiene que ser público).
Raphael
Pero, ¿con qué marco del sistema operativo debo vincularme para usar esto? A diferencia de otros, tengo que trabajar con CommonCrypto en un proyecto Obj-C, y eso solo se rompe en Xcode 9 con MacOS-10.13 SDK
Motti Shneor
@MottiShneor Vincula cualquier sistema operativo desde 10.9 o superior. Estoy trabajando en el mismo entorno y funciona bien.
Terence
2

He agregado algo de magia de cocoapods a la respuesta de jjrscott en caso de que necesite usar CommonCrypto en su biblioteca de cocoapods.


1) Agregue esta línea a su podspec:

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

2) Guarde esto en la carpeta de su biblioteca o donde quiera (sin embargo, no olvide cambiar el script_phase en consecuencia ...)

# 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"

Funciona de maravilla :)

dvdblk
fuente
¿Puede proporcionar una demostración o un proyecto de marco de muestra para el mismo junto con el archivo de especificaciones de pod?
Gowtham
0

No estoy seguro de si algo ha cambiado con Xcode 9.2, pero ahora es mucho más simple lograrlo. Lo único que tuve que hacer es crear una carpeta llamada "CommonCrypto" en mi directorio de proyecto de marco y crear dos archivos dentro de él, uno llamado "cc.h" de la siguiente manera:

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

Y otro llamado module.modulemap:

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

(No sé por qué no puede hacer referencia a archivos de encabezado del área SDKROOT directamente en un archivo de mapa de módulo, pero no pude hacer que funcione)

Lo tercero es encontrar la configuración "Importar rutas" y establecerla en $ (SRCROOT). De hecho, puede configurarlo en cualquier carpeta en la que desee que esté la carpeta CommonCrypto, si no lo desea en el nivel raíz.

Después de esto deberías poder usar

import CommonCrypto

En cualquier archivo rápido y todos los tipos / funciones / etc. están disponibles.

Sin embargo, una advertencia: si su aplicación usa libCommonCrypto (o libcoreCrypto) es excepcionalmente fácil para un hacker no demasiado sofisticado adjuntar un depurador a su aplicación y descubrir qué claves se pasan a estas funciones.

Dylan Nicholson
fuente
0

En caso de que tenga el siguiente problema:

ld: biblioteca no encontrada para -lapple_crypto clang: error: el comando del enlazador falló con el código de salida 1 (use -v para ver la invocación)

En Xcode 10, Swift 4.0. CommonCrypto es parte del marco.

Añadir

 import CommonCrypto

Eliminar

  • Archivo CommonCrpto lib de enlace binario con bibliotecas de fases de compilación
  • import CommonCrypto desde el encabezado de puente

¡Esto funcionó para mí!

SKSN
fuente
-1

Me pasó lo mismo después de actualizar Xcode. Intenté todo lo que puedo hacer, como reinstalar cocoapods y limpiar el proyecto, pero no funcionó. Ahora se ha resuelto después de reiniciar el sistema.

Joey
fuente
-13

Es muy simple. Añadir

#import <CommonCrypto/CommonCrypto.h>

a un archivo .h (el archivo de encabezado de puente de su proyecto). Como convención, puede llamarlo YourProjectName-Bridging-Header.h.

Luego vaya a la configuración de compilación de su proyecto y busque Swift Compiler - Generación de código. Debajo de él, agregue el nombre de su encabezado de puente a la entrada "Encabezado de puente de Objetivo-C".

Ya terminaste No se requieren importaciones en su código Swift. Swift podrá ver los encabezados públicos de Objective-C que figuran en este archivo de encabezado de puente.

Juanjo Conti
fuente
su error devuelve el método: el uso de cabeceras de puente con los objetivos del marco no es compatible
gorgi93
55
@ gorgi93 No puede usar un encabezado de puente en un objetivo de marco, como sugiere el error. La única opción es ponerlo en el archivo de encabezado del marco principal, desafortunadamente.
Charles A.
1
Si realmente hubiera rojo el título de este hilo, habría visto que el tipo desea importar la biblioteca CommonCrypto en un marco Swift. No puede usar encabezados de puente en marcos, y no puede importar el marco de CommonCrypto en el encabezado general.
miken.mkndev