集成步骤

下载开发包

请联系亲加客服人员;

编译链接

将压缩包根目录下的include文件夹添加到您的工程中,将libs目录下的libgotyeapi.a静态库(另外还有一个libgotyeapi_c++11.a,二者只能选其一, 后面会介绍其区别)添加到您的工程,如下图红色框所示。同时请添加下图绿色框中的系统库:

如果您的工程指定了下图所示的工程设置,则必须使用libgotyeapi_c++11.a: 如果使用该环境,请在添加系统库的同时添加libstdc++6.0.9.dyliblibstdc++.dylib

接口文档

查看iOS的索引文档可以点击此处

基本调用流程

下图为增强版API基础接口调用流程图,该流程简单描述了调用各个功能的必要准备和流程。用户可以根据自身需求,集成相应的功能(点此查看大图):

说明

在objectiveC (OC) 下使用API接口,只需要在用到API的文件中引用GotyeOCAPI.h:

#import "GotyeOCAPI.h"

常用数据结构定义

多媒体(GotyeOCMedia)

媒体对象,包含语音、图片或者纯数据的相关信息

GotyeMediaType type;    ///< 媒体类型:语音/图片/用户数据/额外数据
GotyeMediaStatus status;    ///< 媒体文件状态:下载中,下载完成等
NSString* url; ///<媒体在服务器的相对url
NSString* path;    ///<保存语音/图片缩略图/用户数据的本地文件路径
NSString* pathEx; ///< 保存语音PCM元数据(需解码)/图片大图(需下载)的本地文件路径
unsigned duration;  ///<语音时长(毫秒),只在语音时生效

注意:API会自动为每个多媒体对象创建好文件存储路径,但并不意味着指定路径下的文件就一定存在,有些是需要通过下载接口调用才能获取到指定文件的,比如音频,原始图片,PCM音频数据。

聊天对象基类(GotyeOCChatTarget)

GotyeChatTargetType type;   /// < 聊天对象类型 ,用户/群组/聊天室
long long id;  ///<聊天室/群组的唯一标志符,从服务器获取,该字段对用户无效
NSString* name;  ///<用户唯一标志符,如果对象类型为聊天室/群组时,这个字段表示其名称.
NSString* info;   ///<扩展信息字段,可修改并提交服务器
bool hasGotDetail;   ///<是否已获取详情
GotyeOCMedia* icon;    ///< <用户/聊天室/群组头像,图片路径存储在其path字段

GotyeOCChatTarget是用户(GotyeOCUser)/聊天室(GotyeOCRoom)/群组(GotyeOCGroup)的公共基类,使用时请不要直接构造一个GotyeChatTarget基类对象,参考下面其子类构造函数。

用户(GotyeOCUser)

NSString* nickname; ///<用户的昵称(可选项)
GotyeUserGender gender; ///<用户的性别(可选项)
bool isBlocked; ///<是否已被黑名单
bool isFriend; ///<是否是好友

申明一个用户非常简单:

GotyeOCUser *user = [GotyeOCUser userWithName:@”someone”];  
///<构造一个账号为someone的单聊用户

聊天室(GotyeOCRoom)

bool isTop; ///<是否为顶级聊天室
unsigned capacity; ///<该聊天室可容纳的最多人数
unsigned onlineNumber;  ///<当前在线人数

群组(GotyeOCGroup)

GotyeGroupType ownerType; ///<群类型(公共群/私有群)
std::string ownerAccount; ///<群的所有者账号
bool needAuthentication;///<是否需要认证加入
unsigned capacity; ///<群成员最大数量

一般来说聊天室/群组不需要由使用者自己创建,而是通过API接口获取并构造好,除非已经明确知道聊天室/群组的唯一标志ID。

消息(GotyeOCMessage)

消息对象,保存发送和接受的消息的全部信息。

///<对象原型参考 GotyeOCMessage.h
long long id;   ///< 消息在服务器的ID
unsigned date;  ///< 消息发送的时间,如果本地与服务器时间不一致,容易导致消息列表乱序
long long dbID;  ////< 消息在本地数据库唯一ID
NSString* text;    ///< 文本消息的文本,只在文本消息时有效
GotyeOCMedia* media;   ///< audio/image/userdata消息的数据对象
GotyeOCMedia* extra;   ///< 额外数据 extra Data的数据对象
GotyeMessageType type;  ///< 消息类型: 文本,语音,图片,用户数据
GotyeMessageStatus status;  ///< 指示消息状态,未读,发送成功/失败等等
GotyeOCChatTarget* sender;  ///< 消息发送者-用户
GotyeOCChatTarget* receiver;   ///<消息接受者-用户/群组/聊天室
//新消息创建可以调用相关静态CreateMessage接口来创建,例如:
 +(instancetype)createTextMessage:(GotyeOCChatTarget*)receiver text:(NSString*)text;

通知(GotyeOCNotify)

通知对象,目前只有群组申请相关的通知需要用到

///<对象原型参考 GotyeOCNotify.h
long dbID;  ///< 本地数据库唯一ID
long date; ///< 通知发送的时间
bool isRead;  ///< 是否已读
GotyeOCChatTarget* sender;  ///< 通知发送者
GotyeOCChatTarget* receiver;  ///< 通知接受者
GotyeOCChatTarget* from;  ///< 通知来源的群组
bool agree;  ///< 是否同意(用于入群申请答复)
bool isSystemNotify; ///< 是否是系统通知(目前未使用)
GotyeNotifyType type; ///< 通知类型:入群邀请/申请/答复
NSString* text;   ///< 通知的文字内容
GotyeOCChatTarget* from;  ///< 通知来源的群组
bool agree;  ///< 是否同意(用于入群申请答复)
bool isSystemNotify; ///< 是否是系统通知(目前未使用)
GotyeNotifyType type; ///< 通知类型:入群邀请/申请/答复
NSString* text;   ///< 通知的文字内容

接口返回值(状态码)一览表

