最近公司应公司要求完成阿里云直播和环信聊天功能,学习到了许多之前未知的知识.
1.环信问题及解决方案
1.首先说环信遇到的问题,环信导入 SDK 时,
导入动态库,导入之后发现工程中环信 SDK 的 demo 中出现许多警告,例如下面这种情况
这种警告的解决方式如下图所示
轻松的解决了警告的问题.
2.当做到聊天界面时遇到一个问题,环信服务器不提供保存用户头像和昵称的功能,然后我想到用服务器保存用户的头像和昵称,但是经过思考之后,如果大量的用户同时拉取服务器的用户信息,并发执行可能给服务器造成压力,所以经过考虑还是选择了使用环信的消息扩展的方式来显示相应的头像和昵称.http://www.jianshu.com/p/cd7745b6bc8a 此链接为消息拓展的使用方法.
本人是在发送消息的方法中,将 定义一个ext 字典然后将 字典发送到环信服务器.具体方法如下:
ext =@{@"username":[[EMClientsharedClient]currentUsername],@"nickname":[LZUserdefaultUser].userInfoModel.nickname,@"imageUrl":[LZUserdefaultUser].userInfoModel.avatar};
EMMessage*message = [EaseSDKHelpersendTextMessage:text
to:self.conversation.conversationId
messageType:[self_messageTypeFromConversationType]
messageExt:ext];
在接收信息时,取出 message 类的 ext 属性,然后将其赋给一个字典
NSDictionary*dict = message.ext;
然后将其相应的数据赋予给 model 的相应属性,具体操作如下:
NSString*nickname = dict[@"nickname"];
if(nickname.length>0) {
model.nickname= nickname;
}
NSString*imageUrl = dict[@"imageUrl"];
if(imageUrl.length>0) {
model.avatarURLPath= imageUrl;
}
如果有特殊需求的情况下,也可以将数据保存到本地,如果要用直接从缓存中取,如果缓存中没有则取服务器返回的相应数据.
3.下面简单介绍几个 EASEUI 的方法:
(1)在EaseMessageViewController中的
-- (void)sendTextMessage:(NSString*)text;方法为发送文本消息
- (void)_loadMessagesBefore:(NSString*)messageId count:(NSInteger)count append:(BOOL)isAppend;加载历史聊天记录
- (void)didReceiveMessages:(NSArray*)aMessages;接收消息的代理回调方法(处理实时接收消息)
4.在做直播此种类型的聊天时,我们选择的是环信的聊天室功能,通过后台服务器创建聊天室,然后将聊天室 id 返回给我们,我们然后进入聊天室.还可以选择群组的方式.但这两种方式同时在线人数都有限制,聊天室的最大人数为5000人,群组的聊天室最大人数为2000人.这点大家要注意下.
2.阿里云直播问题及解决方案
1.阿里云 SDK 我也是通过添加动态库的形势添加的,在使用 SDK 时,首先要遵循直播的代理
[AliVcMediaPlayersetAccessKeyDelegate:self];
然后将相应的Key 和 Secret 与其进行绑定
- (AliVcAccesskey*)getAccessKeyIDSecret
{
AliVcAccesskey* accessKey = [[AliVcAccesskeyalloc]init];
accessKey.accessKeyId=kAliVideoAccessKeyID;
accessKey.accessKeySecret=kAliVideoaccessKeySecret;
returnaccessKey;
}
然后请求服务器,将获取到的拉流地址请求阿里云服务器,
@try{
_mPlayer= [[AliVcMediaPlayeralloc]init];
[_mPlayercreate:[UIView new]];
[self addPlayerObserver];
_mPlayer.mediaType=MediaType_AUTO;
_mPlayer.scalingMode=scalingModeAspectFitWithCropping;
_mPlayer.timeout=15000;
_mPlayer.dropBufferDuration=8000;
AliVcMovieErrorCodeerr = [_mPlayerprepareToPlay:[NSURLURLWithString:urlString]];
if(err !=ALIVC_SUCCESS) {
NSLog(@"preprare failed,error code is %d",(int)err);
return;
}
_mPlayer.muteMode=NO;
err = [_mPlayerplay];
if(err !=ALIVC_SUCCESS) {
NSLog(@"play failed,error code is %d",(int)err);
return;
}
}@catch(NSException *exception) {
}@finally{
}
我没有先创建相应的播放的 view, 我们要求当可以开始播放之后然后才显示播放界面,如果开始就创建播放视图,则刚开始的时候会出现黑屏的情况,我是在如下方法里添加的播放视图
- (void)OnVideoPrepared:(NSNotification*)notification {
[[UIApplicationsharedApplication] setIdleTimerDisabled : YES];
_mPlayer.view=_headView;
[self hideLoadingIndicators];
}
这样就可以避免黑屏的情况.
2.由于老板要求用录像机进行录制视频并进行推流,所以我们选择的推流工具是在电脑上安装OBS Studio,这款软件用起来还是挺不错的.用法也比较简单.
首先点击设置
然后可通过设置推流的 url
设置完之后在左下角可选择相应的录制方式
设置完之后,直接开始串流即可.用法简单.
3.完成开发之后上传 App Store 出现的问题及解决方案
1.首先是上传 App Store出现
ERROR ITMS-90207: "Invalid Bundle. The bundle at '****' does not contain a bundle executable.错误
动态库出现问题,我采用的方法处理方法是
添加脚本步骤
新建脚本
拷贝下面脚本至新建脚本中
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embeddedinthe application and
# removes unused architectures.
find"$APP_PATH"-name'*.framework'-type d |whileread -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read"$FRAMEWORK/Info.plist"CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo"Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
forARCHin$ARCHS
do
echo"Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract"$ARCH""$FRAMEWORK_EXECUTABLE_PATH"-o"$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo"Merging extracted architectures: ${ARCHS}"
lipo -o"$FRAMEWORK_EXECUTABLE_PATH-merged"-create"${EXTRACTED_ARCHS[@]}"
rm"${EXTRACTED_ARCHS[@]}"
echo"Replacing original executable with thinned version"
rm"$FRAMEWORK_EXECUTABLE_PATH"
mv"$FRAMEWORK_EXECUTABLE_PATH-merged""$FRAMEWORK_EXECUTABLE_PATH"
done
2.上传成功之后,查看 iTunes 上的构建版本,提示我构建失败,然后给我邮箱发了邮件,内容为
Dear developer,
We have discovered one or more issues with your recent delivery for "***". To process your delivery, the following issues must be corrected:
Invalid Bundle- A nested bundle contains simulator platform listed in CFBundleSupportedPlatforms Info.plist key.
Once these issues have been corrected, you can then redeliver the corrected binary.
Regards,
The App Store team
然后我就一直在找 info.plist 中的CFBundleSupportedPlatforms字段怎么找都没有找到,后来通过在终端查找的方式终于找到了原因,原来是第三方的framework中也包含了info.plist文件,但是 xcode 中搜不到,可以通过在终端输入以下命令找到
grep-r"CFBundleSupportedPlatforms" /YourProjectPathHere
后面的路径是自己的,然后找到相应的 plist 文件,把里面的CFBundleSupportedPlatforms字段改为iphoneOS.这样再上传问题就解决了.
辛苦了一个月终于把相应的功能实现了,虽然遇到了许多的困难,但最终都通过努力解决了.有写的不到位的地方请大神多多指教,正在虚心学习中.以后还会分享有关经验,希望大家关注我噢😯.谢谢大家.