国实优逛集团随身WIFI是免费使用吗

你正在使用的浏览器版本过低,将不能正常浏览和使用知乎。国内即时通讯云刚起步(如环信、融云等),国外这一领域发展如何
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 网友回复: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 网友回复: 貌似容联挺NB ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 网友回复: 国内已经有好几家了,融云、容联、云之讯什么的。国外类似的有layer。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 网友回复:
国内即时通讯云刚起步(如环信、融云等),国外这一领域发展如何
【国内即时通讯云刚起步(如环信、融云等),国外这一领域发展如何】
请将本文分享给你的朋友:
国内即时通讯云刚起步(如环信、融云等),国外这一领域发展如何 的相关文章
------分隔线----------------------------
北京联盟郑重声明:本文仅代表作者个人观点,与北京联盟无关。其原创性及文中陈述内容未经本站证实,北京联盟对本文及其中全部或者部分内容的真实性、完整性、及时性不作任何保证和承诺,请网友自行核实相关内容。iOS开发融云即时通讯集成详细步骤(蔡哲永) - 简书
iOS开发融云即时通讯集成详细步骤(蔡哲永)
1.融云即时通讯iOS SDK下载地址
/downloads
SDK下载2.进行应用开发之前,需要先在融云开发者平台创建应用,如果您已经注册了融云开发者帐号,请前往 融云开发者平台 创建应用;如果您还没有注册融云开发者帐号,请前往 融云官方网站 首先注册开发者帐号,注册后创建应用。注册地址
/signup3.登陆融云开发者平台 /signin 创建应用4.进入后台之后点击创建应用,进入这样一个创建界面图1
5.最后点击创建 点击我的应用 然后在左边点击我的应用名称图2
6.点击AppKey进入图3
7.手动安装融云即时通讯SDK7.1将下载好的最新的融云SDK导入到自己的项目中7.2添加依赖库 在Build Phases中第三个选项link中点击左下角+号添加依赖库所需的依赖库图4
8.获取Token和第五步一样,进入融云后台点击我的应用—&自己的应用名称—&IM服务—&API调试右边会进入一个界面,在这里获取调试Token图5
用户 Id:userId = "1" // 用户在融云系统中唯一的身份 Id,可为任意数字或字符串,但必须保证全局唯一。用户名称:name = "韩梅梅" // 用户的显示名称,用来在 Push 推送时,或者客户端没有提供用户信息时,显示用户的名称。用户头像图片:portraitUri = "http://rongcloud-/docs_demo_rongcloud_logo.png"现在我们获得了AppKey和Token了9.下面就开始快速集成了9.1在自己的项目中AppDelegate.h文件中导入头文件#import&RongIMLib/RongIMLib.h&#impor&RongIMKit/RongIMKit.h&然后遵守RCIMConnectionStatusDelegate这个代理方法,即变成这样@interface AppDelegate : UIResponder&UIApplicationDelegate,RCIMConnectionStatusDelegate&9.2在AppDelegate.m文件中导入头文件//融云即时通讯#import&RongIMKit/RongIMKit.h&#import&RongIMLib/RongIMLib.h&#import&UIKit/UIKit.h&然后将获得的融云的AppKey 写成一个宏
将自己的AppKey 替换即可\k51hidwq1bbcdds4b将这个换成自己的即可//融云即时通讯AppKey#define RONGCLOUD_IM_APPKEY @"k51hidwq1bbcdds4b"10.在AppDelegate.m的文件中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{}方法中加入以下代码//融云即时通讯//初始化融云SDK。[[RCIM sharedRCIM] initWithAppKey:RONGCLOUD_IM_APPKEY];/*** 推送处理1*/if ([applicationrespondsToSelector:@selector(registerUserNotificationSettings:)]) {//注册推送, iOS 8UIUserNotificationSettings *settings = [UIUserNotificationSettingssettingsForTypes:(UIUserNotificationTypeBadge |UIUserNotificationTypeSound |UIUserNotificationTypeAlert)categories:nil];[application registerUserNotificationSettings:settings];} else {UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeAlert |UIRemoteNotificationTypeS[application registerForRemoteNotificationTypes:myTypes];}//融云即时通讯[[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(didReceiveMessageNotification:)name:RCKitDispatchMessageNotificationobject:nil];[[RCIM sharedRCIM] setConnectionStatusDelegate:self];加入到方法中的代码到这里下面是单独的方法
直接加在AppDelegate.m的文件中即可/***
将得到的devicetoken 传给融云用于离线状态接收push ,您的app后台要上传推送证书**
@param application &#application description#&*
@param deviceToken &#deviceToken description#&*/- (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {NSString *token =[[[[deviceToken description] stringByReplacingOccurrencesOfString:@"&"withString:@""]stringByReplacingOccurrencesOfString:@"&"withString:@""]stringByReplacingOccurrencesOfString:@" "withString:@""];[[RCIMClient sharedRCIMClient] setDeviceToken:token];}/***
网络状态变化。**
@param status 网络状态。*/- (void)onRCIMConnectionStatusChanged:(RCConnectionStatus)status {if (status == ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT) {UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示"message:@"您"@"的帐号在别的设备上登录,您被迫下线!"delegate:nilcancelButtonTitle:@"知道了"otherButtonTitles:nil, nil];[alert show];//注意这里下面的4行,根据自己需要修改
也可以注释了,但是只能注释这4行,网络状态变化这个方法一定要实现ViewController *loginVC = [[ViewController alloc] init];UINavigationController *_navi =[[UINavigationController alloc] initWithRootViewController:loginVC];self.window.rootViewController = _}}- (void)didReceiveMessageNotification:(NSNotification *)notification {[UIApplication sharedApplication].applicationIconBadgeNumber =[UIApplication sharedApplication].applicationIconBadgeNumber + 1;}11.开始创建会话先创建一个继承RCConversationListViewController名为ChatListViewController的控制器创建之后的控制器.h文件即为#import&UIKit/UIKit.h&#import&RongIMKit/RongIMKit.h&@interface ChatListViewController : RCConversationListViewController@end这样的样式在你要创建即时会话的界面的控制器的.h文件中导入头文件//融云即时通讯#import&RongIMKit/RongIMKit.h&并遵守数据源方法RCIMUserInfoDataSource即变成了#import&RongIMKit/RongIMKit.h&@interface ViewController : UIViewController&RCIMUserInfoDataSource&在.m文件中导入头文件//融云即时通讯#import "ChatListViewController.h"#import&RongIMKit/RCConversationViewController.h&将我们获取的Token定义成宏 就像这样的格式
换成自己的Token即可//融云即时通讯Token#define RONGCLOUD_IM_Token @"LU0IpXzEeYXUxuJi5n9hAwNcet2QRQu/IRxLhvshFhvLm8f3gdUu+y4TIhufZfJ/fIXRJrQyBu8cJAN2bcAolA=="比如在我所在的控制器我有一个开始回答按钮我想在这个控制器点击开始回答按钮就想让他创建即时会话这样来实现,点击开始回答按钮/***
点击开始回答执行的方法*/-(void)startAnswer{//登陆融云//登录融云服务器,开始阶段可以先从融云API调试网站获取,之后token需要通过服务器到融云服务器取。NSString *token=RONGCLOUD_IM_T[[RCIM sharedRCIM] connectWithToken:token success:^(NSString *userId) {//设置用户信息提供者,页面展现的用户头像及昵称都会从此代理取 这里会跳到会话列表界面
就是我们平常QQ聊天都有一个会话的列表
如果想直接跳到聊天界面 下面再说[[RCIM sharedRCIM] setUserInfoDataSource:self];NSLog(@"Login successfully with userId: %@.", userId);dispatch_async(dispatch_get_main_queue(), ^{ChatListViewController *chatListViewController = [[ChatListViewController alloc]init];[self.navigationController pushViewController:chatListViewController animated:YES];});} error:^(RCConnectErrorCode status) {NSLog(@"login error status: %ld.", (long)status);} tokenIncorrect:^{NSLog(@"token 无效 ,请确保生成token 使用的appkey 和初始化时的appkey 一致");}];} error:^(RCConnectErrorCode status) {NSLog(@"login error status: %ld.", (long)status);} tokenIncorrect:^{NSLog(@"token 无效 ,请确保生成token 使用的appkey 和初始化时的appkey 一致");}];YYCLog(@"点击了开始回答");}然后在这个控制器再实现一个方法
就是下面这个方法/***此方法中要提供给融云用户的信息,建议缓存到本地,然后改方法每次从您的缓存返回*/- (void)getUserInfoWithUserId:(NSString *)userId completion:(void(^)(RCUserInfo* userInfo))completion{//此处为了演示写了一个用户信息if ([@"1" isEqual:userId]) {RCUserInfo *user = [[RCUserInfo alloc]init];user.userId = @"1";user.name = @"测试1";user.portraitUri = @"/73t1bjeh1BF3odCf/it/u=,&fm=96&s=94D712D20AABE";return completion(user);}else if([@"2" isEqual:userId]) {RCUserInfo *user = [[RCUserInfo alloc]init];user.userId = @"2";user.name = @"测试2";user.portraitUri = @"/73t1bjeh1BF3odCf/it/u=,&fm=96&s=94D712D20AABE";return completion(user);}}这个方法也要在这个.m文件中实现这里都是测试 先这样写
我到后面再写怎么具体实现下面代码都一样下面就是在我们的ChatListViewController.h文件中#import&RongIMKit/RongIMKit.h&#import&RongIMKit/RongIMKit.h&@interface ChatListViewController : RCConversationListViewController@end如果问题,请加QQ,备注写解决问题,和我单独沟通哦。
没有最好,只有更好!你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
来献个丑,关于Demo3.0昵称和头像问题的处理,博主写了一篇详细的文章,希望能帮到大家。
最近公司在开发一款创业项目,可以说是以即时通讯功能为主的,所以用到了第三方的即时通讯SDK----环信。相比于国内的几家即时通讯云服务商,像网易云信、融云什么的,环信应该算比较早的了吧,可以说IM云服务的老大。
我们要做的项目类似于微信,有联系人页面、聊天列表与聊天页面、设置页面,刚刚好包括了环信Demo3.0的全部内容,所以理论上应该把Demo直接嵌入工程。由于这个Demo是实现了一些IM的基本UI,但是因为环信的官方文档和视频比较欠缺,维护起来相当麻烦,所以在开发的过程中有好多次决定弃用这个Demo,自己构建UI。但是又考虑到,Demo的代码可以说相当健壮,各种机制都集成的非常好(比如好友申请和删除的回调处理),最终决定还是硬着头皮上,改Demo的UI部分以供自己使用。
环信的官方文档虽然比较欠缺,但是代码的注释和命名还是很好的,基本上可以一目了然每个变量、每个函数在做什么事情。笔者遇到的最大的问题就是好友头像和用户的显示问题,因为环信的服务器是不存储除了用户名和密码以外的其他任何数据的。解决这个问题的办法,就是将你要保存的其他用户信息保存在应用程序自己的服务器上。先来看一张官方图:
如图所示,你需要构建自己的应用服务器。环信的建议是,包括好友体系都不要用环信来维护,最好是由你APP自己的服务器来维护。但是笔者为了简化开发,并没有这样做,而是使用环信维护的好友体系,把昵称和头像存在自己的服务器上,每次从环信上获得当前用户的好友列表,再根据每个好友的用户名到自己的服务器上去获取。
需要显示昵称和头像的地方有以下几处:联系人列表、聊天页表、聊天页面、联系人和群的详情页面。环信Demo3.0中有一个叫做ContactListViewController的类正是联系人列表页面,笔者决定从这个类入手。这个类是一个常见的带Tableview的Controller,找到它的下拉刷新和tableview的几个代理方法进行尝试,发现无论如何也不能完美的实现想要的效果。于是开始研究Demo是怎样显示昵称和头像的,经研究发现,环信是使用国外的App数据储存商Parse来实现储存,于是找到Demo中存取Parse部分的代码:
在ViewDidLoad中,笔者找到了一个叫做UserProfileManager的类(绿色部分),看了看这个类的h和m文件,发现这个类就是管理存取Parse上数据的类,而且全局是一个单例。笔者认真分析了一下这个类的作用,根据它提供给外部使用的方法的名称,发现他的作用主要有以下三个,且是按照以下顺序的:
1----获取当前用户在Parse服务器上的好友数据(头像、昵称),储存到内存中或者本地沙盒中:loadUserProfileInBackgroundWithBuddy:self.contactsSource saveToLoacal:YES completion:NULL
2----根据好友的用户名(环信储存的用户名),返回内存或本地沙盒中保存的昵称:
- (NSString*)getNickNameWithUsername:(NSString*)
3---根据好友的用户名(环信储存的用户名),返回内存或本地沙盒中保存的头像Url:- (UserProfileEntity*)getUserProfileByUsername:(NSString*)
其中2和3其实可以合成一个,因为头像的url一般都是用一个用户的唯一标识(数据库表中的主键)来命名,而这个唯一标识刚好可以是环信服务器上所储存的用户名字段
举个例子,在ViewDidLoad方法中,先调用方法1,获取到昵称和头像,然后在tableview的cellForRowAtIndexPath,也就是给每个cell赋值的那个方法中,先调用方法2和3,再给cell赋值。
如图所示,(绿色部分),根据model.buddy.username属性,获取到环信服务器所保存的用户名,再调用23方法得到昵称和头像url的拼接。
于是根据这个类,笔者仿照它也写了一个单例,给单例加了一个保存所有好友昵称的NSDictionary属性,这个单例对象在APP全局是唯一的,所以该属性在内存中也是唯一的,每次调用获取它的方法,不用担心是空或者重新生成新对象的问题发生。而且最好将属性设置成nonatomic的,这样可以防止在一次网络请求构建改属性的过程中被访问,导致数据错误。但是笔者还是加上了判断。笔者的这个类叫做NickNameAndHeadImage,也就是上面两幅截图中绿色注释部分紧跟的代码。并且还加入了一些判断,比如,如果昵称为空,则显示环信服务器上保存的用户名。当然,如果你想让更新即时的话,你可以在这个类中实现一些发送和接受透传消息的方法,笔者暂时没有写。
大家可以全局搜索UserProfileManager的使用地方(比如按昵称搜索,首字母排序,详情等),发现基本上就是用到了笔者所提到那三种操作,所以,可以用自己仿制的这个单例类完美的代替UserProfileManager的功能,这样就可以在不修改环信Demo逻辑的前提下,接入自己的APP服务器,这样便保留了环信Demo的所有优良特性。
下面将NickName类的代码列出,供大家参考:#import &Foundation/Foundation.h&
@interface NickNameAndHeadImage : NSObject
+(instancetype) shareI
- (void)loadUserProfileInBackgroundWithBuddy:(NSArray*)buddyL
- (NSString*)getNicknameByUserName:(NSString*)
#import &NickNameAndHeadImage.h&
@interface NickNameAndHeadImage()
@property (strong, nonatomic) NSMutableArray *UserN
@property (strong, nonatomic) NSMutableDictionary *NickN
@property (nonatomic) BOOL DownloadHasD
@property (nonatomic) BOOL LoadFromLocalDickD
@implementation NickNameAndHeadImage
static NickNameAndHeadImage* _instance =
+(instancetype) shareInstance
static dispatch_once_t onceT
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init] ;
- (instancetype)init
self = [super init];
if (self) {
_DownloadHasDone = NO;
_LoadFromLocalDickDone = NO;
_UserNames = [NSMutableArray array];
NSMutableDictionary *dic = [[NSUserDefaults standardUserDefaults] objectForKey:dUserDefaults_Dic_NickName];
if (dic == nil || [dic count] == 0) {
_NickNames = [NSMutableDictionary dictionary];
_LoadFromLocalDickDone = YES;
_LoadFromLocalDickDone = YES;
_NickNames = [NSMutableDictionary dictionaryWithDictionary:dic];
- (void)loadUserProfileInBackgroundWithBuddy:(NSArray*)buddyList
_DownloadHasDone = NO;
[_UserNames removeAllObjects];
[_NickNames removeAllObjects];
if (buddyList == nil || [buddyList count] == 0)
for (EMBuddy *buddy in buddyList)
[_UserNames addObject:buddy.username];
[self loadUserProfileInBackgroundWithUsernames];
- (void)loadUserProfileInBackgroundWithUsernames
_DownloadHasDone = NO;
//首先构造Json数组
NSMutableString *jsonString = [[NSMutableString alloc] initWithString:@&{\&mobilelist\&:[&];
for(NSString *mobile in _UserNames){
//2. 遍历数组,取出键值对并按json格式存放
NSString *
= [NSString stringWithFormat:
@&{\&mobile\&:\&%@\&},&,mobile];
[jsonString appendString:string];
// 3. 获取末尾逗号所在位置
NSUInteger location = [jsonString length]-1;
NSRange range
= NSMakeRange(location, 1);
// 4. 将末尾逗号换成结束的]}
[jsonString replaceCharactersInRange:range withString:@&]}&];
NSLog(@&请求昵称时要发送的jsonString = %@&,jsonString);
NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:dUserDefaults_String_LoginToken];
NSString *url = [NSString stringWithFormat:@&customer/contract?token=%@&,token];
NSDictionary *postdic = [NSDictionary dictionaryWithObjectsAndKeys:jsonString,@&mobilelist&,nil];
[HttpUtil POST_Path:url params:postdic completed:^(id JSON,NSString *str)
_LoadFromLocalDickDone = NO;
NSLog(@&打印JSON数据:%@&,str);//打印Json数据
NSString *state = [[JSON objectForKey:@&json&] objectForKey:@&state&];
if ([state isEqualToString:@&1&]) {//获得昵称成功
//打印信息
NSString *msg = [[JSON objectForKey:@&json&] objectForKey:@&msg&];
NSLog(@&获得昵称成功:msg:%@&,msg);
NSArray *array = [[[JSON objectForKey:@&json&] objectForKey:@&data&] objectForKey:@&list&];
for (NSDictionary *dic in array) {
[_NickNames setObject: [dic objectForKey:@&name&] forKey: [dic objectForKey:@&mobile&]];
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setObject:_NickNames forKey:dUserDefaults_Dic_NickName];
[ud synchronize];
_LoadFromLocalDickDone = YES;
_DownloadHasDone = YES;
else//获得昵称失败
_DownloadHasDone = NO;
//打印信息
NSString *msg = [[JSON objectForKey:@&json&] objectForKey:@&msg&];
NSLog(@&获得昵称失败:msg:%@&,msg);
failed:^(NSError *err){
_DownloadHasDone = NO;
[SVProgressHUD showSuccessWithStatus:@&登录失败&];
NSLog(@&获得昵称失败:%@&,err);
- (NSString*)getNicknameByUserName:(NSString*)username
if(_DownloadHasDone == YES)
NSString *string = [_NickNames objectForKey:username];
if (string == nil || [string length] == 0) {
else if(_LoadFromLocalDickDone == YES)
NSMutableDictionary *dic = [[NSUserDefaults standardUserDefaults] objectForKey:dUserDefaults_Dic_NickName];
NSString *string = [dic objectForKey:username];
if (string == nil || [string length] == 0) {
其中,第一行为没有上传头像而有昵称,第二行为有头像有昵称,第三行为有头像无昵称,则显示用户名。
希望可以和大家多交流,做出更完美的App。
不错,理解的很到位!
demo3.0确实比较方便修改,博主看的很详细,很多细节都有讲到,棒棒哒,赞一个!
loadUserProfileInBackgroundWithUsernames 这个方法里的接口是通过把所有用户名作为参数输入进去一次性获取这些用户的信息,是这个意思吧
是的,不过我们也做了单独的一个用户名获取昵称的方法
就是在群聊的时候,那些人的昵称和头像都一次性存储到本地了吗?然后别人发送消息再取出来?
dUserDefaults_Dic_NickName和dUserDefaults_String_LoginToken这个是是什么
是啊,这个是什么?
是所有好友的昵称存入到字典中去了么
你的成功了吗,我自己写了一下,一直获取不到呀
木有,我是从后台拿的头像的
要回复文章请先或
知识价值的认可,源自您的赞赏
扫描二维码,你的支付将由imGeek代收后转给对方
感谢您的赞赏
一个开放、互助、协作、创意的社区
一个开放、互助、协作、创意的社区
京ICP备号-3【互联网】leancloud、环信、阿里悟空、容联...即时通讯云服务哪个比较好?_互联网_易房网
leancloud、环信、阿里悟空、容联...即时通讯云服务哪个比较好?
作者:admin
最近在创业做一个app,有类似微信的社交功能需求,想接入第三方即时通讯云服务。了解到这几家都在做,官网看上去都挺好,不知道如何选择,求大神指点~ 易
最近在创业做一个app,有类似微信的社交功能需求,想接入第三方即时通讯云服务。了解到这几家都在做,官网看上去都挺好,不知道如何选择,求大神指点~易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答:
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答: js-collapse-body
环信、融云等起步比较早,属于老牌的第三方即时通讯云服务,目前各自都有所转型(之前中心都在open im),环信现在重心好像是在客服服务。阿里悟空是今年推出的,钉钉、大姨妈等app都是基于阿里悟空做的,稳定性和安全性都不错,阿里自己做过即时通讯工具(…
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答: js-collapse-body
选服务有几个方向:1,选市场第一钱最多的,短期不会停止服务,持续服务有保障,大客户有行业借鉴意义。2,选IM稳定性最好的,不会三天两头宕机用户体验有保障。3,选支持7*24小时客户服务的,自己开发或多或少会有问题,集成更省心,出问题随时有回复帮助…
易房网小编为您精选了网友的解决办法,供您参考-----------------------------------------------------网友回答: js-collapse-body
有钱想稳定的就找网易云信,没钱就找阿里悟空,别的全是创业公司出来的。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将
追究责任;3.作者投稿可能会经我们编辑修改或补充。
天皇退位法案通过 日本皇室面临继承难题!
胖达天生是“网红”!这几只熊猫是外媒的心头好
男子打麻将1年输80多万 万万没想到竟然是朋友合伙
睫毛里爬出3条虫 劣质化妆品千万不要用眼部卫生需
莱昂纳多知道迪丽热巴吗 热巴惨被小李子打脸粉丝
江苏渔政查获百余吨非法海洋捕捞渔获物
睫毛里爬出3条虫 螨虫在显微镜下缓缓爬动究竟怎么
10元纸币写求救 小伙误入传销人民币上写救命扔窗
友情链接、商务合作QQ:

我要回帖

更多关于 国实优逛 的文章

 

随机推荐