GotyeStatusCodeWaitingCallback          = -1,   ///< 异步调用成功,请等待回调
GotyeStatusCodeOK                       = 0,    ///<操作成功
GotyeStatusCodeSystemBusy               = 1,    ///< 系统忙,正在处理中
GotyeStatusCodeNotLoginYet              = 2,    ///< 还未登陆
GotyeStatusCodeCreateFileFailed         = 3,    ///< 创建文件失败
GotyeStatusCodeTargetIsSelf             = 4,    ///< 目标是自己(已废除)
GotyeStatusCodeReloginOK                = 5,    ///< 重登陆成功
GotyeStatusCodeOfflineLoginOK           = 6,    ///< 离线登陆模式成功
GotyeStatusCodeTimeout                  = 300,  ///< 超时
GotyeStatusCodeVerifyFailed             = 400,  ///< 验证失败
GotyeStatusCodeNoPermission             = 401,  ///< 没有权限
GotyeStatusCodeRepeatOper               = 402,  ///< 重复操作
GotyeStatusCodeGroupNotFound            = 403,  ///< 群组未找到
GotyeStatusCodeUserNotFound             = 404,  ///< 用户未找到
GotyeStatusCodeLoginFailed              = 500,  ///< 登录失败(此命名有误,应为操作失败)
GotyeStatusCodeForceLogout              = 600,  ///< 强制登出(被其他设备同一账号踢下线).
GotyeStatusCodeNetworkDisConnected      = 700,  ///< 网络连接断开
GotyeStatusCodeRoomNotExist             = 33,   ///< 聊天室不存在
GotyeStatusCodeRoomIsFull               = 34,   ///< 聊天室人数已满
GotyeStatusCodeNotInRoom                = 35,   ///< 不在聊天室内
GotyeStatusCodeForbidden                = 36,   ///< 操作禁止
GotyeStatusCodeAlreadyInRoom            = 39,   ///< 已经在聊天室中
GotyeStatusCodeUserNotExist             = 804,  ///< 用户不存在
GotyeStatusCodeRequestMicFailed         = 806,  ///< 请求Mic失败
GotyeStatusCodeVoiceTimeOver            = 807,  ///< 录音时间超出
GotyeStatusCodeRecorderBusy             = 808,  ///< 录音设备正在使用
GotyeStatusCodeVoiceTooShort            = 809,  ///< 录音时间过短 < 1000ms
GotyeStatusCodeInvalidArgument          = 1000, ///< 有不合法参数
GotyeStatusCodeServerProcessError       = 1001, ///< 服务器处理失败(可能含有非法参数)
GotyeStatusCodeDBError                  = 1002, ///< 操作数据库失败.
GotyeStatusCodeUnkonwnError             = 1100  ///< 未知错误

初始化

初始化

API的初始化非常重要,请准确填写您的appkey以及应用程序包名:

//接口原型:
 +(status)init:(NSString*)appKey packageName:(NSString*)packageName;
//使用您在亲加管理平台申请到的appkey和您的应用程序包名初始化API,appkey和包名如果为空会返回参数错误。
//GotyeOCAPI所有接口都使用静态函数,直接使用GotyeOCAPI调用即可,参考代码:
[GotyeOCAPI init:@"9c236035-2bf4-40b0-bfbf-e8b6dec54928" packageName:@"gotyeimapp"];

初始化语音识别

[GotyeOCAPI initIflySpeechRecognition];
//说明:
IOS的语音识别同安卓一个道理,在调用完init接口之后调用初始化语音识别的接口,录完音之后,在onStopTalk回调中,识别结果
在message的text字段里面。

麦克风权限

在ios应用中第一次使用录音接口,ios系统会弹出系统对话框向用户确认麦克风权限,为避免在应用使用过程中打断用户操作,影响用户体验,我们建议在app启动时就去获取麦克风权限:

[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { 
if (granted) { 
    // 用户同意获取数据 
} else { 
    // 用户不同意,注意,没有获得麦克风权限的情况下,语音录音的操作会失败。
} 
}];

退出

应用程序退出时请调用如下接口,这个接口会终止API内部所有的子线程,同时会销毁API所有模块组件(该过程不可逆):

[GotyeOCAPI exit];

监听异步回调

iOS异步回调监听可以采用c++的方式,但为了更大程度满足开发者的使用习惯,我们提供了专门面向Objective-C的委托管理器。按如下示例代码实现协议 GotyeOCDelegate即可,在最后我们附加了所有相关回调的说明:

//在任何OC类中包含”GotyeOCDelegate.h”,并在您的类上实现GotyeOCDelegate
  #import "GotyeOCDelegate.h"
@interface GotyeLoginController<GotyeOCDelegate>
//在需要的时候向GotyeOCAPI添加代理实例,请记住不使用的时候请清除代理实例,避免在回调发生时候实例已经不存在而已产生致命错误,在ARC开启时,这个引用会导致实例无法自动销毁
- (void)viewWillAppear:(BOOL)animated
{
[GotyeOCAPI addListener:self];
}
- (void)viewDidDisappear:(BOOL)animated
{
[GotyeOCAPI removeListener:self];
}
//在实现中,可以选择性使用GotyeOCDelegate的回调,例如:
- (void)onLogin:(GotyeStatusCode)code user:(GotyeOCUser *)user 
{
    if(code == GotyeStatusCodeOK)
{
//登入成功的处理
}
}

线程安全

为了简化使用,API的所有异步回调都是在UI主线程被执行,值得注意的是,API的接口本身并非线程安全的,在不同的线程去调用API接口,极有可能导致无法预料的运行结果,因此我们强烈推荐:仅在UI主线程去调用API接口。

登录退出

登录/退出

///接口原型:
+(status)login:(NSString*)username password:(NSString*)password;
//使用指定的用户名登录,应该确保该用户名在整个app数据库系统中是唯一的,否则会出现在同一个appkey之下,使用相同的用户名登录会互相挤掉线的情况,如果你的app设置的是公开注册,password请填nil
[GotyeOCAPI login:@"username" password:nil];///<对应回调GotyeOCDelegate::onLogin
[GotyeOCAPI logout];///<退出登录,对应回调GotyeOCDelegate::onLogout

注意:API大部分接口返回值都是status类型,该类型是个枚举体(GotyeStatusCode),凡是所有具备对应异步回调的接口,正常返回值应该是GotyeStatusCodeWaitingCallback(-1),后续不再赘述。当接收到GotyeOCDelegate::onLogout回调,有可能是相同账号在其他设备上登录引发的强制下线,可以通过回调里面的参数来区分。

回调原型:

 -(void) onLogin:(GotyeStatusCode)code 
user:(GotyeOCUser*)user;  /// <当前登陆的用户
 -(void) onLogout:(GotyeStatusCode)code;

登录回调

 登录回调(GotyeDelegate::onLogin)中的状态码可能有以下五种情况:
 GotyeStatusCodeOK:正常登录成功
 GotyeStatusCodeOfflineLoginOK:离线登录成功
 GotyeStatusCodeReloginOK:重新登录成功(离线转在线)
 GotyeStatusCodeVerifyFailed:认证失败
 GotyeStatusCodeNetworkDisConnected:网络请求失败

