Использование libcurl на iOS 5 как альтернатива NSURLConnection - PullRequest
11 голосов
/ 28 января 2012

Обновление: теперь NSURLConnection правильно поддерживает 100-Continue.В любом случае, этот ответ содержит ссылку на скрипт для сборки libcurl для iOS / OSX.

У меня немного сложнее с NSURLConnection,учитывая, что он не поддерживает Раздел 8.2.3 RFC 2616 (HTTP / 1.1).

В основном клиент должен иметь возможность поддерживать отправку заголовка Expect: 100-Continue;после отправки заголовков запроса он должен дождаться ответа от сервера с кодом состояния 100 перед отправкой тела POST / PUT.

Кроме того, NSURLConnection (и, следовательно, все библиотеки, основанные на нем) не будут возвращать никакого ответа от сервера, пока все данные не будут загружены - что является проблемой, поскольку сервер может сразу отклонить загрузку (неверные учетные данные, без пробела, файл тоже)большой и т. д.).Хотя он «работает» для небольших файлов (контент полностью загружен и вызывается метод делегата с ответом), для больших файлов вместо получения ответа об ошибке от сервера (который я уверен, что отправлено), Я просто получаю сообщение об ошибке «Ошибка подключения».

Я знаю, libcurl правильно поддерживает спецификацию 100-Continue, поэтому мне нужна помощь в его компиляции и запуске и запуске в проекте iOS 5.

Я начал с этого поста (прокрутите вниз), но я не смог далеко уйти ...

Сделал эти изменения ...

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

... но компиляция завершается с сообщением

(...)
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

Я использую curl 7.21.4, загруженный с сайта Apple с открытым исходным кодом .

Итак, как можноЯ скомпилирую curl и использую его в проекте iOS 5, желательно с поддержкой SSL?

Ответы [ 7 ]

15 голосов
/ 02 марта 2012

Это сработало для меня с последним 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
9 голосов
/ 25 апреля 2012

Важное обновление для людей, получающих: C compiler cannot create executables
Убедитесь, что вы установили инструменты командной строки XCode ...

В меню XCode выберите: Preferences --> downloads --> Command Line Tools

... и нажмите «Установить», если не установлено.

Проблема с вышеуказанным скриптом заключается в том, что он работает со старыми версиями XCode. Если вы установили последнюю версию XCode, расположение всех инструментов компилятора будет другим. Я изменил сценарий для поддержки как старых, так и новых версий XCode, и теперь у меня есть встроенная проверка ошибок. Это помогает?

Ниже - я полагаю, SDK версии 5.1 - возможно, вам придется изменить это ...

#!/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
1 голос
/ 23 июня 2012

Выполнить скрипт с помощью sudo:

$ sudo library.sh 

Мой скрипт:

#!/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 голосов
/ 06 сентября 2012

Этот скрипт работал для меня со средой Xcode 4.4.1 (извините за мои почти несуществующие навыки sh):

#!/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
0 голосов
/ 18 мая 2012

Я настроил проект на GitHub , который создает curl (только для HTTP) с и без SSL (GnuTLS и OpenSSL). Оставил много комментариев на месте, поэтому их должно быть достаточно легко изменить в соответствии со своими потребностями.

0 голосов
/ 02 февраля 2012

«Я все еще получаю ту же ошибку,« Компилятор C не может создать исполняемые файлы »: |« Просто запустите ./configure от имени пользователя root (sudo ./configure ....)

0 голосов
/ 28 января 2012

Проблема:

C compiler cannot create executables

Причина:

Ваш компилятор C для iOS, arm-apple-darwin9-gcc, является кросс-компилятором: он работает на ПК, но генерирует код для iDevices.Таким образом, он не может использовать собственные программные ресурсы компьютера (библиотеки, заголовочные файлы).Вы должны указать ему, где найти собственные заголовки и библиотеки iOS.Вы можете сделать это, передав опцию -isysroot=/path/to/iOS_SDK/.Например, следующее не будет работать из коробки:

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

Но следующее будет:

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

Я не использую Xcode, также у меня нет Mac, поэтому я не знаю точное местоположение sysroot цепочки инструментов iOS, но это может быть что-то вроде того, что в приведенной выше команде.

И как все это использовать с configure?Ну, у вас есть 3 этапа компиляции: предварительная обработка, компиляция и компоновка.Поэтому вы должны указать препроцессору и компилятору, где он может найти заголовки, и компоновщику, где он может найти библиотеки.(В частности, вы должны забыть сообщить препроцессору, где находится ваш sysroot).Так что сделайте что-то вроде этого:

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