質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2673閲覧

Swift:ユニバーサルフレームワークの作り方について(実機・シミュレーター両方対応)

退会済みユーザー

退会済みユーザー

総合スコア0

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/10/27 07:00

編集2021/10/27 10:44

前提・実現したいこと

iPhoneOS(実機)、iPhoneSimulator(シミュレーター)両方に対応したフレームワーク(.framework)を作成しております。

現在、実機のみまたはシミュレーターのみのフレームワークの作成と動作確認はできております。
しかし、両方に対応したユニバーサルフレームワークを作成したのですが、片方でしか動作しません。
実機、シミュレーターともに対応したアーキテクチャは入っているのに、「iOS(またはiOSシミュレーター)用に構築されております。」とエラーが出てしまい、他の対処法がわかりません。

知っている方いましたら、どなたかご教示のほど宜しくお願い致します。

エラーメッセージ

/Users/…/UseFrameworkFourth.xcodeproj Building for iOS Simulator, but the linked and embedded framework 'MakeFrameworkFourth.framework' was built for iOS.

上記は実行プロジェクトにてフレームワークを追加し、試しにシミュレーターで実行したところエラーが発生しました。実機では成功しました。
Target「Aggregate」を追加しRunScriptにユニバーサル対応のソースコードを貼り付け、「Any iOS Device」※で作成したフレームワークで使用したところでたものです。
※シミュレーターを指定して作成して実機で実行しても「iOSシミュレーター用に構築されています」とエラーが出ます。

該当箇所

作成したフレームワークをユニバーサルフレームワークにしようと、参考URL(https://gist.github.com/cromandini/1a9c4aeab27ca84f5d79)からユニバーサル対応のソースコードを、フレームワークを作成しているXcodeプロジェクトのRunScriptに記述しました。

#!/bin/sh UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal # make sure the output directory exists mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" # Step 1. Build Device and Simulator versions xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build # Step 2. Copy the framework structure (from iphoneos build) to the universal folder cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" # Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule" fi # Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" # Step 5. Convenience step to copy the framework to the project's directory cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}" # Step 6. Convenience step to open the project's directory in Finder open "${PROJECT_DIR}"

イメージ説明

記述後それぞれビルドしました。下記画像はアーキテクチャが生成されたかの確認になります。
*シミュレーター:iPhone 12 Pro Max(以外の機器でもいい)
イメージ説明
*実機:Any iOS Device
イメージ説明

※追記
上記2つの画像に「Module」>「MakeFrameworkFourth」>「arm64-apple-ios-simulator.,,,」とあり、arm64はシミュレーターのアーキテクチャではないため、削除してみても結果は変わらずエラーでした。

環境

Xcode:12.4
Swift:5.3.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

## 原因
Xcode12あたりから、lipoコマンドで作成したユニバーサルフレームワークを受け付けない仕様になっているみたいです。そのため作成できたとしても、下記エラーが発生します。

Building for iOS Simulator, but the linked and embedded framework 'MyFramework.framework' was built for iOS + iOS Simulator.

理由は調べた限りですが、M1チップが出てきたこともあり、Macの従来のIntelのCPU(x86_64バイナリ)だけでなくarm64バイナリも含むようになったため、シミュレーター用アーキテクチャx86_64にarm64も加わることになります。そうすると、lipoコマンドで実機とシミュレーターを一つのバイナリに含めることができなくなってしまったらしいです。

参考
https://blog.embrace.io/xcode-12-and-xcframework/
https://techlife.cookpad.com/entry/2021/03/10/110000

解決

下記を参考にXCFrameworkを作成することで解決しました。

https://qiita.com/tfactory/items/34f9d88f014c47221617

投稿2021/10/29 07:18

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問