適用情況
iOS 8.0 以上支持
通過 CocoaPods 引入 Swift 編寫的庫
問題背景
CocoaPods 在 0.36.0 版本開始蜓堕,支持了 framework 和 Swift墨叛,由于 Swift 只支持 framework,所以在用 CocoaPods 集成 Swift 代碼時尝盼,必須要在 Podfile 文件里添加 use_frameworks!
吞滞,才能正確集成 Swift 項目(子 Pod )。但是由于 framework 里面包含了子 Pod 中的所有資源(如 .png, .bundle
)东涡,所以如果子 Pod 代碼在獲取自己的資源時谅年,使用了 [NSBundle mainBundle]
霍弹,就會造成無法獲取資源挂据,發(fā)生錯誤丸边。
例子
以我們自己的 NTFeedBack
庫為例子,新建立一個工程祖娘,Podfile 如下:
source 'https://github.com/CocoaPods/Specs.git'
source 'https://*********/podspec.git'
platform :ios, '8.0'
use_frameworks!
target :Framework do
pod 'NTFeedBack', '~> 3.2.3'
link_with 'Framework'
end
運行完 pod install
以后失尖,打開工程,在 AppDelegate.m
中添加頭文件:
#import "NFBManager.h"
在 application:didFinishLaunchingWithOptions:
方法中添加下面代碼:
[NFBManager configWithProduct:@"chexian_client" productId:@"10" version:@"1" channel:@"apple" deviceId:@"abcde"];
[NFBManager startMessagePolling];
然后運行應用渐苏,會崩潰掀潮,崩潰信息如下:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
調試后會發(fā)現(xiàn),問題出現(xiàn)在 NFBMessageDB.m
文件中 75 行的 managedObjectModel
方法返回了一個 nil
值琼富,而這個 nil
值就是因為用 [NSBundle mainBundle]
獲取資源而沒有拿到產生的仪吧,代碼如下:
-(NSManagedObjectModel *)managedObjectModel{
static NSManagedObjectModel *managedObjectModel = nil;
NSString *momPath ;
momPath = [[NSBundle mainBundle] pathForResource:@"FBMessages" ofType:@"momd"];
//NSLog(@"path %@",momPath);
if (momPath){
NSURL *momUrl = [NSURL fileURLWithPath:momPath];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momUrl];
}
return managedObjectModel;
}
解決方法
網(wǎng)址 1、網(wǎng)址 2 很詳細地說明了如何解決這個問題鞠眉,簡單總結一下:
- 先用下面的代碼獲取 framework 所在的 bundle
[NSBundle bundleForClass:<#ClassFromPodspec#>]
- 然后再用
URLForResource:withExtension:
方法來取到想要的其它資源
建議
建議通用庫的作者都檢查一下自己的庫薯鼠,看是否存在這樣的情況;
使用 Swift 的項目也需要檢查一下自己使用的庫械蹋,看是否存在此問題出皇。