登出回调

 登出回调(GotyeDelegate::onLogout)中的状态码可能有以下三种情况:
 GotyeStatusCodeOK:正常登出成功
 GotyeStatusCodeNetworkDisConnected:网络异常,转换成离线状态
 GotyeStatusCodeForceLogout:账号在其他设备登录,被强制下线

断线重连

如果某个账号已经调用接口登录成功,那么在整个app运行期间,只要用户不调用退出登录接口,期间不管网络状况如何变化,API均会在底层尝试重连,每次重连耗时15秒以上仍未成功则会被认为超时,并在5秒后尝试下一次重连。但期间不管网络是否正常,如果用户不小心调用了logout,API会认为用户有意退出登录,就会回到初始状态,不再有任何重连操作,除非用户重新调用登录接口。

在ios下,如果app重新激活或者网络恢复,则会自动重连并产生回调:

 -(void)onReconnecting:(GotyeStatusCode)code user:(GotyeOCUser *)user

重新连接的onLogin回调状态值会有所不同: GotyeStatusCodeReloginOK表示重新连接成功

注意:重连成功之后API会自动进入断线之前已经进入的所有聊天室。

在线状态

//调用下面的接口可以获知当前是否处于在线状态
//返回值NETSTATE  -1 = 离线状态(网络恢复正常后会自动重连)
//返回值NETSTATE  0 = 未登录或者已登出(调用了logout)
//返回值NETSTATE  1 = 在线
int online = [GotyeOCAPI isOnline];

获取账户信息

API在登录成功后,会自动向服务器获取登录账号的详细信息,如果获取成功,会通过以下回调通知给出:

//详见GotyeOCDelegate.h
-(void) onGetProfile:(GotyeStatusCode)code user:(GotyeOCUser*)user;

修改账户信息

///接口原型:
+(status)reqModifyUserInfo:(GotyeOCUser*)user imagePath:(NSString*)imagePath;
/// 参数user是已经修改好的当前用户对象,如果不需要对头像进行修改,第二个参数传nil
GotyeOCUser* loginUser = [GotyeOCAPI getLoginUser];
loginUser.nickname = @”新昵称”;
loginUser.info = @“too young, too simple, too naive”;/// <修改扩展信息
NSString*imagePath = “/mnt/sdcard /icon.jpg”;///<新头像本地文件路径,目前仅支持jpg
[GotyeOCAPI reqModifyUserInfo:loginUser imagePath:imagePath];///<对应异步回调GotyeOCDelegate:: onModifyUserInfo

回调原型:

-(void) onModifyUserInfo:(GotyeStatusCode)code 
user:(GotyeOCUser*)user;  /// < 修改的用户

注意:如果不需要对头像进行修改,第二个参数传nil。

好友系统

用户搜索

[GotyeOCAPI resetUserSearch];/// <重置用户搜索,会将本地搜索结果列表和当前页搜索结果列表清空

调用以下接口可以获取到搜索结果列表引用,该列表属于全局变量,可以直接保存其指针并使用,而不用担心其内存被释放:

NSArray* SearchList =[GotyeOCAPI getLocalUserSearchList];

这个列表会将每次搜索请求返回的结果累计保存起来,以便用于添加好友或者界面展示等应用场景。

下面的接口调用返回单次搜索结果列表:

NSArray* pSearchList = [GotyeOCAPI getLocalUserSearchCurPageList ];

同理,该列表引用也是全局变量,可直接保存其指针并使用。

搜索用户的接口原型如下:

+(status)reqSearchUserList:(unsigned)pageIndex/// <搜索结果页索引,默认从0开始
username:(NSString*)username/// <设定用户名关键字,默认为空串
nickname:(NSString*)nickname/// <设定昵称关键字,默认为空串
gender:(GotyeUserGender)gender; /// <设定性别关键字,默认忽略性别

以下接口的调用将会向服务器请求appkey中所有用户的第一页:

[GotyeOCAPI reqSearchUserList:0 username:nil nickname:nil gender: GotyeUserGenderNotSet];/// <对应回调GotyeOCDelegate::onSearchUserList

注意:

1. 如果pageIndex 为0,API会先清除上述两个搜索列表,相当于默认调用了resetUserSearch

2. 搜索结果会保存在上述两个列表中,区别在于getLocalUserSearchCurPageList仅保存本次页面的搜索结果,而getLocalUserSearchList则会累计保存多次搜索请求的所有结果。

3. 搜索结果中的GotyeUser已经包含了最新用户详情。

4. 异步回调中的两个列表引用参数curPageList和allList与上述两个接口是一个意思:curPageList和getLocalUserSearchCurPageList是同一个列表;allList对应getLocalUserSearchList。

5. 搜索关键字的设定是并且的关系,而不是或者。如果指定username=”abc”同时指定nickname=”abc”的话,则表示搜索结果必须同时满足这两个条件

6. 每页的数量是16,目前不能修改

回调原型:

- onSearchUserList:(GotyeStatusCode)code 
pageIndex:(unsigned)pageIndex  /// <搜索结果页索引
curPageList:(NSArray*)curPageList  /// <当前页列表,如果为空则表示已没有新的页面
 allList:(NSArray*) allList;  /// <所有搜索列表,一般使用这个值来更新UI

好友和黑名单简介

亲加API支持好友和黑名单,这两个概念是互不干涉的,例如用户A可以是用户B的好友,同时A也可以在B的黑名单列表中。另外这两个概念,都是单向的,即A在B的好友列表, B却不一定在A的好友列表。A在B的黑名单列表,B可以不在A的黑名单列表。发送消息时,即便AB之间不存在任何好友关系,A和B都可以相互通讯。但是,如果A在B的黑名单时,A给B发送消息会失败。

获取好友列表/黑名单

调用以下接口可以返回本地数据库存储的好友列表,该列表也属于全局变量:

NSArray* FriendList =[GotyeOCAPI getLocalFriendList ];

如需向服务器请求更新该列表,可以调用以下接口:

[GotyeOCAPI reqFriendList];/// <对应回调GotyeOCDelegate::onGetFriendList

成功获取后,通过getLocalFriendList接口获取到的本地好友列表也会被更新,因此收到回调后,使用保存的列表指针即可刷新UI(如果需要的话)。

回调原型:

- onGetFriendList:(GotyeStatusCode)code 
friendlist:(NSArray*)friendlist;

获取本地黑名单列表:

NSArray*BlockedList =[GotyeOCAPI getLocalBlockedList ];

请求更新黑名单:

[GotyeOCAPI reqBlockedList ];/// <对应回调GotyeOCDelegate::onGetBlockedList

