OBJ-C 정적 라이브러리의 NSBundle, Plist 및 기타 리소스
문제
Xcode에 정적 라이브러리를 만들었습니다.이 도서관은 다른 프로젝트에서 성공적으로 사용할 수 있습니다. 그러나 Plist와 같은 자원을 사용하면 프로젝트가 사용되는 주요 프로젝트의 라이브러리에 참조 된 plist를 포함해야합니다.
정적 라이브러리 프로젝트에서 대상의 "복사 번들 리소스"단계에 포함되어 있습니다. 내 코드에서 여기에 내가하고있는 일이 있습니다.
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *filePath = [mainBundle pathForResource:@"MyClassParams" ofType:@"plist"];
NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
MainBundle을 사용하고 MyClassparams.plist가 메인 프로젝트에 포함되어 있으면 모두 좋습니다. MyClassparams.plist가 라이브러리 프로젝트에 포함되어 있으면 작동하지 않습니다.
NSBUNDLE MAINBUNDLE]이 사용하기에 잘못된 정적 방법을 참조하고 있다고 가정하자면 다음과 같이 대체했습니다.
NSBundle *mainBundle = [NSBundle bundleForClass:[MyClass class]];
이것은 작동하지 않았습니다.
그렇다면 정적 라이브러리에 Plist 또는 기타 리소스를 포함시킬 수 있습니까? 아니면 LIB가 사용되는 프로젝트에 필요한 것을 포함해야합니까?
해결책
정적 라이브러리는 번들에 있지 않으며 응용 프로그램에 연결되면 해당 응용 프로그램 번들의 일부입니다. iPhone에서는 효과적으로 작성된 모든 코드가 임베디드 프레임 워크를 포함 할 수 없으므로 MainBundle에 있습니다.
예, 정적 프레임 워크를 연결하는 프로젝트에 모든 리소스를 복사해야합니다.
다른 팁
리소스 파일을 정적 라이브러리에 포함시킬 수 없다는 것을 알고 있습니다 (프레임 워크가하는 일). 프로젝트에서 다른 솔루션을 사용합니다.
정적 라이브러리 "YYY"프로젝트 내부 :
- 내 정적 라이브러리 프로젝트에 "로드 가능한 번들"대상을 추가합니다 (대상 추가, 코코아,로드 가능한 번들 추가)
- 이 목표를 정적 라이브러리 대상의 종속성으로 추가합니다.
메인 프로젝트 내부 :
- 링크
libYYY.a
- 번들을 추가하십시오
YYY.bundle
복사 된 리소스 파일에
이러한 방식으로 정적 라이브러리에 사용 된 리소스 파일은 기본 프로젝트에서 관리되지 않습니다. 내가 가지고 있다고 말합니다 foo.png
정적 라이브러리에서 사진을 사용합니다
[UIImage imageNamed:@"YYY.bundle/foo.png"]
그런 다음 다음과 같은 분위기를 얻을 수 있습니다.
NSBundle *staticLibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"YYY" ofType:@"bundle"]];
NSString *filePath = [staticLibBundle pathForResource:@"MyClassParams" ofType:@"plist"];
NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
아래에서 두 개의 스크린 샷 :
- 왼쪽:로드 가능한 번들 대상이있는 정적 라이브러리 프로젝트
- 오른쪽: "라이브러리와 링크 바이너리"에 추가 된 정적 라이브러리 바이너리와 "복사 번들 자원"에 추가 된 리소스 번들을 표시합니다.
나는 @jilouc가 제안한 모든 것을 따랐지만 번들을 얻을 수는 있지만 그 안에 파일을 넣지 못했습니다. 두 가지 방법을 모두 시도했습니다 (@"yyy.bundle/image"
또는 staticlib pathforresource...
)
그런 다음 아래 방법을 사용하여 작동했습니다!
NSBundle *staticBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"yy.bundle"]];
NSString *filePath = [[jsBundle resourcePath]stringByAppendingPathComponent:fileName];
NSString* content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];