解决CocoaPods库图片无法显示的问题-通过修改github第三方库源代码

CocoaPods很好很强大,在使用的时候兼容性和契合度都非常好,极少有出错的情况。但凡事没有绝对,这不本猫在使用TWMessageBarManager库的时候就出现了一段小插曲。

TWMessageBarManager库是一个iOS中的显示通知提示栏的库,非常简洁,虽然该库已经很多年没有更新了,但并不影响其在github的star数量。

我基本上在使用一个较复杂的库之前,尤其是其文档略模糊,用法不明的库之前,都会先下载然后运行一下它的demo试一下。

So,从github克隆TWMessageBarManager到本地,然后编译运行,一切都很完美:确认过眼神,这是我想要的”码” ;)

于是将TWMessageBarManager集成到我的项目中,编写调用代码,运行…

等等!!这好像和demo中的不太一样哎…通知栏里怎么没有图片???

TWMessageBarManager对于通知栏分了3种类型,分别是:success,failed和info。对于每种类型在显示的时候都会有一张对应的修饰图片显示在通知栏。这个在demo中没问题,但集成到我的项目之后,图片呢???

到github该项目的issue分类中找了下,貌似没有人遇到该类问题,又到SO里转了一圈,还是一无所获,所以这下不能再“懒”了,得自己动脑细胞了 ;)

打开TWMessageBarManager的源代码:TWMessageBarManager.m文件,概览其属性,很快发现以下3行代码:

// Strings (TWMessageBarStyleSheet)
NSString * const kTWMessageBarStyleSheetImageIconError = @"icon-error.png";
NSString * const kTWMessageBarStyleSheetImageIconSuccess = @"icon-success.png";
NSString * const kTWMessageBarStyleSheetImageIconInfo = @"icon-info.png";

到实际生成的TWMessageBarManager.framework中查看,发现这3张图片是存在的。这就排除了文件不存在的问题。

使用快捷键cmd + f,在该文件中查找kTWMessageBarStyleSheetImageIconInfo名称,很快发现仅有一个引用,如下:

- (nonnull UIImage *)iconImageForMessageType:(TWMessageBarMessageType)type
{
    UIImage *iconImage = nil;

    switch (type)
    {
        case TWMessageBarMessageTypeError:
            iconImage = [UIImage imageNamed:kTWMessageBarStyleSheetImageIconError];
            break;
        case TWMessageBarMessageTypeSuccess:
            iconImage = [UIImage imageNamed:kTWMessageBarStyleSheetImageIconSuccess];
            break;
        case TWMessageBarMessageTypeInfo:
            iconImage = [UIImage imageNamed:kTWMessageBarStyleSheetImageIconInfo];
            break;
    }
    return iconImage;
}

看来我们的运气还不错,相关的代码比想象的简单(可以补脑一下以前本猫逆向XP内核时在汇编的汪洋大海中寻针的壮观景象)。

我们在其中下一个BP,然后运行至触发BP,发现iconImage变量在赋值后,竟然为nil!这显然不太对。

为了万无一失,在demo中重复上述过程,发现iconImage不为nil,至此可以确认是[UIImage imageNamed:xxx]调用出了问题!

大胆的猜测下(这是本猫经常干的事,虽然经常猜错…),图片现在在framework中而不是在app bundle中,所以[UIImage imageNamed:]会失败;而demo中没有framework,它是集成在App里的,所以会成功。

所以我们只要定位正确的图片位置即可。

我们需要使用另一个API:

[UIImage imageNamed:inBundle:compatibleWithTraitCollection:]

打开项目中的Pods目标,定位到TWMessageBarManager:

这里写图片描述

看到上图中的Bundle Identitier项了么?就是它了:

NSBundle *bundle = [NSBundle bundleWithIdentifier:@"org.cocoapods.TWMessageBarManager"];

iconImage = [UIImage imageNamed:kTWMessageBarStyleSheetImageIconInfo inBundle:bundle compatibleWithTraitCollection:nil];

如上所示修改TWMessageBarManager源代码,因为默认是只读的,所以你必须允许修改,否则…

接下来见证成果的时候到了,运行App:


这里写图片描述

图片终于出现了,本猫这回猜对了 ;)

经过以上缜密(瞎猜?)的分析,本猫向大家展示了如何修改github中第三方库中的代码,其实这本不需要多高深的水平,有时往往你欠缺的只是专注和灵光一闪。

感谢观赏,下次再见 ;)

猜你喜欢

转载自blog.csdn.net/mydo/article/details/80728326
今日推荐