写在前面
- 一些发现和建议:我这里使用SDK实现QQ平台的相关分享功能。网上其实也有蛮多相关的文章提到了这个错误,但是都没有明确说明是什么问题,或者只是告诉你怎么处理之后就好了,但是并没细致分析是什么原因。其实这是个很简单的问题,恨只能恨很多同学看到英文报错就内心发慌,其实没几个单词,看仔细点就知道是什么原因了。
分析问题
接下来我们就分析:
导入TencentOpenApi SDK,或者更新TencentOpenApi之后运行报如下错误
Undefined symbols for architecture arm64:
"l_OBJC_PROTOCOL_$_TencentApiInterfaceDelegate", referenced from: l_OBJC_CLASS_PROTOCOLS_$_AppDelegate in AppDelegate.o
很显然,根据
l_OBJC_PROTOCOL_$_TencentApiInterfaceDelegate
和l_OBJC_CLASS_PROTOCOLS_
两个关键信息可以定位到,问题出在TencentApiInterfaceDelegate
这个协议上面。我们进一步提取信息:根据
l_OBJC_CLASS_PROTOCOLS_$_AppDelegate in AppDelegate.o
可以明显的定位到问题就在APPDelegate里面。
那么我们就到Appdelegate文件中去一探究竟
来到APPdelegate.m 文件里,相关代码如下:
@interface AppDelegate ()<JPUSHRegisterDelegate,TencentApiInterfaceDelegate> { TencentOAuth *_TencentOAuth; }
- 发现APPdelegate引用的协议中有一个警告
Cannot find protocol definition for 'TencentApiInterfaceDelegate'
,提示我们没有找到该协议的定义:
- 发现APPdelegate引用的协议中有一个警告
由于我是在很久之前就使用了这个SDK,最近为了将项目组件化,顺便把SDK也做了更新,并做了组件化封装,所以这里是老代码,以前这里没有改过,那么我们点到这个协议的相关代码去看看究竟:
#import <UIKit/UIKit.h> #import "sdkdef.h" @protocol TencentSessionDelegate; @protocol TencentLoginDelegate; @protocol TencentApiInterfaceDelegate; @protocol TencentWebViewDelegate; @class TencentApiReq; @class TencentApiResp;
- 然后我们可以看到,果不其然,这四个协议除了在这里进行了名称定义之外,完全没有具体的定义,我在全局搜索一下也没有搜到,那么问题就简单了,没有实现,说明没用呗,我们还要啥自行车。你遗弃了老东西自然要把新的API拿出来,既然我是要QQ分享,那么就从QQApiInterface中去找,果不其然,在QQApiInterface.h中找到如下信息:
/**
\brief 处理来至QQ的请求及响应的回调协议
*/
@protocol QQApiInterfaceDelegate <NSObject>
/**
处理来至QQ的请求
*/
- (void)onReq:(QQBaseReq *)req;
/**
处理来至QQ的响应
*/
- (void)onResp:(QQBaseResp *)resp;
/**
处理QQ在线状态的回调
*/
- (void)isOnlineResponse:(NSDictionary *)response;
@end
解决问题
- 那么我们引入
QQApiInterface.h
头文件,把TencentApiInterfaceDelegate
替换成QQApiInterfaceDelegate
再次运行,完美。
写在最后
- debug就算到此结束,但还有一点要吐槽的是,现在的工程都是比较大的,警告一般来说都非常多,像这种警告,很多人都不会在意,那么我想说的是,在腾讯的SDK中保留这种没有具体定义的协议,很容易给相关开发者带来这样的一些困扰,尤其是这种看起来是一个父协议,而在SDK中没有找到任何定义,也没有任何子协议继承,这就让人非常不解为什么要把代码写成这个样子。好吧,吐槽结束。希望大家能够给大家一点帮助。