迁移并使用动态库
一个Swift2.3项目迁移到Swift3.0, 并且使用use_framworks!全部第三方库升级到动态库.
一共花费了将近2个星期解决遇到的问题, 非常多的坑!
公司有十几个的公共库被导入, 而这些库的#import
和podspec.json
使用不规范,导致迁移动态库遇到很多问题.
#import
动态库: 引用并其他库的头文件时, 必须使用 #import<SDWebImage/UIImageView+WebCache.h>
, 而不能使用 #import"UIImageView+WebCache.h"
静态库: 静态库使用2种均不会报错, 而动态库必须使用第一种.
podspec.json
podspec.json: 由podspec ruby生成json文件, CocoaPods根据这个文件,管理和配置第三方库的代码和依赖.
动态库: 你的库依赖什么第三方库, podspec中dependencies字段, 必须的填写你所依赖库的名字, 否则编译会报错xxx file not found
,
静态库: 即使你不写依赖, 编译仍然可以找到文件
Redundant confromance of 'xxx' to protocol 'xxx'
当使用一个OC的动态库时候, 无论你是在Bridge.h 使用 @import XXKit;
还是在.swift文件里使用 import XXKit
. OC库里面的Category将会作用全局.
BlocksKit里有很多Category, 并且在.h公开了一些协议.
//UIActionSheet+BlocksKit.h
@interface UIActionSheet (BlocksKit) <UIActionSheetDelegate>
///-----------------------------------
/// @name Creating action sheets
///-----------------------------------
@end
那么你只要导入了他的框架, 那么他会默认给所有继承UIActionSheet
的子类统统添加上UIActionSheetDelegate
协议.
最好的办法就是将协议放在 .m文件, 然后作为私有协议使用.
如果这要公开出来, 那么也不要使用系统的协议, 你可以自己声明一些自己写的协议, 否则Swift在动态库使用的时候, 会默认給所有的class添加这个协议.
按规范写呀!
swift error in module info from this module will be unavailable in the debugger
当我整理完全部项目的时候, 调试窗口的变量统统不可以视。
网上说是Bridge.h文件导入库用了import<>,应该全部换成import""或者@import。
但是我尝试之后都不能解决问题, 于是版本回滚到早前的版本查找问题.
后来在AppDelegate 注释了一个我公司的一个库, 然后在Bridge.h文件
@import AuditManageKit
;, 然后就可以正常调试了. 这有可能是Xcode编译器的Bug也可以是代码不规范导致的.
原因我猜测:
其它同事写的OC文件, 被他导入到 Bridge.h文件内, 成为了全局导入的文件, 那么在import kit可能会造成重复引用. 但Swift Compiled 居然不报错, 这简直坑死人了, 折腾一天才解决这个问题.
重要的事情再说一次, 写代码一定要规范.
QQ20170222-163654@2x.png
网友评论