2009-06-17 4 views

답변

0

나는 똑같은 생각을 해왔다. 지금까지 내가 할 수 있었던 것은 하나의 프로젝트를 내가 원하는 방식으로 만들어 다른 프로젝트를 시작하기 위해 다른 폴더에 복사하는 것입니다. 그런 다음 .xcodeproj 파일의 이름을 바꾸고 엽니 다. 그런 다음 새 앱을 만들기 전에 기본 사항 (아이콘, default.png, 대상, 실행 파일)을 사용자 정의합니다.

코드가 재사용되는 방식과 같이 깔끔하지는 않습니다. 더 나은 해결책이있을 것이라고 확신합니다. 어쩌면 소스 코드 관리/버전 제어를 영리하게 사용할 수 있습니까? 어쩌면 XCode에 내장 된 것이 있을까요? 다른 아이디어? 나는 여기에 더 많은 게시물을 보길 고대한다.

9

Apple은 iPhone에서 사용자 정의 프레임 워크의 사용을 금지합니다. 그러나 좋은 오래된 정적 라이브러리를 사용할 수 있습니다. 3.0 GM SDK에는 거기에 대한 프로젝트 템플릿도 있지만 정적 라이브러리 대상을 직접 설정할 수도 있습니다.

+0

참조 마이클의 답변을 얻을 수있는 aggrigate 목표를 실행합니다. 프레임 워크를 만드는 것이 가능합니다. 약간의 수동 접근 만 있으면됩니다. – DougW

0

@Nikolai Ruhe - Apple은 iPhone에서 사용자 정의 프레임 워크를 사용하는 것을 정확히 어디에 금지 시켰습니까? iOS Developer Program License Agreement과 App Store Review Guidelines을 모두 읽었으며 그러한 금지에 대한 언급을 찾을 수 없습니다.

왜 애플이 커스텀 스태틱 라이브러리를 사용할 수 있는지, 그리고 커스텀 프레임 워크의 사용을 금지하고 있습니다. 아마도 다른 법적 문서가 누락 된 것입니까?

+0

어쩌면 인터페이스 빌더에 iphone-plugins를 생성하는 것이 어렵거나 불가능한 것처럼 기술적 인 예술 일 수도 있습니다. – hfossli

+0

런타임시 iOS 실행 파일에 연결할 수있는 코드가 없습니다. 이것이 dylib, 프레임 워크 및 플러그인에서 발생합니다. 정적 아카이브는 컴파일 타임에 링크됩니다. 이것은 아마도 앱이 비열하고 SDK 용어를 위반하거나 실수로 악용되어 사용자의 데이터를 위험에 빠뜨리지 않도록하기 위해 수행됩니다. 예를 들어, 주소록과 같습니다. –

+0

"참고 : iOS에서는 사용자 정의 프레임 워크 생성이 지원되지 않습니다." http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1 –

5

저는 장치 및 시뮬레이터에서 모두 작동하는 범용 iOS 프레임 워크를 작성할 수있는 Xcode 4 템플릿을 만들었습니다.

템플릿이 설치되면 새 프로젝트를 만들 때 "정적 iOS 프레임 워크"만 선택하면됩니다. 나머지는 자동으로 선택합니다. 또한 단위 테스트와 함께 작동합니다.

https://github.com/kstenerud/iOS-Universal-Framework

+0

아주 좋습니다. 공유해 주셔서 감사합니다! –

0

이 링크를 참조, 당신은 절대적으로 프레임 워크를 생성하고 사용할 수 있습니다. 왜 프로그램을 구조화하면 애플이 앱을 거부할까요? see this link

