2012-01-27 13 views
11

Actualización: NSURLConnection ahora parece ser compatible con 100-Continue. En cualquier caso, this answer contiene un enlace al script para compilar libcurl para iOS/OSX.Usando libcurl en iOS 5 como alternativa a NSURLConnection

Estoy teniendo un momento difícil con NSURLConnection, dado que no es compatible con Section 8.2.3 de RFC 2616 (HTTP/1.1).

Básicamente, el cliente debe ser capaz de admitir el envío del encabezado Expect: 100-Continue; después de enviar los encabezados de solicitud, debe esperar una respuesta del servidor con el código de estado 100 antes de enviar el cuerpo POST/PUT.

Además, NSURLConnection (y en consecuencia todas las librerías que se crean encima) no devolverá ninguna respuesta del servidor hasta que se carguen todos los datos, lo cual es un problema ya que el servidor puede rechazar la carga de inmediato (credenciales no válidas , sin espacio, archivo demasiado grande, etc.). Si bien "funciona" para archivos pequeños (el contenido se carga completamente y se llama método de delegado con respuesta), en archivos grandes en lugar de obtener la respuesta de error del servidor (que estoy positivamente seguro se envía), simplemente obtener un error "Error de conexión".

Sé que libcurl es compatible con la especificación 100-Continue, así que necesito ayuda para compilarla y ponerla en funcionamiento en un proyecto iOS 5.

Empecé con this post (desplácese hacia abajo) pero no pude llegar lejos ...

realizan estos cambios ...

export CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 
export CFLAGS="-arch armv7 --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" 
export CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-cpp-4.2 
export AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar 
./configure --disable-shared --without-ssl --without-libssh2 --without-ca-bundle --without-ldap --disable-ldap --host=arm-apple-darwin10 --build=arm-apple-darwin10 
make clean 
make 
ar rv libcurl.armv7.a lib/*.o 

... pero compilación falla con el mensaje

(...) 
checking for arm-apple-darwin10-gcc... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 
checking whether the C compiler works... no 
configure: error: in `/Users/bruno/Downloads/curl-7.21.4': 
configure: error: C compiler cannot create executables 

Estoy usando curl 7.21.4, descargado de open source site de Apple.

Entonces, ¿cómo puedo compilar curl y usarlo en un proyecto iOS 5, preferiblemente con soporte SSL?

+0

Obtenga la última y mejor secuencia de comandos [aquí] (https://github.com/brunodecarvalho/curl-ios-build-scripts). Compila con Darwin SSL, ¡correcto, iOS/OSX SSL nativo! – biasedbit

Respuesta

15

Esto funcionó para mí con el último SDK:

#!/bin/sh 
export SDK=5.0 

buildit() 
{ 
    target=$1 
    platform=$2 

    export CC=/Developer/Platforms/${platform}.platform/Developer/usr/bin/gcc 
    export CFLAGS="-arch ${target} -isysroot /Developer/Platforms/${platform}.platform/Developer/SDKs/${platform}${SDK}.sdk" 
    export CPP="/Developer/Platforms/${platform}.platform/Developer/usr/bin/llvm-cpp-4.2" 
    export AR=/Developer/Platforms/${platform}.platform/Developer/usr/bin/ar 
    export RANLIB=/Developer/Platforms/${platform}.platform/Developer/usr/bin/ranlib 

    ./configure --disable-shared --without-ssl --without-libssh2 --without-ca-bundle --without-ldap --disable-ldap \ 
      --host=${target}-apple-darwin10 

    make clean 
    make 
    $AR rv libcurl.${target}.a lib/*.o 
} 

buildit armv6 iPhoneOS 
buildit armv7 iPhoneOS 
buildit i386 iPhoneSimulator 

lipo -create libcurl.armv7.a libcurl.armv6.a libcurl.i386.a -output libcurl.a 
+2

Hay un pequeño error tipográfico en el binario ranlib (tienes "ranib"), aparte de eso, esto es perfecto. ¡Gracias! – biasedbit

+0

¡Gran respuesta! Realmente aprecio tu respuesta – Anton

0

El problema es:

C compiler cannot create executables 

La razón:

Su compilador de C para iOS, el brazo-manzana-darwin9-gcc, es un compilador cruzado: se ejecuta en un PC, sino que genera código para iDevices. Por lo tanto, no puede usar los recursos de programación nativos de la computadora (bibliotecas, archivos de encabezado). Tienes que decirle dónde encontrar los propios encabezados y bibliotecas de iOS. Puede hacerlo pasando la opción -isysroot=/path/to/iOS_SDK/. Por ejemplo, el siguiente no funcionará fuera de la caja:

/path/to/arm-apple-darwin10-gcc hello.c -o hello 

Pero lo siguiente:

/path/to/arm-apple-darwin10-gcc -isysroot /Developer/Platforms/iPhoneOS.platform/SDKs/iPhoneOS5.0.1.sdk hello.c -o hello 

No consumo Xcode, ni tengo un Mac, por lo que don No conozco la ubicación exacta del sysroot de la cadena de herramientas de iOS, pero podría ser algo así como el del comando anterior.

¿Y cómo usar todo esto con configure?Bueno, tienes 3 etapas de compilación: preprocesamiento, compilación y enlace. Así que tienes que decirle al preprocesador y al compilador dónde puede encontrar los encabezados, y al vinculador dónde puede encontrar las bibliotecas. (Particularmente, debe olvidarse de decirle al preprocesador dónde está su sysroot). Así que hacer algo como esto:

export CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 
export CFLAGS="-arch armv7 -isysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" 
export CPPFLAGS="-isysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" 
export LDFLAGS="-arch armv7 -isysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk" 
export CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-cpp-4.2 
export AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar 
./configure --disable-shared --without-ssl --without-libssh2 --without-ca-bundle --without-ldap --disable-ldap --host=arm-apple-darwin10 --build=arm-apple-darwin10 
make 
sudo make install 
+0

Gracias por la respuesta, pero es un no-go; He intentado reemplazar el 'llvm-gcc-4.2' y' llvm-cpp-4.2' con 'arm-apple-darwin10-llvm-gcc-4.2' y' arm-apple-darwin10-llvm-g ++ - 4.2' respectivamente , pero sigo recibiendo el mismo error, "el compilador de C no puede crear ejecutables": | – biasedbit

+0

Bueno, si no funciona, ¿por qué esperas que lo sepamos a ciegas? Será mejor que publiques configure.log –

0

"Todavía estoy consiguiendo el mismo error " compilador de C no puede crear ejecutables": |" Sólo tiene que ejecutar ./configure como root (sudo ./configure ....)

9

actualización importante para las personas que reciben: C compiler cannot create executables
Asegúrese de instalar las herramientas de línea de comandos ... XCode

Desde el menú seleccione XCode: Preferences --> downloads --> Command Line Tools

... y pulsa "Instalar" si no se instala.

El problema con el script anterior es que funciona con versiones anteriores de XCode. Si instaló el último XCode, la ubicación de todas las herramientas del compilador será diferente. Cambié la secuencia de comandos para que sea compatible con las versiones antiguas y nuevas de XCode, y tengo algunos errores incorporados. ¿Esto ayuda?

continuación - Asumo SDK versión 5.1 - puede que tenga que modificar esa ...

#!/bin/bash 

set -e 

export SDK=5.1 

checkExists() { 

    if [ ! -e $1 ] 
    then 
     echo "Didn't find: $1 -- try to locate parts of this to see how to fix the path" 
     exit 1 
    else 
     echo "using $1" 
    fi 

} 

buildit() { 

    target=$1 
    platform=$2 

    root="/Applications/Xcode.app/Contents/Developer/Platforms/${platform}.platform/Developer" 
    oldRoot="/Developer/Platforms/${platform}.platform/Developer" 

    if [ ! -d "${root}" ] 
    then 
     root="${oldRoot}" 
    fi 

    if [ ! -d "${root}" ] 
    then 
     echo " " 
     echo "Oopsie. You don't have an iOS SDK root in either of these locations: " 
     echo " ${root} " 
     echo " ${oldRoot}" 
     echo " " 
     echo "If you have 'locate' enabled, you might find where you have it installed with:" 
     echo " locate iPhoneOS.platform | grep -v 'iPhoneOS.platform/'" 
     echo " " 
     echo "and alter the 'root' variable in the script -- or install XCode if you can't find it... " 
     echo " " 
     exit 1 
    fi 

    export CC="${root}/usr/bin/gcc" 
    export CFLAGS="-arch ${target} -isysroot ${root}/SDKs/${platform}${SDK}.sdk" 
    export CPP="${root}/usr/bin/llvm-cpp-4.2" 
    export AR="${root}/usr/bin/ar" 
    export RANLIB="${root}/usr/bin/ranlib" 

    checkExists ${CC} 
    checkExists ${root}/SDKs/${platform}${SDK}.sdk 
    checkExists ${CPP} 
    checkExists ${AR} 
    checkExists ${RANLIB} 

    ./configure --disable-shared --without-ssl --without-libssh2 --without-ca-bundle --without-ldap --disable-ldap --host=${target}-apple-darwin10 

    make clean 
    make 
    $AR rv libcurl.${target}.a lib/*.o 
} 

buildit armv6 iPhoneOS 
buildit armv7 iPhoneOS 
buildit i386 iPhoneSimulator 

lipo -create libcurl.armv7.a libcurl.armv6.a libcurl.i386.a -output libcurl.a 
0

He creado a project on GitHub que construye rizo (sólo para HTTP) con y sin SSL (GnuTLS y OpenSSL). Dejó muchos comentarios en su lugar, por lo que debería ser lo suficientemente fácil para que cualquiera lo modifique de acuerdo con sus necesidades particulares.

1

Ejecutar secuencia de comandos con sudo:

$ sudo library.sh 

mi guión:

#!/bin/sh 
export SDK=5.0 

buildit() 
{ 
    target=$1 
    platform=$2 

    export CC=/Developer/Platforms/${platform}.platform/Developer/usr/bin/gcc 
    export CFLAGS="-arch ${target} -isysroot /Developer/Platforms/${platform}.platform/Developer/SDKs/${platform}${SDK}.sdk" 
    export CPP="/Developer/Platforms/${platform}.platform/Developer/usr/bin/llvm-cpp-4.2" 
    export AR=/Developer/Platforms/${platform}.platform/Developer/usr/bin/ar 
    export RANLIB=/Developer/Platforms/${platform}.platform/Developer/usr/bin/ranlib 

    sudo ./configure --disable-shared --without-ssl --without-libssh2 --without-ca-bundle -- without-ldap --disable-ldap \ --host=${target}-apple-darwin10 

    make clean 
    make 
    $AR rv libcurl.${target}.a lib/*.o 
} 

buildit armv6 iPhoneOS 
buildit armv7 iPhoneOS 
buildit i386 iPhoneSimulator 

lipo -create libcurl.armv7.a libcurl.armv6.a libcurl.i386.a -output libcurl.a 
0

Este script trabajó para mí con Xcode 4.4.1 ambiente (excusa mis habilidades sh casi inexistentes):

#!/bin/sh 

#run with sudo 

export OSSDK="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/" 
export SIMSDK="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/" 
export SDKROOT=$OSSDK 
export VER=5.1 

buildit() 
{ 
    target=$1 
    platform=$2 

    export CC="${root}/usr/bin/llvm-gcc-4.2" 
    export CFLAGS="-arch ${target} -isysroot=${PLATFORM}/${SDKROOT}/${PLATFORM}${SDK}.sdk" 
    export CPPFLAGS="-isysroot=${SDKROOT}/${platform}${SDK}.sdk" 
    export LDFLAGS="-arch ${target} -isysroot=${SDKROOT}/${platform}${SDK}.sdk" 
    export CPP="${root}/usr/bin/llvm-cpp-4.2" 
    export AR="${root}/usr/bin/ar"  
    export RANLIB="${root}/usr/bin/ranlib" 

    sudo ./configure --disable-shared --without-ssl --without-libssh2 --without-ca-bundle --without-ldap --disable-ldap --host=arm-apple-darwin10 --build=arm-apple-darwin10 

    sudo make clean 
    sudo make 
    sudo $AR rv libcurl.${target}.a lib/*.o 
} 

# Run once for armv6 & armv7, then for i386. Comment lines alternatively, as explained below. 

# Run for armv6 & armv7 by changing line 6 to "export SDKROOT=$OSSDK". Comment line with "buildit i386..." 
#buildit armv6 iPhoneOS 
#buildit armv7 iPhoneOS 

# Run for i386 by changing line 6 to "export SDKROOT=$SIMSDK". Comment line with buildit "armv6..." and "buildit armv7..." 
buildit i386 iPhoneSimulator 

sudo lipo -create libcurl.armv7.a libcurl.armv6.a libcurl.i386.a -output libcurl.a