回调原型:

- onGetBlockedList:(GotyeStatusCode)code 
blockedlist:(NSArray*) blockedlist;

添加/删除好友/黑名单

添加好友(参数user为GotyeOCUser类型):

[GotyeOCAPI reqAddFriend:user];/// <对应回调GotyeOCDelegate::onAddFriend,同时会更新本地好友列表

回调原型:

- onAddFriend:(GotyeStatusCode)code 
user:(GotyeOCUser*)user;

删除好友:

[GotyeOCAPI reqRemoveFriend:user];/// <对应回调GotyeOCDelegate::onRemoveFriend,同时会更新本地好友列表

回调原型:

- onRemoveFriend:(GotyeStatusCode)code 
user:(GotyeOCUser*)user;

添加黑名单:

[GotyeOCAPI reqAddBlocked:user];/// <对应回调GotyeOCDelegate::onAddBlocked,同时会更新本地黑名单列表

回调原型:

- onAddBlocked:(GotyeStatusCode)code 
user:(GotyeOCUser*)user;

从黑名单移除:

[GotyeOCAPI reqRemoveBlocked:user;/// <对应回调GotyeOCDelegate::onRemoveBlocked,同时会更新本地黑名单列表

回调原型:

- onRemoveBlocked:(GotyeStatusCode)code 
user:(GotyeOCUser*)user;

获取用户详情

在API消息数据类型中(后续会有详细介绍),发送者和接收者通常都是GotyeOCChatTarget类型,它是用户(GotyeOCUser),群(GotyeOCGroup)以及聊天室(GotyeOCRoom)的共同父类,包含了这3类数据结构的基本属性,但有时候仅有这些基本信息还不够,为了能通过GotyeOCChatTarget变量获取到更多的详情,可以使用如下接口(以用户为例,其中target是GotyeOCChatTarget类型):

GotyeOCUser* user = [GotyeOCAPI getUserDetail:targetforceRequest:false];

注意:

1. 这个接口会直接从本地数据库查询用户详情,如果发现本地数据库查询不到,则会忽略掉第二个参数,自动向服务器请求详情,请求成功会通过回调GotyeOCDelegate:: onGetUserDetailList给出通知;

2. 第二个参数forceRequest的含义是:当该值为false时,只要本地数据库有详情,则不会再向服务器请求,否则一定会发起查询请求;如果为true,则不管本地数据库是否存在数据,都会强制向服务器发起查询请求。

回调原型:

- onGetUserDetail:(GotyeStatusCode)code 
user:(GotyeOCUser*)user; /// <获取到的用户详情

获取聊天室和群详情同理:

GotyeOCRoom* room = [GotyeOCAPI getRoomDetail :target]; /// <这个接口不用向服务器获取详情,无回调
GotyeOCGroup* group = [GotyeOCAPI getGroupDetail :targetforceRequest:false];

回调原型:

- onGetGroupDetail:(GotyeStatusCode)code 
group:(GotyeOCGroup*)group; /// <获取到的群组详情

获取用户头像

有时候我们会希望在界面上展示好友(群/聊天室)头像,这个时候可以调用如下接口去下载其头像到本地(其中user为GotyeOCUser类型,当然也可以是GotyeOCRoom或者GotyeOCGroup):

[GotyeOCAPI downloadMedia :user.icon];/// <对应回调GotyeOCDelegate::onDownloadMedia

回调原型:

-(void) onDownloadMedia:(GotyeStatusCode)code media:(GotyeOCMedia*)media;

聊天室

获取聊天室列表

调用以下接口可以获取到本地数据库缓存聊天室列表,该列表也是全局变量:

NSArray* RoomList =  [GotyeOCAPI getLocalRoomList ];

清除本地聊天室列表缓存:

[GotyeOCAPI clearLocalRoomList ];

向服务器请求更新聊天室信息:

[GotyeOCAPI reqRoomList ];/// <对应回调GotyeOCDelegate::onGetRoomList

请求成功的话,API会自动更新本地聊天室列表,同时写入数据库。

回调原型:

- onGetRoomList:(GotyeStatusCode)code 
pageIndex:(unsigned)pageIndex /// <结果页索引
curPageRoomList:(NSArray*)curPageRoomList /// <当前页列表,如果为空则表示已没有新的页面
allRoomList:(NSArray*)allRoomList;; /// <获取到的所有房间列表

进入聊天室

调用下述代码可以进入指定聊天室(其中的room为GotyeOCRoom类型):

[GotyeOCAPI enterRoom :room];/// <对应回调GotyeOCDelegate::onEnterRoom

回调原型:

- onEnterRoom:(GotyeStatusCode)code 
room:(GotyeOCRoom*)room; /// <进入的聊天室

退出聊天室

退出指定聊天室:

[GotyeOCAPI leaveRoom :room];/// <对应回调GotyeOCDelegate::onLeaveRoom

回调原型:

- onLeaveRoom:(GotyeStatusCode)code 
room:(GotyeOCRoom*)room; /// <离开的聊天室

获取聊天室成员列表

获取聊天室成员列表(请求第0页成员表):

[GotyeOCAPI reqRoomMemberList :roompageIndex :0];/// <对应回调GotyeOCDelegate::onGetRoomMemberList

回调原型:

-(void) onGetRoomMemberList:(GotyeStatusCode)code
room:(GotyeOCRoom*)room/// <请求的聊天室
pageIndex:(unsigned)pageIndex/// <请求时传入的页索引
curPageMemberList:(NSArray*)curPageMemberList/// <当前页所对应的成员列表(全局变量)
allMemberList:(NSArray*)allMemberList; /// <获取到的累计所有成员表(全局变量)

提示:

1. 这里回调返回的curPageMemberList以及allMemberList是临时生成的NSArray;

2. 返回的列表中的用户详细信息已经是服务器最新。

判断是否在指定聊天室

判断是否已经在聊天室中:

bool isIn = [GotyeOCAPI isInRoom :room];/// <返回 true表示已经在聊天室中

判断该房间是否支持实时语音

以下接口的返回值可以直接用来判断一个聊天室是否支持实时语音:

bool support = [GotyeOCAPI supportRealtime:room];

群组

公共群搜索

群组在即时通讯云中分为公共群和私有群,API提供了对公共群的搜索功能,相关接口的调用方式,和用户搜索几乎一致:

[GotyeOCAPI resetGroupSearch];/// <重置群组搜索,会将本地搜索结果列表和当前页搜索结果列表清空

调用以下接口可以获取到群组搜索结果列表引用,该列表属于全局变量,会将单次搜索请求的返回结果累计保存起来:

NSArray* SearchList = [GotyeOCAPI getLocalUserSearchList];

获取单页群组搜索结果列表:

NSArray* SearchList =[GotyeOCAPI getLocalGroupSearchCurPageList ];

发起单页群组搜索,和搜索用户相比,群组搜索只有一个搜索关键字,即群组名字:

[GotyeOCAPI reqSearchGroup :@“vacation” pageIndex: 0]; /// <对应回调GotyeOCDelegate::onSearchGroupList

回调原型:

-(void) onSearchGroupList:(GotyeStatusCode)code
pageIndex:(unsigned)pageIndex/// <请求时传入的页索引
curPageList:(NSArray*) curPageList/// <当前页所对应的群组列表
allList:(NSArray*)allList; /// <获取到的累计所有列表

注意:与用户搜索一样,群组搜索的异步回调GotyeOCDelegate:: onSearchGroupList中的curPageList和allList分别和getLocalGroupSearchCurPageList与getLocalUserSearchList返回值是相同的列表。

获取群列表

调用以下接口可以获取到本地数据库缓存的群组列表,该列表也是全局变量,这里的群组是指登录账号所在的群组(包括自己创建的以及自己加入的):

NSArray* pGroupList =[GotyeOCAPI getLocalGroupList ];

如果想更新该列表,可以发起如下请求:

[GotyeOCAPI reqGroupList];/// <对应回调GotyeOCDelegate::onGetGroupList

回调原型:

-(void) onGetGroupList:(GotyeStatusCode)code
grouplist:(NSArray*)grouplist; /// <所有群列表

注意:

1. 回调中的grouplist引用和上述本地群组都是临时生成

2. 回调中的群组信息已经是包含有最新详情的,可以直接使用

获取群成员列表

获取群组成员列表(请求第0页成员表):

[GotyeOCAPI reqGroupMemberList :room pageIndex:0];/// <对应回调GotyeOCDelegate::onGetRoomMemberList

回调原型:

-(void) onGetGroupMemberList:(GotyeStatusCode)code
room:(GotyeOCRoom*)room/// <请求的聊天室
pageIndex:(unsigned)pageIndex/// <请求时传入的页索引
curPageMemberList:(NSArray*)curPageMemberList/// <当前页所对应的成员列表(全局变量)
allMemberList:(NSArray*)allMemberList; /// <获取到的累计所有成员表(全局变量)

提示:

1. 这里回调返回的curPageMemberList以及allMemberList与前面提到的列表一样,也是临时生成

2. 返回的列表中的用户详细信息已经是服务器最新。

创建/解散群

创建群组时可以指定一系列参数:

GotyeOCGroup* group;
group.name = @“client team”; /// <设定群名字
group.info = @“api development guys”; /// <设定群扩展信息
group.ownerType = GotyeGroupTypePublic; /// <设定群类型(公共群/私有群)
group.needAuthentication = false; /// <是否需要验证才能加入
[GotyeOCAPI createGroup:group);/// <对应回调GotyeOCDelegate::onCreateGroup

回调原型:

-(void) onCreateGroup:(GotyeStatusCode)code
group:(GotyeOCGroup*)group;/// <创建的群组

如果登录账号是群主,则拥有解散群的权限:

[GotyeOCAPI dismissGroup :group];/// <对应回调GotyeOCDelegate::onDismissGroup

回调原型:

-(void) onDismissGroup:(GotyeStatusCode)code
group:(GotyeOCGroup*)group;/// <解散的群组

修改群详情

与创建群组时指定的参数一样,修改群详情时这些参数都可以在后续再次更改,并且,修改群信息时还可以指定群图标(如果需要的话):

group.name = @“server team”; /// <设定群名字
NSString*imagePath = “/mnt/sdcard /icon.jpg”;///<设定新图标路径,目前仅支持jpg
[GotyeOCAPI reqModifyGroupInfo:groupimagePath:imagePath];/// <对应回调GotyeOCDelegate::onModifyGroupInfo

注意:如果不需要对图标进行修改,第二个参数传nullptr(默认形参值即为nullptr)。

回调原型:

-(void) onModifyGroupInfo:(GotyeStatusCode)code
group:(GotyeOCGroup*)group;/// <修改的群组

加入/离开群

如果想加入某个群组(群组信息可能来自群搜索,或者入群邀请),调用以下接口即可(前提是group已经有详情,否则群id必须> 0):

[GotyeOCAPI joinGroup:group]; /// <对应回调GotyeOCDelegate::onJoinGroup

回调原型:

-(void) onJoinGroup:(GotyeStatusCode)code
group:(GotyeOCGroup*)group;/// <加入的群组

对应离开群接口:

[GotyeOCAPI leaveGroup :group]; /// <对应回调GotyeOCDelegate::onLeaveGroup

回调原型:

-(void) onLeaveGroup:(GotyeStatusCode)code
group:(GotyeOCGroup*)group;/// <离开的群组

踢出群成员

如果登录账号拥有群主权限,则可以进行踢人操作(member为GotyeOCUser类型):

[GotyeOCAPI kickoutGroupMember :group user:member]; /// <对应回调GotyeOCDelegate::onKickoutGroupMember

回调原型:

-(void) onKickOutUser:(GotyeStatusCode)code
group:(GotyeOCGroup*)group /// <操作的群组
user:(GotyeOCUser*)user;  /// <被踢出的用户

转让群

如果登录账号拥有群主权限,还可以转让群(user为GotyeOCUser类型):

[GotyeOCAPI changeGroupOwner :group user :user]; /// <对应回调GotyeOCDelegate::onChangeGroupOwner

回调原型:

-(void) onChangeGroupOwner:(GotyeStatusCode)code
group:(GotyeOCGroup*)group /// <操作的群组
user:(GotyeOCUser*)user;  /// <被转让群的用户

群状态改变

当群状态有改变,所有群成员会收到如下回调:

-(void) onUserJoinGroup:(GotyeOCGroup*)group user:(GotyeOCUser*)user;/// <当有用户加入群时
-(void) onUserLeaveGroup:(GotyeOCGroup*)group user:(GotyeOCUser*)user;/// <当有用户离开群时
-(void) onUserDismissGroup:(GotyeOCGroup*)group user:(GotyeOCUser*)user; /// <当群被群主解散时;
-(void) onUserKickedFromGroup:(GotyeOCGroup*)group kicked:(GotyeOCUser*)kicked actor:(GotyeOCUser*)actor;/// <当有用户被群主踢出群时

通知

邀请入群

API允许群成员向其他人发起入群邀请:

[GotyeOCAPI inviteUserToGroup :usergroup: groupinviteMessage :@“Join us!”];

被邀请方将会收到入群通知:

//详见GotyeOCDelegate.h
-(void) onReceiveNotify:(GotyeOCNotify*)notify;///<通知主体
notify.type  ///<GotyeNotifyTypeGroupInvite类型为邀请入群的通知
notify.sender///<邀请的发起人
notify.text///<邀请词

申请入群

向某个群的群主提出入群的申请(群可以来自群搜索):

[GotyeOCAPI reqJoinGroup:groupapplyMessage =@“我要入群!”];

该群群主会收到如下通知:

//详见GotyeOCDelegate.h
-(void) onReceiveNotify:(GotyeOCNotify*)notify;///<通知主体
notify.type  ///<GotyeNotifyTypeJoinGroupRequest类型为申请入群的通知
notify.sender///<申请的发起人
notify.text///<申请词

回复入群申请

群主对入群申请回复(其中notify为入群申请的通知主体):

[GotyeOCAPI replyJoinGroup :notifyrespMessage =@“同意!” agree:YES];

申请人会收到如下通知:

//详见GotyeOCDelegate.h
-(void) onReceiveNotify:(GotyeOCNotify*)notify;///<通知主体
notify.type  ///<GotyeNotifyTypeJoinGroupReply类型为回复申请入群的通知
notify.sender///<回复的发送方
notify.text///<回复词
notify.agree  ///<是否同意

消息

创建消息

即时通讯云支持发送文本,图片,语音,自定义数据四种类型。除语音消息外,其他三种消息都有对应的工厂方法来创建,语音消息虽然也有工厂方法,但一般只由API内部自动调用。

文本消息

创建文本消息的接口参数比较简单:

GotyeOCMessage*message = [GotyeOCMessagecreateTextMessage:receiver text:@ “Hello”];

注意:API允许发送的文本消息字符串的最大长度为6KB。这里的receiver是GotyeOCChatTarget类型,可以填入GotyeOCUser/GotyeOCRoom/GotyeOCGroup的任意一种聊天对象变量,其他类型消息也是一样,后续不再赘述。

图片消息

创建图片消息:

NSString*imagePath = “/mnt/sdcard /icon.jpg”; ///<设定原始图片路径,目前仅支持jpg
GotyeOCMessage* message = [GotyeOCMessagecreateImageMessage:receiverimagePath imagePath];

注意: API允许发送的原始图片的文件最大为6MB。发送图片时,API会生成一张原始图片的缩略图,该缩略图的文件大小被限制在6KB以内,随同消息一同到达接收方。而原始图片则被上传到服务器,接收端在收到消息后需要调用下载接口才能获取到原始图片。

语音消息

开始录音:

[GotyeOCAPI startTalk:chatTarget mode:GotyeWhineModeDefault realtime:NO maxDuration:60*1000];   
///<realtime如果为true,则开始实时语音,聊天室所有用户会收到onRealPlayStart的回调

结束录音:

[GotyeOCAPI stopTalk];

当录音结束,如果不是实时语音,由API内部生成一条语音消息,API会在对应的异步回调中将创建好的语音消息给出:

-(void) onStopTalk:(GotyeStatusCode)code///<录音结束状态码
realtime:(bool)realtime///<是否实时模式,false表示语音短信
message:(GotyeOCMessage*)message///<语音短信模式下API生成的语音消息,如果是实时模式,该参数无效!!!
cancelSending:(bool*)cancelSending] ///<是否取消发送语音,API默认自动发送,如果设定*cancelSending = true,则API会取消发送

