0

libxslt.dylib を含めると、アプリが拒否される理由になると聞きました。それがどれほど正確かはわかりません。

それにもかかわらず、libxslt の最新バージョンを含めたいと思います。将来的には、libxml2 や他のライブラリでも同じことをしたいと考えています。

このようなコード ライブラリをアプリに含める正しい方法は何ですか?

4

5 に答える 5

3

Apple から次のメッセージが表示され、アプリが拒否されました。


XYZ アプリは、非公開または文書化されていない API を使用しているため、App Store に投稿できません:

プライベート シンボル参照 xsltApplyStylesheet xsltCleanupGlobals xsltFreeStylesheet xsltInit xsltParseStylesheetFile xsltSaveResultToString

ご存知のように、iPhone Developer Program License Agreement セクション 3.3.1 で概説されているように、非公開 API の使用は許可されていません。アプリ レビュー チームがアプリケーションをレビューする前に、この問題を解決し、新しいバイナリを iTunes Connect にアップロードしてください。


libxslt および libxml2 ライブラリが実際にデバイスに存在し、Xcode のプルダウン メニューから利用できることを理解していました。これら 2 つのライブラリとリンクを動的にリンクすると、アプリはデバイス上で美しく動作します。したがって、ライブラリはデバイス上にある必要があります。これらのライブラリを静的ライブラリとしてゼロから構築し、アプリのサイズを大きくする必要があるのはなぜですか?

xml と xslt を使用しないことを除けば、これを回避する明確な方法が見つかりません。それはまったく意味がありません!

Hilton さん、xslt を使用するアプリを iTunes に提出することに成功しましたか?

于 2010-10-13T13:43:14.797 に答える
3

私は最終的にlibxsltをXcodeでビルドし、アプリにリンクし、アプリストアのrejectionbotを回避しました。

基本的に、libxslt を静的にビルドし、シンボル名を変更して、Apple が探すものと一致しないようにする必要があります。すべての記号xsltFoo()を に変更する必要がありますzsltFoo()。また、ライブラリ自体の名前を からlibxslt.aに変更する必要がありますlibzslt.a