프레임 워크는 코드의 구조적인 구성에 불과합니다. 직접적인 접근 방식은 없습니다. 그러나 번들과 목표물을 사용하여 달성 할 수 있습니다. 프로젝트에 새 번들을 추가하고 다음 Base SDK를 실행합니다. 최신 iOS (iOS X.X) (X.X에는 컴퓨터에 설치된 최신 iOS SDK의 번호가 표시됩니다). 아키텍처 : $ (ARCHS_STANDARD_32_BIT) armv6 ("armv6"이전의 공간을 포함하여이 값이 정확하게 중요합니다.)이 설정은 Xcode 4.2에 유효합니다. 이전 버전을 사용하는 경우 "Standard (armv6 armv7)" 선택권. (이 속성의 값은 항목의 값에 따라 다르므로 먼저 설정하십시오). 활성 아키텍처 만 빌드 : 아니요 (그렇지 않으면 armv6과 armv7을 동시에 컴파일 할 수 없음). 유효한 아키텍처 : $ (ARCHS_STANDARD_32_BIT) (정확하게이 값이되는 것이 중요합니다). Xcode에서 armv6 및 armv7을 사용하여 두 줄을 표시하는 경우 삭제 한 다음 한 줄에이 값을 삽입하십시오. Dead Code Stripping : NO. 표준 라이브러리와 연결 : 아니요. Mach-O 유형 : 재배치 가능한 객체 파일. 이것이 가장 중요한 변화입니다. 여기서는 컴파일러에게 Bundle을 relocatable 파일로 처리하도록 지시합니다. 이렇게하면 래퍼 설정이있는 프레임 워크로 바뀔 수 있습니다. 기타 링커 플래그 :이 설정은 필수는 아니지만 모든 종류의 C++ 코드 (.cpp 또는 .cpp)를 사용할 계획이라면.mm)이 프레임 워크에서 Chris Moore (의견에)는 "-lstdC++"옵션을 사용하라고 조언합니다. 이 경우 오래된 컴파일러의 충돌을 피하기 위해 "-ObjC"도 사용하는 것이 좋습니다. 래퍼 확장 : 프레임 워크. 여기에서 번들을 프레임 워크로 변경합니다. Xcode에서 프레임 워크는 하나 이상의 컴파일 된 이진 소스, 리소스 및 일부 폴더가있는 .framework 확장자를 가진 폴더이며 일반적으로 헤더라고하는 폴더에는 모든 공용 헤더가 포함됩니다. 디버그 기호 생성 : 아니요 (매우 중요한 설정입니다. 그렇지 않으면 프레임 워크가 다른 컴퓨터/프로필에서 작동하지 않습니다). 접두어 머리글 사전 컴파일 : 아니요.

는 aggrigated 대상을 생성하고 실행 스크립트에

# Sets the target folders and the final framework product. 
FMK_NAME=FI 
FMK_VERSION=A 

# Install dir will be the final output to the framework. 
# The following line create it in the root folder of the current project. 
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework 

# Working dir will be deleted after the framework creation. 
WRK_DIR=build 
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework 
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework 

# Building both architectures. 
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos 
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator 

# Cleaning the oldest. 
if [ -d "${INSTALL_DIR}" ] 
then 
rm -rf "${INSTALL_DIR}" 
fi 

# Creates and renews the final product folder. 
mkdir -p "${INSTALL_DIR}" 
mkdir -p "${INSTALL_DIR}/Versions" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers" 

# Creates the internal links. 
# It MUST uses relative path, otherwise will not work when the folder is copied/moved. 
ln -s "${FMK_VERSION}" "${INSTALL_DIR}/Versions/Current" 
ln -s "Versions/Current/Headers" "${INSTALL_DIR}/Headers" 
ln -s "Versions/Current/Resources" "${INSTALL_DIR}/Resources" 
ln -s "Versions/Current/${FMK_NAME}" "${INSTALL_DIR}/${FMK_NAME}" 

# Copies the headers and resources files to the final product folder. 
cp -R "${DEVICE_DIR}/Headers/" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/" 
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/" 

# Removes the binary and header from the resources folder. 
rm -r "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/Headers" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/${FMK_NAME}" 

# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product. 
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}" 

rm -r "${WRK_DIR}" 

이 복사 프레임 워크를 아래

+0

귀하의 웹 사이트로가는 스팸 링크를 막으십시오. –

+0

@AndrewBarber 내 웹 사이트라고 생각합니까? 방금 질문에 대답한다면? 그게 내 웹 사이트라면 훨씬 더 행복 할거야 :) –

+0

이 사이트에 답변의 유용한 점을 게시하거나 게시 위험이 [ "답변이 없음"]으로 삭제된다는 점에 유의하십시오 (http : //meta.stackexchange.com/q/8259). 원하는 경우 링크를 포함 할 수 있지만 '참조'로만 사용하십시오. 대답은 링크가 필요없이 독자적으로 서 있어야합니다. –

관련 문제