通过url构造一个语音消息:

    GotyeOCMessage *message = [GotyeOCMessage createMessage:[GotyeOCAPI getLoginUser]];
    message.type = GotyeMessageTypeAudio;
    message.media = [GotyeOCMedia alloc] init];
    message.media.type = GotyeMediaTypeAudio;
    message.media.url = url; ///< 指定下载的url
    [GotyeOCAPI downloadMediaInMessage:message];    

//通过构造一个media,传入得到的url,还需要设置media.type为GotyeMediaTypeAudio,然后调
用downloadMediaInMessage接口下载这个media。

自定义数据消息

API支持发送用户自定义数据:

const char *userdata = “1234567890”; ///<自定义数据内容不能超过4KB
GotyeOCMessage message = [GotyeOCMessagecreateUserDataMessage:receiverdata:userdata, len: userdatalen];

或者发送指定路径文件里的数据内容:

NSString*path = @“/mnt/sdcard /userdata.txt”; ///<文件内容不能超过4KB
GotyeOCMessage message = [GotyeOCMessagecreateUserDataMessage:receiverdataPath:path];

获取自定义数据(如果存在):

NSData *data = [message getUserData];

消息附加字段

API支持发送消息时附加发送一些额外的数据,其大小不允许超过2.5KB:

char *buf = “This is some extra data info with message”;
[message putExtraData:buf len:strlen(buf)]; ///<或者传入一个文件路径,API会自动从文件中读取内容
NSData *data = [message getExtraData]; ///<获取数据

