2016-07-30 6 views
3

私はシミュレータとデバイスの両方のために構築された出力フレームワークのプライベートココアポッドを作成したいと思います。cocoapodsを使って追加された他のフレームワークに依存するすべてのアーキテクチャー向けにCocoa Touchフレームワークを構築するには?

私はCocoaPodsを使ってCocoaLumberjackを統合したCocoaタッチフレームワークを作成しました。 可能なすべてのアーキテクチャのフレームワークを構築したい(シミュレータとデバイスの両方)。デフォルトでは

ビルド設定、

'Build Active Architectures Only' is set to (Debug - Yes, Release - No). 

はできるだけ早く私はノーとデバッグのために、この設定を設定すると、ビルドは次のリンカエラーで失敗します。

Undefined symbols for architecture i386: 
"_OBJC_CLASS_$_DDASLLogger", referenced from: 
    objc-class-ref in MyManager.o 
"_OBJC_CLASS_$_DDLog", referenced from: 
    objc-class-ref in MyManager.o 
"_OBJC_CLASS_$_DDTTYLogger", referenced from: 
    objc-class-ref in MyManager.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

私はそれを得るCocoaLumberjackことデバッグバージョンのアクティブなアーキテクチャでのみ使用できます。

私はデバッグのためのビルドアクティブアーキテクチャを元に戻し、フレームワークを正常に構築します。

すべてのアーキテクチャ用のフレームワークをビルドするには、ビルドフェーズで追加された実行スクリプトを使用しています。このスクリプトは、ios-deviceとios-simulatorビルドを1つにマージするとも言います。

set -e 
    set +u 
    # Avoid recursively calling this script. 
    if [[ $SF_MASTER_SCRIPT_RUNNING ]] 
    then 
    exit 0 
    fi 
    set -u 
    export SF_MASTER_SCRIPT_RUNNING=1 


    # Constants 
    SF_TARGET_NAME=${PROJECT_NAME} 
    UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal 

    # Take build target 
    if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]] 
    then 
    SF_SDK_PLATFORM=${BASH_REMATCH[1]} 
    else 
    echo "Could not find platform name from SDK_NAME: $SDK_NAME" 
    exit 1 
    fi 

    if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]] 
    then 
    echo "Please choose iPhone simulator as the build target." 
    exit 1 
    fi 

    IPHONE_DEVICE_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos 

    # Build the other (non-simulator) platform 
    xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/arm64" SYMROOT="${SYMROOT}" ARCHS='arm64' VALID_ARCHS='arm64' $ACTION 

    xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/armv7" SYMROOT="${SYMROOT}" ARCHS='armv7 armv7s' VALID_ARCHS='armv7 armv7s' $ACTION 

    # Copy the framework structure to the universal folder (clean it first) 
    rm -rf "${UNIVERSAL_OUTPUTFOLDER}" 
    mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" 
    cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" 

    # Smash them together to combine all architectures 
    lipo -create "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/arm64/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/armv7/${PROJECT_NAME}.framework/${PROJECT_NAME}" -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" 

実行スクリプトの下にある[インストール時にスクリプトを実行する]チェックボックスをオンにします。今、私はGeneric iOSデバイス用のフレームワークを構築します。 プロジェクト階層にある[Products]グループをクリックし、MyFramework.frameworkファイルを選択し、右クリックして[Finderで表示]を選択します。これは〜/ライブラリ/ Developer/Xcode/DerivedData/MyFramework-dlpsipmxkqmemwgqrfeovlzgyhca/Build/Products/Debug-iphoneos/MyFramework.frameworkをファインダで開きます。

Now, I create a new tag 'MyFramework-v0.0.1' containing the commit where I added MyFramework.framework file. 

私は〜/ .cocoapods /レポ/ MyRepoNameに行く/と、次のようにpodspecファイルMyFramework.podspecを作成します。

Pod::Spec.new do |s| 
s.name   = "MyFramework" 
s.version  = "0.0.1" 
s.summary  = "A pod for MyFramework" 
s.description = "A pod designed for MyFramework" 

s.homepage  = "My_Private_Repo_Path" 
s.license  = { :type => "MIT", :file => "FILE_LICENSE" } 
s.authors    = { "My_Username" => "my_email_address" 
} 
s.platform  = :ios, "8.0" 
s.ios.deployment_target = "8.0" 

s.source  = { :git => "My_Private_Repo_Path", :tag => 'MyFramework-v'+String(s.version) } 

s.requires_arc = true 
s.vendored_frameworks = "MyFramework.framework" 
s.dependency "CocoaLumberjack" 
end 

を今、私はターミナルで次のコマンドを実行すると:

pod repo push MyRepoName MyFramework.podspec 

私は次のエラーを取得する:

Validating spec 
-> MyFramework (0.0.1) 
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use ` --verbose` for more information. 
- NOTE | [iOS] xcodebuild: ld: warning: ignoring file MyFramework/MyFramework.framework/MyFramework, missing required architecture i386 in file MyFramework/MyFramework.framework/MyFramework (2 slices) 
- NOTE | [iOS] xcodebuild: ld: warning: ignoring file MyFramework/MyFramework.framework/MyFramework, missing required architecture x86_64 in file MyFramework/MyFramework.framework/MyFramework (2 slices) 
- NOTE | [iOS] xcodebuild: fatal error: lipo: -remove's specified would result in an empty fat file 

[!] The `MyFramework.podspec` specification does not validate. 

どのようにcocoapodsを使って追加された別のフレームワーク(CocoaLumberjack)に依存する、すべてのデバイスとシミュレータ用のCocoa Touchフレームワークをビルドするには?出力フレームワークのプライベートポッドを作成する必要があります。

+0

詳細バージョン:http://arsenkin.com/ios-universal-framework.html – iwasrobbed

答えて

12

基本的に私は、これらの簡単な手順に従うだけでよいことを知りました。

1. Create a cocoa touch framework. 
2. Set bitcode enabled to No. 
3. Select your target and choose edit schemes. Select Run and choose Release from Info tab. 
4. No other setting required. 
5. Now build the framework for any simulator as simulator runs on x86 architecture. 
6. Click on Products group in Project Navigator and find the .framework file. 
7. Right click on it and click on Show in finder. Copy and paste it in any folder, I personally prefer the name 'simulator'. 
8. Now build the framework for Generic iOS Device and follow the steps 6 through 
9. Just rename the folder to 'device' instead of 'simulator'. 
10. Copy the device .framework file and paste in any other directory. I prefer the immediate super directory of both. 

ので、ディレクトリ構造は現在、次のようになります。デスクトップに今開いている端末とCD

- Desktop 
    - device 
    - MyFramework.framework 
    - simulator 
    - MyFramework.framework 
    - MyFramework.framework 

を。次のコマンドを入力し始めます。

lipo -create 'device/MyFramework.framework/MyFramework' 'simulator/MyFramework.framework/MyFramework' -output 'MyFramework.framework/MyFramework' 

それだけです。ここでは、MyFramework.framework内にあるMyFrameworkバイナリのシミュレータとデバイスバージョンをマージします。我々は、シミュレータとデバイスを含むすべてのアーキテクチャを構築する汎用フレームワークを取得します。

ここで、このフレームワークのポッドを作成しても違いはありません。それは魅力のように働く。同じ機能を実現するための実行スクリプトもありますが、私は正しいスクリプトを見つけるのに多くの時間を費やしました。だから私はあなたがこのメソッドを使用することをお勧めします。

+0

theres no step 9 –

+0

Aah、ありがとう。 9位は8位と混ざりました。 @ R.P.Carson –

関連する問題