10の簡単なステップでそれを行う方法は次のとおりです:)

  1. libxsltサブディレクトリを作成し、そこに配置libxslt-1.1.26.tar.gzします。
  2. [ターゲット] -> [YourApp] を右クリックし、[追加] -> [新しいビルド フェーズ] -> [新しい実行スクリプト ビルド フェーズ] を選択します。
  3. 以下のビルド スクリプトをコピーします。
  4. ビルド フェーズの名前を「Run Script」から「Build libxslt」に変更し、リストの最初にします。
  5. プロジェクトをビルドします。これにより、libxslt構成され、ビルドされ、インストールされますlibxslt/dist
  6. Frameworks を右クリックし、[追加] -> [既存のファイル...] を選択してから、[libxslt/dist/lib/libzslt.a
  7. プロジェクトに移動 -> プロジェクト設定の編集 -> ビルド
  8. 検索パスの下で、ヘッダー検索パスを編集して追加しますlibxslt/dist/include
  9. #include <libxslt/whatever.h>通常、必要に応じてコードに追加します
  10. コード内zsltFooのあらゆる場所の代わりに使用xsltFoo

libxslt手順 3 で参照したビルド スクリプトは次のとおりです。

#!/bin/sh

# Setup
LIBXSLT_VERSION="1.1.26"
LIBXSLT_SHA1_CHECKSUM="69f74df8228b504a87e2b257c2d5238281c65154"
GCC_VERSION="4.2.1"
ARCH="arm-apple-darwin10"

# Bail on any error
set -e

# Function that patches a file using sed(1).
# First argument is filename, subsequent arguments are passed to sed(1).
sed_patch_file()
{
    FILE="${1}"
    shift
    sed ${1+"$@"} < "${FILE}" > "${FILE}".new
    if ! diff -q "${FILE}" "${FILE}".new >/dev/null; then
        cat "${FILE}".new > "${FILE}"
    fi
    rm "${FILE}".new
}

# Function that displays the command and then executes it
show_cmd()
{
    echo ${1+"$@"}
    ${1+"$@"}
}

# Dump environment variables
#echo '***************************************************'
#env | sort
#echo '***************************************************'

# Files
SRCBALL="${SOURCE_ROOT}/libxslt/libxslt-${LIBXSLT_VERSION}.tar.gz"
SRCDIR="${SOURCE_ROOT}/libxslt/libxslt-${LIBXSLT_VERSION}"
DISTDIR="${SOURCE_ROOT}/libxslt/dist"

# Verify source is installed
if ! [ -f "${SRCBALL}" ]; then
    echo "ERROR: please download and install ${SRCBALL}" 2>&1
    echo "The SHA1 checksum should be: ${LIBXSLT_SHA1_CHECKSUM}" 2>&1
    exit 1
fi

# Unpack the archive if necessary
if ! [ -e "${SRCDIR}" ]; then

    # Unpack archive
    echo "*** Unpacking archive ${SRCBALL}"
    tar zxf "${SRCBALL}" -C libxslt

    # Rename all symbols xsltFoobar -> zsltFoobar to avoid broken app store link analyzer
    echo "*** Changing symbol names"
    find libxslt/libxslt-"${LIBXSLT_VERSION}" -name '*.[ch]' -print | while read FILE; do
        sed_patch_file "${FILE}" -E 's%([^[:alnum:]_/"]|^)xslt([A-Z])%\1zslt\2%g'
    done

    # Disable build of xsltproc which fails to link
    sed_patch_file libxslt/libxslt-"${LIBXSLT_VERSION}"/Makefile.in -E '/^[[:space:]]xsltproc \\$/d'
fi

# Build and install
if ! [ -e "${DISTDIR}" ]; then

    # Set up autoconf environment variables
    export CPP="${PLATFORM_DEVELOPER_BIN_DIR}/${ARCH}-gcc-${GCC_VERSION} -E"
    export  CC="${PLATFORM_DEVELOPER_BIN_DIR}/${ARCH}-gcc-${GCC_VERSION}"
    export CXX="${PLATFORM_DEVELOPER_BIN_DIR}/${ARCH}-g++-${GCC_VERSION}"
    export CPPFLAGS="-I${SDKROOT}/usr/lib/gcc/${ARCH}/${GCC_VERSION}/include -I${SDKROOT}/usr/include"
    export LDFLAGS="--sysroot=${SDKROOT}"
    export CFLAGS="-Os -pipe ${CPPFLAGS} ${LDFLAGS}"
    export CXXFLAGS="${CFLAGS}"
    export ARCH

    # Configure libxslt
    echo "*** Configuring libxslt-${LIBXSLT_VERSION}"
    ( cd "${SRCDIR}" && show_cmd ./configure \
      --prefix="${DISTDIR}" \
      --build=i386-apple-darwin10 \
      --host="${ARCH}" \
      --enable-static \
      --disable-shared \
      --with-libxml-include-prefix="${SDKROOT}"/usr/include \
      --with-libxml-libs-prefix="${SDKROOT}"/usr/lib \
      --without-python )

    # Build it
    echo "*** Building libxslt-${LIBXSLT_VERSION}"
    ( cd "${SRCDIR}" && show_cmd make )

    # Install it
    echo "*** Installing libxslt-${LIBXSLT_VERSION}"
    ( cd "${SRCDIR}" && show_cmd make install )

    # Change library name to avoid dynamic linking to the iPhone's shared libxslt library
    ln libxslt/dist/lib/lib{x,z}slt.a
fi
于 2011-06-07T21:14:41.733 に答える
2

Hilton さん、もしよろしければ、LIBXSLT ライブラリをアプリに静的にリンクする方法を教えていただけないでしょうか?

私は他の多くの人とまったく同じ問題を抱えていますが、少なくとも現時点では、動的ライブラリを静的ライブラリに変える方法がわかりません。

ありがとう。

編集: iPhoneでこのバージョンのXSLTをチェックしてください

私のアプリは LibXSLT の使用が拒否されたため、代わりに手動でソース コードを追加し、そのようにしました。私のアプリは数日前に承認されました。

于 2010-10-27T19:28:31.940 に答える
1

デバイスに既に存在するライブラリにのみ動的にリンクできます。

デバイスに存在しない外部ライブラリにリンクする場合は、自分で静的ライブラリにコンパイルし、代わりにそれをリンクする必要があります。

于 2010-09-04T19:38:58.103 に答える