发送消息

消息创建好之后,调用以下接口便可发送:

[GotyeOCAPI sendMessage :message]; /// <对应回调GotyeOCDelegate::onSendMessage

发送消息的回调原型:

-(void) onSendMessage:(GotyeStatusCode)code
message:(GotyeOCMessage*)message;  /// <发送的消息

接收/下载消息

当有新消息到达,API会给出以下回调:

//详见GotyeOCDelegate.h
-(void) onReceiveMessage:(GotyeOCMessage*)message downloadMediaIfNeed:(bool*)need; ///<是否下载消息中的多媒体对象,默认为false,不自动下载

注意:新收到的消息如果是图片或语音类型,图片和语音内容并不随消息一起到达接收方,当接收到上述回调通知,在回调函数中添加以下代码,API会在回调结束后,自动去下载消息中的多媒体对象:

* need =  YES;

如果您没有设置该值,API默认不自动下载。如果想在后续使用该消息时再下载里面的多媒体对象,可以手动调用以下接口:

+(status)downloadMediaInMessage:(GotyeOCMessage*)message; /// <对应回调GotyeOCDelegate::onDownloadMediaInMessage

回调原型:

-(void) onDownloadMediaInMessage:(GotyeStatusCode)code
message:(GotyeOCMessage*)message;  /// <下载的消息,下载好的媒体文件在message.media.path或pathEx中

接收离线消息

