融云即时通讯(从服务器获取token)
经历了繁忙的项目期,终于有时间闲下来总结一下项目中即时通讯遇到的问题。
使用即时通讯的流程,在融云官方网站有详细的介绍,在这里不在详细的介绍。这里收录一些我在项目中遇到的问题。
1.系统依赖库的添加,如果您使用的是Xcode 6.X版本,则需要将上面的动态库*.tbd的后缀改为*.dylib。 如果您没有使用IMKit的所有功能,有些库可能并非必须
AssetsLibrary.framework AudioToolbox.framework AVFoundation.framework CFNetwork.framework CoreAudio.framework CoreGraphics.framework CoreLocation.framework CoreMedia.framework CoreTelephony.framework CoreVideo.framework ImageIO.framework libc++.tbd libc++abi.tbd libsqlite3.tbd libstdc++.tbd libxml2.tbd libz.tbd MapKit.framework OpenGLES.framework QuartzCore.framework SystemConfiguration.framework UIKit.framework Photos.framework
2.设置plist支持http
设置支持http3.利用请求从服务器端获取token。
因为获取 Token 时需要提供 App Key 和 App Secret。如果在客户端请求 Token,假如您的 App 代码一旦被反编译,则会导致您的 App Key和App Secret 泄露。所以,务必在您的服务器端获取 Token。
AFHTTPRequestOperationManager*mgr = [AFHTTPRequestOperationManagermanager];
//服务器请求链接地址
NSString*urlstr =@"https://api.cn.rong.io/user/getToken.json";
//请求参数userID:用户唯一标识name:用户名portraitUri:用户头像链接
NSDictionary*parm =@{@"userId":PHONE,
@"name":USERNAME,
@"portraitUri":USERImage
};
NSString* timestamp = [[NSStringalloc]initWithFormat:@"%ld",(long)[NSDatetimeIntervalSinceReferenceDate]];
NSString* nonce = [NSStringstringWithFormat:@"%d",arc4random()];
//创建应用得到的appKey
NSString* appkey =RCAPPKey;
//签名
NSString*Signature = [[NSStringstringWithFormat:@"%@%@%@",appkey,nonce,timestamp]base64EncodedString];
//以下是拼接请求内容
[mgr.requestSerializersetValue:nonceforHTTPHeaderField:@"Nonce"];
[mgr.requestSerializersetValue:appkeyforHTTPHeaderField:@"App-Key"];
[mgr.requestSerializersetValue:SignatureforHTTPHeaderField:@"Signature"];
[mgr.requestSerializersetValue:timestampforHTTPHeaderField:@"Timestamp"];
[mgr.requestSerializersetValue:RCAPPSecretforHTTPHeaderField:@"appSecret"];
[mgr.requestSerializersetValue:@"application/x-www-form-urlencoded"forHTTPHeaderField:@"Content-Type"];
//开始请求
[mgrPOST:urlstrparameters:parmsuccess:^(AFHTTPRequestOperation*operation,idresponseObject) {
//这里你就能得到token啦~
NSLog(@"%@", responseObject);
NSString*token = responseObject[@"token"];
[[RCIMsharedRCIM]connectWithToken:tokensuccess:^(NSString*userId) {
NSLog(@"登陆成功,用户ID为:%@",userId);
}error:^(RCConnectErrorCodestatus) {
NSLog(@"登录的错误码为:%ld",(long)status);
}tokenIncorrect:^{
NSLog(@"token错误");
}];
}failure:^(AFHTTPRequestOperation*operation,NSError*error) {
}];
4.聊天对话页面
RCConversationViewController*chat = [[RCConversationViewControlleralloc]init];
chat.conversationType=ConversationType_PRIVATE;
chat.targetId= model.username;
chat.title= [NSStringstringWithFormat:@"与%@聊天",model.nickname];
[self.navigationControllerpushViewController:chatanimated:YES];