iOS收藏

发布自己的开源框架到CocoaPods

2017-07-10  本文已影响24人  EvanJq

简述大致流程

踩过的坑:

给 Pod 添加资源文件

利用 resource_bundles 属性可以指定 pod 要使用的资源文件。这样就实现了把图片、音频、NIB等资源打包进最终应用程序的目的。

当你的 pod 库以 framework 形式被使用时,你的资源不是被拷贝到 mainBundle 下,而是被放到 pod 的最终产物—— framework 里。此时,你必须保证自己在访问这个 framework 的 bundle,而不是 client target 的。

[NSBundle bundleForClass:<#ClassFromPodspec#>]

上面这段代码可以返回某个 class 对应的 bundle 对象。具体的,

如果你的 pod 以 framework 形式被链接,那么返回这个 framework 的 bundle。
如果以静态库(.a)的形式被链接,那么返回 client target 的 bundle,即 mainBundle。
但无论以哪种形式链接,在这个方法返回的 bundle 下都有你的 pod 资源。接下来要做就是去访问他们。

写了一个方便访问 pod 图片的 category。

spec.resource_bundles = {
  'MyLibrary' => ['your/path/to/resources/*.png'],
}
@implementation NSBundle (MyLibrary)

+ (NSBundle *)my_myLibraryBundle {
    return [self bundleWithURL:[self my_myLibraryBundleURL]];
}


+ (NSURL *)my_myLibraryBundleURL {
    NSBundle *bundle = [NSBundle bundleForClass:[MYSomeClass class]];
    return [bundle URLForResource:@"MyLibrary" withExtension:@"bundle"];
}

@end
#import "UIImage+MyLibrary.h"
#import "NSBundle+MyLibrary.h"

@implementation UIImage (MyLibrary)

+ (UIImage *)my_bundleImageNamed:(NSString *)name {
    return [self my_imageNamed:name inBundle:[NSBundle my_myLibraryBundle]];
}


+ (UIImage *)my_imageNamed:(NSString *)name inBundle:(NSBundle *)bundle {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
    return [UIImage imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil];
#elif __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_8_0
    return [UIImage imageWithContentsOfFile:[bundle pathForResource:name ofType:@"png"]];
#else
    if ([UIImage respondsToSelector:@selector(imageNamed:inBundle:compatibleWithTraitCollection:)]) {
        return [UIImage imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil];
    } else {
        return [UIImage imageWithContentsOfFile:[bundle pathForResource:name ofType:@"png"]];
    }
#endif
}

@end

逻辑很简单:先拿到最外面的 bundle。 对 framework 链接方式来说就是 framework 的 bundle 根目录,对静态库链接方式来说就是 target client 的 main bundle,然后再去找下面名为 MyLibrary 的 bundle 对象,再去取bundle下的对应资源。

最后推荐下自己创建的开源框架JQNavigationController, 解决导航栏透明与变色问题,喜欢的可以给个star。

学习至:
http://www.cnblogs.com/XYQ-208910/p/6214066.html
http://blog.xianqu.org/2015/08/pod-resources/

上一篇 下一篇

猜你喜欢

热点阅读