即时通讯云支持离线消息存储,当登录账号下线后,服务器会将该账号相关的离线消息保存在数据库中。以便下次登录获取。API获取离线消息的接口很简单:

+(void)beginReceiveOfflineMessage;/// <对应回调GotyeOCDelegate::onGetMessageList

获取消息列表

如果需要获取跟某个指定对象(好友/聊天室/群组)的聊天消息列表,可以使用以下接口:

+(NSArray*)getMessageList:(GotyeOCChatTarget*)target more:(bool)more;

这里获取到的消息列表是指与聊天对象的若干条最新消息,而且返回的列表对象是全局变量,可以保存其指针使用。对好友和群组来说,调用这个接口会首先从本地数据库读取指定条目消息(默认10条),如果接收到离线消息,那么离线消息也会被插入到该列表,同时写入数据库;对聊天室来说,进入聊天室调用该接口,会向服务器请求历史消息记录,请求的条目是固定的(默认10条)。下面的两个接口可以设定从本地数据库读取消息时的条目和每次从服务器拉取历史消息时指定的条目数:

[GotyeOCAPI setMessageReadIncrement:20]; /// <设定单次从本地数据库读取消息增量为20,默认10
[GotyeOCAPI setMessageRequestIncrement :15]; /// <设定单次向服务器请求消息增量为15,默认10

不论是从本地数据库读取,离线消息接收,还是历史聊天记录获取,通过getMessageList获取到的本地列表都会被自动更新,因此到收到GotyeOCDelegate:: onGetMessageList回调,该接口总是返回最新消息列表。该接口的第二个参数more的函数是,如果设为false,则返回跟上次调用相同的消息列表,否则消息条目可能会递增。 回调原型:

-(void) onGetMessageList:(GotyeStatusCode)code
msglist:(NSArray*)msglist  /// <获取到的消息列表
downloadMediaIfNeed:(bool*)downloadMediaIfNeed;  ///<是否下载消息中的多媒体对象,默认为NO

删除消息

API提供了3个删除消息的接口:

[GotyeOCAPI deleteMessages :targetmsglist :msglist]; /// <删除消息列表, msglist是std::vector<GotyeMessage>类型
[GotyeOCAPI deleteMessage :target msg: message]; /// <删除单条消息
[GotyeOCAPI clearMessage :target); /// <删除和某个聊天对象的所有消息

获取/更新消息状态

GotyeMessage的status字段表征了该消息的当前状态,发送中/已发送/已读/未读,详细请参考头文件GotyeMessage.h。

获取和某个聊天对象target(GotyeOCChatTarget)的未读消息数:

int  count = [GotyeOCAPI getUnreadMessageCount :target];

获取全部未读消息数:

int  count = [GotyeOCAPI getTotalUnreadMessageCount ];

获取聊天类型列表(GotyeOCUser/GotyeOCGroup/GotyeOCRoom)的全部未读消息数:

NSArray*typeList;
[typeListaddObject:[ NSNumber numberWithInt:GotyeOCChatTargetTypeGroup]];
int  count = [GotyeOCAPI getUnreadMessageCountOfTypes :typeList]; /// <获取群组下面的全部未读消息数

将和某个聊天对象的全部消息标记为已读/未读:

[GotyeOCAPI markMessagesAsRead :targetisRead:true ]; /// <全部标记为已读状态

将单条消息标记为已读/未读:

[GotyeOCAPI markOneMessageAsRead:message isRead:true]; /// <将message标记为已读状态

播放音频消息

如果消息为音频类型,则可以调用以下接口去播放(如果音频已经被下载):

[GotyeOCAPI playMessage :message]; /// <对应回调GotyeOCDelegate::onPlayStart,onPlaying和onPlayStop

要停止正在播放的音频,请调用接口:

[GotyeOCAPI stopPlay]; /// <对应回调onPlayStop

获取录音时的音量波动值

录音时,如果需要动态显示当前说话时的音量波动,可通过以下接口实时获取:

int power =[GotyeOCAPI getTalkingPower]; /// <power 取值范围[0, 255]

应用静音时的处理

应用静音时,调用录音和播放接口后,会导致静音失效,这时候需要调用以下代码恢复静音状态:

UInt32 category;
UInt32 size = sizeof(category);
OSStatus error = AudioSessionGetProperty(kAudioSessionProperty_AudioCategory, &size, &category);

if (category != kAudioSessionCategory_AmbientSound) {
    UInt32 category = kAudioSessionCategory_AmbientSound;
    error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
    if (error) printf("couldn't set audio category!%d", (int)error);
}

敏感词过滤

敏感词过滤开关接口,默认为开启状态。

+(void)enableTextFilter:(bool)enabled inType:(GotyeChatTargetType)type

会话

获取会话列表

API支持获取会话列表(最近联系人列表),该列表也属于全局变量:

NSArray* pTargetList = [GotyeOCAPI getSessionList ];

获取会话详情

如果需要获取某个会话详情,可以使用以下接口:

unsigned pageIndex ;
NSMutableArray*pMessageList = [NSMutableArray array];
NSMutableArray*pMemberList= nil, *pCurPageMemberList = nil;
[GotyeOCAPI getSessionInfo:target, pMessageList, pMemberList, pCurPageMemberList, &pageIndex);

提示:这个接口会获取到与target的聊天消息列表,聊天室(群组)成员表缓存,当前页聊天室(群组)成员表缓存,最后一次请求成员表所传入的索引。最为便捷的是,每个列表缓存都属于全局变量,也就是说获取到的指针可作为全局指针保存下来使用。

激活/隐藏会话

如果激活一个会话,则意味着当API接收到与该聊天对象相关的消息时,该条消息总是被设为已读状态,反之如果隐藏该会话,接收到的消息默认为未读状态。

[GotyeOCAPI activeSession :target];/// <激活与target的会话
[GotyeOCAPI deactiveSession :target];/// <隐藏与target的会话

删除会话

如需删除一个会话,调用下述接口:

[GotyeOCAPI deleteSession :target];

注意:删除会话并不意味着会删除与该聊天对象的所有本地消息存储。

会话置顶

API允许将某个会话置顶,置顶后该会话将会处于本地会话列表的第一位:

[GotyeOCAPI markSessionIsTop :targetisTop: true];

使用推送

APNS

证书生成及上传

在apple的Developoer设置界面创建你的AppID,并选中Push Notifications服务, 使用此AppID 创建你的Provisioning profile,用于生成你的app。 在mac 钥匙串访问中,找到你使用的Provisioning profile对应的证书,将它导出到本地生成.p12文件,记住密码。

区分开发证书和发布证书。

