导入、更新TencentOpenApi 运行报错

写在前面

  • 一些发现和建议:我这里使用SDK实现QQ平台的相关分享功能。网上其实也有蛮多相关的文章提到了这个错误,但是都没有明确说明是什么问题,或者只是告诉你怎么处理之后就好了,但是并没细致分析是什么原因。其实这是个很简单的问题,恨只能恨很多同学看到英文报错就内心发慌,其实没几个单词,看仔细点就知道是什么原因了。

分析问题

接下来我们就分析:

  • 导入TencentOpenApi SDK,或者更新TencentOpenApi之后运行报如下错误

    Undefined symbols for architecture arm64:

    "l_OBJC_PROTOCOL_$_TencentApiInterfaceDelegate", referenced from:
    l_OBJC_CLASS_PROTOCOLS_$_AppDelegate in AppDelegate.o
    
  1. 很显然,根据 l_OBJC_PROTOCOL_$_TencentApiInterfaceDelegatel_OBJC_CLASS_PROTOCOLS_ 两个关键信息可以定位到,问题出在TencentApiInterfaceDelegate这个协议上面。

  2. 我们进一步提取信息:根据l_OBJC_CLASS_PROTOCOLS_$_AppDelegate in AppDelegate.o可以明显的定位到问题就在APPDelegate里面。

那么我们就到Appdelegate文件中去一探究竟

  1. 来到APPdelegate.m 文件里,相关代码如下:

    @interface AppDelegate ()<JPUSHRegisterDelegate,TencentApiInterfaceDelegate> {
    TencentOAuth    *_TencentOAuth;
    }
    
    • 发现APPdelegate引用的协议中有一个警告Cannot find protocol definition for 'TencentApiInterfaceDelegate',提示我们没有找到该协议的定义:
  • 由于我是在很久之前就使用了这个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中没有找到任何定义,也没有任何子协议继承,这就让人非常不解为什么要把代码写成这个样子。好吧,吐槽结束。希望大家能够给大家一点帮助。