登录到亲加后台管理,在你创建的应用中,选择推送证书栏:

在这里,你可以新增ios推送证书,证书名称是你将在app代码中使用接口注册的名称,选择刚才生成的.p12文件并填好密码上传。

推送注册

在工程的AppDelegate.m里,调用ios的注册接口在设备中注册推送:

[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound];

注册成功会在AppDelegate.m收到回调:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

请重载此函数并在其中调用接口:

[GotyeOCAPI registerAPNS:[deviceToken description] certName:@”GotyeIMDis”];

注意当前编译使用的证书和参数的证书名是否一致。 若注册成功,则可以使用推送信息了。

注意:

推送只是针对用户的,所以即使在程序中注册了APNS,也需要在Login成功后才会生效,并且在Logout后会失效。 如果在程序进入后台时想要收到推送消息,请不要再此时Logout。

PushFormat详解

1.功能:
PushFormat主要用于调用服务器SendMsg接口发送消息时,自定义APNS(Apple Push Notification Service)消息的推送格式。提供对app原有业务逻辑的一个承载作用,可以用用户更加自主自由的APNS通道。
2.用法:
PushFormat以一个JSON串的形式作为JSON的参数发送。当客户端上传PushFormat后,服务器会替换标记(即@MB等,详见下表),然后填充该字段的值。并且推送给用户。
所以,实际APNS的包,全部为用户自定义。这样,用户可以自己选择需要使用的推送类型。
当用户不使用PushFormat串时,使用默认推送格式。

默认格式:

{
    "aps":{
        "alert":"默认显示格式",
        "badge":1,
        "sound":"default"
    }
}

默认显示格式为
单聊: 发送者:消息内容
群聊: 发送者(来自群群名):消息内容
3.参数详解:
参数表

字段名 标记 字段意义 字段限制 备注
FromID @FD 发送者的ID
FromNick @FN 发送者的昵称
SessionType @ST 会话类型 0=单聊1 = 聊天室(暂无推送)2 = 群聊
SessionID @SD 会话ID 根据SessionType而定。当Type = 2,即为群聊时,才有值。
SessionName @SN 会话名称
MessageType @MT 消息类型 0 = 普通消息 1 = 语音消息 2 = 图片消息 3 = 富文本
MessageBody @MB 消息内容 @lt 60个字符
MessageIndex @MI 消息ID 消息对象的唯一标识符
Badge @BD 消息计数(APP图标右上计数值) 0~99
TimeStamp @TS 消息产生的时间 UINT64秒级时间
Signed @SG 签名 标记着来自哪一个APP或者SDK等,通过通过web端额外设置。

4.实例
SendMsg接口的调用(红色部分即为PushFormat):

{
    "email":"chenzhicheng@yicha.cn",
    "devpwd":"123456",
    "appkey":"9c236035-2bf4-40b0-bfbf-e8b6dec54928",
    "from":"1",
    "to_type":0,
    "to_id":"["77"]",
    "save":1,
    "msg_type":0,
    "text":"nihao",
    "extra_data":"aa",
    "push_format":"{"aps":{"alert":"@MB","badge":@BD},"info":{"type":"@ST","fromID":"@FD"}}"    
}

实际推送消息:

{"aps":{"alert":"nihao","badge":1},"type":"0","fromID":"1"}

更多例子如下
例1:
用户PushFormat:

{
    "aps":{
        "alert":"@MB",
        "badge":"@BD",
    },
    "extra":"@SG",
    "info":{
        "type":"@ST",
        "fromID":"@FD",
    },
    "appType":"CallType"
}

实际推送消息:

{
    "aps":{
        "alert":"I Love Gotye!!!",
        "badge":3,
    },
    "extra":"Gotye",
    "info":{
        "type":"0",
        "fromID":"10000",
    },
    "appType":"CallType"
}

例2:
用户PushFormat:

{
    "aps":{
        "alert":"@MB",
        "badge":0,
    },
    "url":"https://www.gotye.com.cn/news/20141125001.html"  
}

实际推送消息:

{
    "aps":{
        "alert":"号外,亲加语音100万豪礼大酬宾",
        "badge":0,
    },
    "url":"https://www.gotye.com.cn/news/20141125001.html"
}

5.注意事项
1.由于APNS的请求串,会全部以PushFormat为模板生产。所以,请确保PushFormat的格式正确。如果格式不正确,会导致推送无法接收到等问题。特别请注意括号和特殊字符(包括JSON中的空格和不可见字符,都有可能导致APNS的推送失败)
2.APNS限制长度为256,所以使用PushFormat时,请注意长度问题。如果超过256,也可能会导致推送失败。当然,同理,使用参数时,建议避免重复使用标记。
3.标记格式统一为@+大写字母组成。请避免PushFormat中出现类似格式的字符。否则,也可能导致推送失败。
4.PushFormat标记替换时,不会自动添加引号、分号、括号等括号。只作替换操作。所以切勿遗忘这些符号。

HTTP

在亲加官网后台设置https推送,在客户端不在线的情况下,系统将会向指定的URL使用本接口发起请求,将消息推送至指定https服务器。用户可以通过获取到相应消息内容,自行将数据传递至苹果推送网关,发起推送。

接口名称:PushOfflineMessage
数据提交:POST方法
编码方式:UTF-8
使用说明:
在亲加官网后台设置https推送,在客户端不在线的情况下,系统将会向指定的URL使用本接口发起请求,将消息推送至指定https服务器。方便用户自行推送消息。
参数格式:使用JSON数据格式

{
    "content": "消息内容",
    "index": "消息ID",
    "msg_type": "0",
    "send_account": "王大锤",
    "send_time": "1411717953",
    "recv_type": "1",
    "group_id": "1003",
    "group_name": "万万没想到",
    "recv_account": ["213", "张三", "李四", "赵肥"]
}

参数说明:

参数名 参数类型 说明
content String 消息内容
Index Int64 消息ID
msg_type Int 0文本 1图片 2语音 (当类型为图片或者语音时,消息内容为空)
send_account String 发送方账号
send_time Int 发送时间戳
recv_type Int 0为单聊,2为群聊
group_id Int64 群ID(单聊时,没有该字段)
group_name String 群名称(单聊时,没有该字段)
recv_id List< String> 接收方账号;当为群聊的时候,该列表为非在线用户。

调用返回:

参数名 说明
index 错误消息ID
errcode 错误码
errmsg 错误说明

错误码定义:

错误码 错误描述
0 操作成功
1000 参数错误
1002 通用错误:请求失败的其他原因都可以归类为此错误,通过errmsg中详细描述。
返回顶部