Commit e7f548f1d5245da872b78bf6d4d837bb78cb24cf

Authored by 王军波
1 parent b14c0be3

更新

Showing 41 changed files with 1388 additions and 273 deletions
CNLiveChatSDKDemo/CNLiveChatManager.framework/CNLiveChatManager deleted 100755 → 0
No preview for this file type
CNLiveChatSDKDemo/CNLiveChatSDKDemo.xcodeproj/project.pbxproj
@@ -7,12 +7,13 @@ @@ -7,12 +7,13 @@
7 objects = { 7 objects = {
8 8
9 /* Begin PBXBuildFile section */ 9 /* Begin PBXBuildFile section */
10 - D214CB431EF7AD490014EEBA /* CNLiveMsgTools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D214CB421EF7AD490014EEBA /* CNLiveMsgTools.framework */; };  
11 - D214CB451EF7AD4F0014EEBA /* CNLiveChatManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D214CB441EF7AD4F0014EEBA /* CNLiveChatManager.framework */; };  
12 - D214CB461EF7AD560014EEBA /* CNLiveMsgTools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D214CB421EF7AD490014EEBA /* CNLiveMsgTools.framework */; };  
13 - D214CB471EF7AD560014EEBA /* CNLiveMsgTools.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D214CB421EF7AD490014EEBA /* CNLiveMsgTools.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };  
14 - D214CB491EF7AD580014EEBA /* CNLiveChatManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D214CB441EF7AD4F0014EEBA /* CNLiveChatManager.framework */; };  
15 - D214CB4A1EF7AD580014EEBA /* CNLiveChatManager.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D214CB441EF7AD4F0014EEBA /* CNLiveChatManager.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 10 + D20E286F1F1C914500612B90 /* CNLiveImageTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D20E286E1F1C914500612B90 /* CNLiveImageTableViewCell.m */; };
  11 + D20E28721F1C915D00612B90 /* CNLiveVoiceTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D20E28711F1C915D00612B90 /* CNLiveVoiceTableViewCell.m */; };
  12 + D20E28781F1C9AAE00612B90 /* CNLiveChatManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D20E28771F1C9AAE00612B90 /* CNLiveChatManager.framework */; };
  13 + D20E287D1F1C9AB600612B90 /* CNLiveChatManager.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D20E28771F1C9AAE00612B90 /* CNLiveChatManager.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
  14 + D20E28851F1D317900612B90 /* CNLiveMsgTools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D20E28841F1D317900612B90 /* CNLiveMsgTools.framework */; };
  15 + D20E28871F1D317D00612B90 /* CNLiveMsgTools.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D20E28841F1D317900612B90 /* CNLiveMsgTools.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
  16 + D20E28891F1D31E300612B90 /* tu.jpg in Resources */ = {isa = PBXBuildFile; fileRef = D20E28881F1D31E300612B90 /* tu.jpg */; };
16 D2239CD41EE94F31005572FB /* praiseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D2239CD31EE94F31005572FB /* praiseModel.m */; }; 17 D2239CD41EE94F31005572FB /* praiseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D2239CD31EE94F31005572FB /* praiseModel.m */; };
17 D231941F1E70101500111C3B /* MessageModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D231941E1E70101500111C3B /* MessageModel.m */; }; 18 D231941F1E70101500111C3B /* MessageModel.m in Sources */ = {isa = PBXBuildFile; fileRef = D231941E1E70101500111C3B /* MessageModel.m */; };
18 D231C8A61E6FFC2700EAC427 /* ChatRoomViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D231C8A51E6FFC2700EAC427 /* ChatRoomViewController.m */; }; 19 D231C8A61E6FFC2700EAC427 /* ChatRoomViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D231C8A51E6FFC2700EAC427 /* ChatRoomViewController.m */; };
@@ -28,14 +29,14 @@ @@ -28,14 +29,14 @@
28 /* End PBXBuildFile section */ 29 /* End PBXBuildFile section */
29 30
30 /* Begin PBXCopyFilesBuildPhase section */ 31 /* Begin PBXCopyFilesBuildPhase section */
31 - D214CB481EF7AD560014EEBA /* Embed Frameworks */ = { 32 + D20E287B1F1C9AB300612B90 /* Embed Frameworks */ = {
32 isa = PBXCopyFilesBuildPhase; 33 isa = PBXCopyFilesBuildPhase;
33 buildActionMask = 2147483647; 34 buildActionMask = 2147483647;
34 dstPath = ""; 35 dstPath = "";
35 dstSubfolderSpec = 10; 36 dstSubfolderSpec = 10;
36 files = ( 37 files = (
37 - D214CB471EF7AD560014EEBA /* CNLiveMsgTools.framework in Embed Frameworks */,  
38 - D214CB4A1EF7AD580014EEBA /* CNLiveChatManager.framework in Embed Frameworks */, 38 + D20E287D1F1C9AB600612B90 /* CNLiveChatManager.framework in Embed Frameworks */,
  39 + D20E28871F1D317D00612B90 /* CNLiveMsgTools.framework in Embed Frameworks */,
39 ); 40 );
40 name = "Embed Frameworks"; 41 name = "Embed Frameworks";
41 runOnlyForDeploymentPostprocessing = 0; 42 runOnlyForDeploymentPostprocessing = 0;
@@ -43,8 +44,13 @@ @@ -43,8 +44,13 @@
43 /* End PBXCopyFilesBuildPhase section */ 44 /* End PBXCopyFilesBuildPhase section */
44 45
45 /* Begin PBXFileReference section */ 46 /* Begin PBXFileReference section */
46 - D214CB421EF7AD490014EEBA /* CNLiveMsgTools.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveMsgTools.framework; sourceTree = "<group>"; };  
47 - D214CB441EF7AD4F0014EEBA /* CNLiveChatManager.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveChatManager.framework; sourceTree = "<group>"; }; 47 + D20E286D1F1C914500612B90 /* CNLiveImageTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNLiveImageTableViewCell.h; sourceTree = "<group>"; };
  48 + D20E286E1F1C914500612B90 /* CNLiveImageTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNLiveImageTableViewCell.m; sourceTree = "<group>"; };
  49 + D20E28701F1C915D00612B90 /* CNLiveVoiceTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNLiveVoiceTableViewCell.h; sourceTree = "<group>"; };
  50 + D20E28711F1C915D00612B90 /* CNLiveVoiceTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNLiveVoiceTableViewCell.m; sourceTree = "<group>"; };
  51 + D20E28771F1C9AAE00612B90 /* CNLiveChatManager.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveChatManager.framework; sourceTree = "<group>"; };
  52 + D20E28841F1D317900612B90 /* CNLiveMsgTools.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveMsgTools.framework; sourceTree = "<group>"; };
  53 + D20E28881F1D31E300612B90 /* tu.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = tu.jpg; sourceTree = "<group>"; };
48 D2239CD21EE94F31005572FB /* praiseModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = praiseModel.h; sourceTree = "<group>"; }; 54 D2239CD21EE94F31005572FB /* praiseModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = praiseModel.h; sourceTree = "<group>"; };
49 D2239CD31EE94F31005572FB /* praiseModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = praiseModel.m; sourceTree = "<group>"; }; 55 D2239CD31EE94F31005572FB /* praiseModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = praiseModel.m; sourceTree = "<group>"; };
50 D231941D1E70101500111C3B /* MessageModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageModel.h; sourceTree = "<group>"; }; 56 D231941D1E70101500111C3B /* MessageModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageModel.h; sourceTree = "<group>"; };
@@ -75,16 +81,26 @@ @@ -75,16 +81,26 @@
75 isa = PBXFrameworksBuildPhase; 81 isa = PBXFrameworksBuildPhase;
76 buildActionMask = 2147483647; 82 buildActionMask = 2147483647;
77 files = ( 83 files = (
78 - D214CB431EF7AD490014EEBA /* CNLiveMsgTools.framework in Frameworks */,  
79 - D214CB451EF7AD4F0014EEBA /* CNLiveChatManager.framework in Frameworks */,  
80 - D214CB461EF7AD560014EEBA /* CNLiveMsgTools.framework in Frameworks */,  
81 - D214CB491EF7AD580014EEBA /* CNLiveChatManager.framework in Frameworks */, 84 + D20E28781F1C9AAE00612B90 /* CNLiveChatManager.framework in Frameworks */,
  85 + D20E28851F1D317900612B90 /* CNLiveMsgTools.framework in Frameworks */,
82 ); 86 );
83 runOnlyForDeploymentPostprocessing = 0; 87 runOnlyForDeploymentPostprocessing = 0;
84 }; 88 };
85 /* End PBXFrameworksBuildPhase section */ 89 /* End PBXFrameworksBuildPhase section */
86 90
87 /* Begin PBXGroup section */ 91 /* Begin PBXGroup section */
  92 + D20E288A1F1D31F300612B90 /* Resource */ = {
  93 + isa = PBXGroup;
  94 + children = (
  95 + D264D5AC1E6FDE02002CDF41 /* Main.storyboard */,
  96 + D264D5AF1E6FDE02002CDF41 /* Assets.xcassets */,
  97 + D264D5B11E6FDE02002CDF41 /* LaunchScreen.storyboard */,
  98 + D264D5B41E6FDE02002CDF41 /* Info.plist */,
  99 + D20E28881F1D31E300612B90 /* tu.jpg */,
  100 + );
  101 + name = Resource;
  102 + sourceTree = "<group>";
  103 + };
88 D231941C1E700FEC00111C3B /* Controller */ = { 104 D231941C1E700FEC00111C3B /* Controller */ = {
89 isa = PBXGroup; 105 isa = PBXGroup;
90 children = ( 106 children = (
@@ -116,6 +132,10 @@ @@ -116,6 +132,10 @@
116 children = ( 132 children = (
117 D244EFE81EE9246D00C1B9DB /* CNLiveCommentTableViewCell.h */, 133 D244EFE81EE9246D00C1B9DB /* CNLiveCommentTableViewCell.h */,
118 D244EFE91EE9246D00C1B9DB /* CNLiveCommentTableViewCell.m */, 134 D244EFE91EE9246D00C1B9DB /* CNLiveCommentTableViewCell.m */,
  135 + D20E286D1F1C914500612B90 /* CNLiveImageTableViewCell.h */,
  136 + D20E286E1F1C914500612B90 /* CNLiveImageTableViewCell.m */,
  137 + D20E28701F1C915D00612B90 /* CNLiveVoiceTableViewCell.h */,
  138 + D20E28711F1C915D00612B90 /* CNLiveVoiceTableViewCell.m */,
119 ); 139 );
120 name = View; 140 name = View;
121 sourceTree = "<group>"; 141 sourceTree = "<group>";
@@ -123,8 +143,6 @@ @@ -123,8 +143,6 @@
123 D264D5971E6FDE02002CDF41 = { 143 D264D5971E6FDE02002CDF41 = {
124 isa = PBXGroup; 144 isa = PBXGroup;
125 children = ( 145 children = (
126 - D214CB441EF7AD4F0014EEBA /* CNLiveChatManager.framework */,  
127 - D214CB421EF7AD490014EEBA /* CNLiveMsgTools.framework */,  
128 D264D5A21E6FDE02002CDF41 /* CNLiveChatSDKDemo */, 146 D264D5A21E6FDE02002CDF41 /* CNLiveChatSDKDemo */,
129 D264D5A11E6FDE02002CDF41 /* Products */, 147 D264D5A11E6FDE02002CDF41 /* Products */,
130 ); 148 );
@@ -141,16 +159,15 @@ @@ -141,16 +159,15 @@
141 D264D5A21E6FDE02002CDF41 /* CNLiveChatSDKDemo */ = { 159 D264D5A21E6FDE02002CDF41 /* CNLiveChatSDKDemo */ = {
142 isa = PBXGroup; 160 isa = PBXGroup;
143 children = ( 161 children = (
  162 + D20E28841F1D317900612B90 /* CNLiveMsgTools.framework */,
  163 + D20E28771F1C9AAE00612B90 /* CNLiveChatManager.framework */,
144 D264D5A61E6FDE02002CDF41 /* AppDelegate.h */, 164 D264D5A61E6FDE02002CDF41 /* AppDelegate.h */,
145 D264D5A71E6FDE02002CDF41 /* AppDelegate.m */, 165 D264D5A71E6FDE02002CDF41 /* AppDelegate.m */,
146 D23194201E70101B00111C3B /* Model */, 166 D23194201E70101B00111C3B /* Model */,
147 D244EFEB1EE9247C00C1B9DB /* View */, 167 D244EFEB1EE9247C00C1B9DB /* View */,
148 D231941C1E700FEC00111C3B /* Controller */, 168 D231941C1E700FEC00111C3B /* Controller */,
149 D264D5BE1E6FDEED002CDF41 /* PrefixHeader.pch */, 169 D264D5BE1E6FDEED002CDF41 /* PrefixHeader.pch */,
150 - D264D5AC1E6FDE02002CDF41 /* Main.storyboard */,  
151 - D264D5AF1E6FDE02002CDF41 /* Assets.xcassets */,  
152 - D264D5B11E6FDE02002CDF41 /* LaunchScreen.storyboard */,  
153 - D264D5B41E6FDE02002CDF41 /* Info.plist */, 170 + D20E288A1F1D31F300612B90 /* Resource */,
154 D264D5A31E6FDE02002CDF41 /* Supporting Files */, 171 D264D5A31E6FDE02002CDF41 /* Supporting Files */,
155 ); 172 );
156 path = CNLiveChatSDKDemo; 173 path = CNLiveChatSDKDemo;
@@ -174,7 +191,7 @@ @@ -174,7 +191,7 @@
174 D264D59C1E6FDE02002CDF41 /* Sources */, 191 D264D59C1E6FDE02002CDF41 /* Sources */,
175 D264D59D1E6FDE02002CDF41 /* Frameworks */, 192 D264D59D1E6FDE02002CDF41 /* Frameworks */,
176 D264D59E1E6FDE02002CDF41 /* Resources */, 193 D264D59E1E6FDE02002CDF41 /* Resources */,
177 - D214CB481EF7AD560014EEBA /* Embed Frameworks */, 194 + D20E287B1F1C9AB300612B90 /* Embed Frameworks */,
178 ); 195 );
179 buildRules = ( 196 buildRules = (
180 ); 197 );
@@ -226,6 +243,7 @@ @@ -226,6 +243,7 @@
226 files = ( 243 files = (
227 D264D5B31E6FDE02002CDF41 /* LaunchScreen.storyboard in Resources */, 244 D264D5B31E6FDE02002CDF41 /* LaunchScreen.storyboard in Resources */,
228 D264D5B01E6FDE02002CDF41 /* Assets.xcassets in Resources */, 245 D264D5B01E6FDE02002CDF41 /* Assets.xcassets in Resources */,
  246 + D20E28891F1D31E300612B90 /* tu.jpg in Resources */,
229 D264D5AE1E6FDE02002CDF41 /* Main.storyboard in Resources */, 247 D264D5AE1E6FDE02002CDF41 /* Main.storyboard in Resources */,
230 ); 248 );
231 runOnlyForDeploymentPostprocessing = 0; 249 runOnlyForDeploymentPostprocessing = 0;
@@ -242,9 +260,11 @@ @@ -242,9 +260,11 @@
242 D2868FEC1EE914690037DECF /* CommentViewController.m in Sources */, 260 D2868FEC1EE914690037DECF /* CommentViewController.m in Sources */,
243 D231C8A91E6FFD3100EAC427 /* PrivateViewController.m in Sources */, 261 D231C8A91E6FFD3100EAC427 /* PrivateViewController.m in Sources */,
244 D264D5A51E6FDE02002CDF41 /* main.m in Sources */, 262 D264D5A51E6FDE02002CDF41 /* main.m in Sources */,
  263 + D20E28721F1C915D00612B90 /* CNLiveVoiceTableViewCell.m in Sources */,
245 D231C8A61E6FFC2700EAC427 /* ChatRoomViewController.m in Sources */, 264 D231C8A61E6FFC2700EAC427 /* ChatRoomViewController.m in Sources */,
246 D244EFEA1EE9246D00C1B9DB /* CNLiveCommentTableViewCell.m in Sources */, 265 D244EFEA1EE9246D00C1B9DB /* CNLiveCommentTableViewCell.m in Sources */,
247 D231941F1E70101500111C3B /* MessageModel.m in Sources */, 266 D231941F1E70101500111C3B /* MessageModel.m in Sources */,
  267 + D20E286F1F1C914500612B90 /* CNLiveImageTableViewCell.m in Sources */,
248 D2239CD41EE94F31005572FB /* praiseModel.m in Sources */, 268 D2239CD41EE94F31005572FB /* praiseModel.m in Sources */,
249 ); 269 );
250 runOnlyForDeploymentPostprocessing = 0; 270 runOnlyForDeploymentPostprocessing = 0;
CNLiveChatSDKDemo/CNLiveChatSDKDemo.xcodeproj/xcuserdata/cnlive.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -2,38 +2,4 @@ @@ -2,38 +2,4 @@
2 <Bucket 2 <Bucket
3 type = "1" 3 type = "1"
4 version = "2.0"> 4 version = "2.0">
5 - <Breakpoints>  
6 - <BreakpointProxy  
7 - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">  
8 - <BreakpointContent  
9 - shouldBeEnabled = "Yes"  
10 - ignoreCount = "0"  
11 - continueAfterRunningActions = "No"  
12 - filePath = "CNLiveChatSDKDemo/CommentViewController.m"  
13 - timestampString = "520502037.120796"  
14 - startingColumnNumber = "9223372036854775807"  
15 - endingColumnNumber = "9223372036854775807"  
16 - startingLineNumber = "125"  
17 - endingLineNumber = "125"  
18 - landmarkName = "-textFieldShouldReturn:"  
19 - landmarkType = "7">  
20 - </BreakpointContent>  
21 - </BreakpointProxy>  
22 - <BreakpointProxy  
23 - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">  
24 - <BreakpointContent  
25 - shouldBeEnabled = "Yes"  
26 - ignoreCount = "0"  
27 - continueAfterRunningActions = "No"  
28 - filePath = "CNLiveChatSDKDemo/CommentViewController.m"  
29 - timestampString = "520502037.120796"  
30 - startingColumnNumber = "9223372036854775807"  
31 - endingColumnNumber = "9223372036854775807"  
32 - startingLineNumber = "131"  
33 - endingLineNumber = "131"  
34 - landmarkName = "-textFieldShouldReturn:"  
35 - landmarkType = "7">  
36 - </BreakpointContent>  
37 - </BreakpointProxy>  
38 - </Breakpoints>  
39 </Bucket> 5 </Bucket>
CNLiveChatSDKDemo/CNLiveChatSDKDemo/AppDelegate.m
@@ -19,8 +19,9 @@ @@ -19,8 +19,9 @@
19 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
20 20
21 // 必须初始化 但不要重复初始化 21 // 必须初始化 但不要重复初始化
22 - [[CNLiveChatManager sharedCNLiveChatManager] initWithAppKey:@"a425987ebc86e352b3373c25d5bd082d0cc248b4043028" appId:@"60_irn9cdak77"];  
23 - 22 +// [[CNLiveChatManager sharedCNLiveChatManager] initWithAppKey:@"a425987ebc86e352b3373c25d5bd082d0cc248b4043028" appId:@"60_irn9cdak77"];
  23 + // 测试环境初始化(不要重复初始化)
  24 + [[CNLiveChatManager sharedCNLiveChatManager] initWithAppKey:@"a425987ebc86e352b3373c25d5bd082d0cc248b4043028" appId:@"60_irn9cdak77" isTestEnvironment:YES];
24 25
25 // connectServer 连接服务器,相当于匿名游客身份登录 26 // connectServer 连接服务器,相当于匿名游客身份登录
26 // 建议连接服务器操作写在 AppDelegate 里面 27 // 建议连接服务器操作写在 AppDelegate 里面
@@ -38,17 +39,14 @@ @@ -38,17 +39,14 @@
38 // 除非您已经手动将连接断开,或者杀死程序,或者少数无法自动重连的情况,否则您不需要自己再手动重连。 39 // 除非您已经手动将连接断开,或者杀死程序,或者少数无法自动重连的情况,否则您不需要自己再手动重连。
39 // 客户端使用时可以判断一下当前用户的登录状态,未登录就用上面的 connectServer 的方法连接服务器,已登录就用 loginServer 此方法连接服务器; 40 // 客户端使用时可以判断一下当前用户的登录状态,未登录就用上面的 connectServer 的方法连接服务器,已登录就用 loginServer 此方法连接服务器;
40 41
41 - CNLiveChatUserInfo *userInfo = [[CNLiveChatUserInfo alloc] initWithUserId:@"20170629" name:@"11" portrait:@""]; 42 + CNLiveChatUserInfo *userInfo = [[CNLiveChatUserInfo alloc] initWithUserId:@"20170717" name:@"11" portrait:@""];
42 43
43 [[CNLiveChatManager sharedCNLiveChatManager] loginServer:userInfo success:^(NSString *userId) { 44 [[CNLiveChatManager sharedCNLiveChatManager] loginServer:userInfo success:^(NSString *userId) {
44 45
45 NSLog(@"用户:%@ 已成功登陆",userId); 46 NSLog(@"用户:%@ 已成功登陆",userId);
46 -  
47 - // 更改昵称  
48 - [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.name = @"小花"; 47 + [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.name = @"小强"; // 更改昵称
49 48
50 } error:^(CNLiveChatConnectErrorCode errors) { 49 } error:^(CNLiveChatConnectErrorCode errors) {
51 -  
52 NSLog(@"登陆失败,错误码为:%ld",(long)errors); 50 NSLog(@"登陆失败,错误码为:%ld",(long)errors);
53 }]; 51 }];
54 52
CNLiveChatSDKDemo/CNLiveChatSDKDemo/Assets.xcassets/加号.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "加号.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 \ No newline at end of file 22 \ No newline at end of file
CNLiveChatSDKDemo/CNLiveChatSDKDemo/Assets.xcassets/加号.imageset/加号.png 0 → 100644

1.81 KB

CNLiveChatSDKDemo/CNLiveChatSDKDemo/Assets.xcassets/语音.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "语音.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 \ No newline at end of file 22 \ No newline at end of file
CNLiveChatSDKDemo/CNLiveChatSDKDemo/Assets.xcassets/语音.imageset/语音.png 0 → 100644

1.88 KB

CNLiveChatSDKDemo/CNLiveChatSDKDemo/Assets.xcassets/语音播.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "语音播.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 \ No newline at end of file 22 \ No newline at end of file
CNLiveChatSDKDemo/CNLiveChatSDKDemo/Assets.xcassets/语音播.imageset/语音播.png 0 → 100644

933 Bytes

CNLiveChatSDKDemo/CNLiveChatSDKDemo/Assets.xcassets/语音播放.imageset/Contents.json 0 → 100644
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "语音播放.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 \ No newline at end of file 22 \ No newline at end of file
CNLiveChatSDKDemo/CNLiveChatSDKDemo/Assets.xcassets/语音播放.imageset/语音播放.png 0 → 100644

901 Bytes

CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/CNLiveChatManager 0 → 100755
No preview for this file type
CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveChatManager.h renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveChatManager.h
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
10 #import "CNLiveChatUserInfo.h" 10 #import "CNLiveChatUserInfo.h"
11 #import "CNLiveChatStatusDefine.h" 11 #import "CNLiveChatStatusDefine.h"
12 #import "CNLiveChatMessage.h" 12 #import "CNLiveChatMessage.h"
  13 +#import "CNliveChatImageMessage.h"
13 14
14 @protocol CNLiveChatManagerDelegate <NSObject> 15 @protocol CNLiveChatManagerDelegate <NSObject>
15 16
@@ -45,7 +46,7 @@ @@ -45,7 +46,7 @@
45 46
46 @param message 消息实体类型对象(包括消息内容,消息ID,会话类型,目标ID,发送者的用户信息) 47 @param message 消息实体类型对象(包括消息内容,消息ID,会话类型,目标ID,发送者的用户信息)
47 */ 48 */
48 -- (void)onReceived:(CNLiveChatMessage *)message; 49 +- (void)onReceived:(id)message;
49 50
50 51
51 /** 52 /**
@@ -107,7 +108,7 @@ @@ -107,7 +108,7 @@
107 108
108 109
109 /** 110 /**
110 - 初始化SDK方法 111 + 初始化SDK方法(同上,区别:可以选择测试环境/上线环境)
111 112
112 @param appKey 从视讯云平台获取到的appKey 113 @param appKey 从视讯云平台获取到的appKey
113 @param appId 从视讯云平台获取到的appId 114 @param appId 从视讯云平台获取到的appId
@@ -199,22 +200,41 @@ @@ -199,22 +200,41 @@
199 200
200 201
201 /** 202 /**
202 - 发送消息 203 + 发送文本或语音消息
203 204
204 - @param message 消息内容 205 + @param message 消息内容(文本消息 CNLiveChatMessage / 语音消息 CNLiveChatVoiceMessage)
205 @param type 会话类型(私聊 / 聊天室) 206 @param type 会话类型(私聊 / 聊天室)
206 @param targetId 会话目标ID(私聊:用户ID / 聊天室:聊天室ID) 207 @param targetId 会话目标ID(私聊:用户ID / 聊天室:聊天室ID)
207 @param successBlock 发送消息成功的回调,消息实体类型对象(包括消息内容,消息ID,会话类型,目标ID,发送者的用户信息) 208 @param successBlock 发送消息成功的回调,消息实体类型对象(包括消息内容,消息ID,会话类型,目标ID,发送者的用户信息)
208 @param errorBlock 发送消息失败的回调,返回错误码,消息ID,目标ID 209 @param errorBlock 发送消息失败的回调,返回错误码,消息ID,目标ID
209 */ 210 */
210 -- (void)sendMessage:(NSString *)message 211 +- (void)sendMessage:(id)message
211 type:(CNLiveConversationType)type 212 type:(CNLiveConversationType)type
212 targetId:(NSString *)targetId 213 targetId:(NSString *)targetId
213 - success:(void (^)(CNLiveChatMessage *message))successBlock 214 + success:(void (^)(id message))successBlock
214 error:(void (^)(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId))errorBlock; 215 error:(void (^)(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId))errorBlock;
215 216
216 217
217 /** 218 /**
  219 + 发送图片消息
  220 +
  221 + @param type 会话类型(私聊 / 聊天室)
  222 + @param targetId 会话目标ID(私聊:用户ID / 聊天室:聊天室ID)
  223 + @param content 消息内容(图片类型 CNliveChatImageMessage)
  224 + @param progressBlock 消息发送进度更新的回调
  225 + [progress:当前的发送进度, 0 <= progress <= 100, messageId:消息的ID]
  226 + @param successBlock 消息发送成功的回调
  227 + @param errorBlock 消息发送失败的回调
  228 + */
  229 +- (void)sendMediaMessage:(CNLiveConversationType)type
  230 + targetId:(NSString *)targetId
  231 + content:(CNliveChatImageMessage *)content
  232 + progress:(void (^)(int progress, NSString * messageId))progressBlock
  233 + success:(void (^)(CNliveChatImageMessage * message))successBlock
  234 + error:(void (^)(CNLiveChatErrorCode errorCode, NSString * messageId))errorBlock;
  235 +
  236 +
  237 +/**
218 获取当前SDK的连接状态 238 获取当前SDK的连接状态
219 239
220 @return 当前SDK的连接状态 240 @return 当前SDK的连接状态
@@ -223,13 +243,14 @@ @@ -223,13 +243,14 @@
223 243
224 244
225 /** 245 /**
226 - 获取某个会话中指定数量的最新消息 246 + 获取某个会话中指定数量的最新消息(私聊有效)
227 247
228 - @param conversationType 会话类型(私聊 / 聊天室)  
229 - @param targetId 会话目标ID(私聊:用户ID / 聊天室:聊天室ID) 248 + @param conversationType 会话类型(私聊)
  249 + @param targetId 会话目标ID(私聊:用户ID)
230 @param count 所要获取的消息数量 250 @param count 所要获取的消息数量
231 251
232 - @return 消息数组(CNLiveChatMessage类型) 252 + @return 消息数组
  253 + (包括 CNLiveChatMessage文本类型 / CNliveChatImageMessage图片类型 / CNLiveChatVoiceMessage语音类型)
233 @discussion 254 @discussion
234 此方法会获取该会话中指定数量的最新消息实体,返回的消息实体按照时间从新到旧排列。 255 此方法会获取该会话中指定数量的最新消息实体,返回的消息实体按照时间从新到旧排列。
235 如果会话中的消息数量小于参数count的值,会将该会话中的所有消息返回。 256 如果会话中的消息数量小于参数count的值,会将该会话中的所有消息返回。
CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveChatMessage.h renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveChatMessage.h
CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveChatStatusDefine.h renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveChatStatusDefine.h
CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveChatUserInfo.h renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveChatUserInfo.h
CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveChatVoiceMessage.h 0 → 100644
  1 +//
  2 +// CNLiveChatVoiceMessage.h
  3 +// CNLiveChatManagerSDKDemo
  4 +//
  5 +// Created by cnliveJunBo on 17/7/12.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import "CNLiveChatStatusDefine.h"
  11 +#import "CNLiveChatUserInfo.h"
  12 +
  13 +@interface CNLiveChatVoiceMessage : NSObject
  14 +
  15 +/*!
  16 + wav格式的音频数据
  17 + */
  18 +@property(nonatomic, strong) NSData *wavAudioData;
  19 +
  20 +/*!
  21 + 语音消息的时长
  22 + */
  23 +@property(nonatomic, assign) long duration;
  24 +
  25 +/*!
  26 + 语音消息的附加信息
  27 + */
  28 +@property(nonatomic, strong) NSString *extra;
  29 +
  30 +// * 基础属性 *
  31 +/**
  32 + 会话类型(私聊 / 聊天室)
  33 + */
  34 +@property (nonatomic, assign) CNLiveConversationType conversationType;
  35 +
  36 +/**
  37 + 目标ID(消息来自聊天室的ID / 接收者ID)
  38 + */
  39 +@property (nonatomic, copy) NSString *targetId;
  40 +
  41 +/**
  42 + 消息ID(本地存储的消息的唯一值(数据库索引唯一值))
  43 + */
  44 +@property (nonatomic, copy) NSString *messageId;
  45 +
  46 +/**
  47 + 发送者的用户信息(userId, name, portraitUri)
  48 + */
  49 +@property (nonatomic, strong) CNLiveChatUserInfo *userInfo;
  50 +
  51 +/*!
  52 + 初始化语音消息
  53 +
  54 + @param audioData wav格式的音频数据
  55 + @param duration 语音消息的时长(单位:秒)
  56 + @return 语音消息对象
  57 +
  58 + @discussion
  59 + 如果您不是使用IMKit中的录音功能,则在初始化语音消息的时候,需要确保以下几点。
  60 + 1. audioData必须是单声道的wav格式音频数据;
  61 + 2. audioData的采样率必须是8000Hz,采样位数(精度)必须为16位。
  62 +
  63 + 您可以参考的录音参数:
  64 + NSDictionary *settings = @{AVFormatIDKey: @(kAudioFormatLinearPCM),
  65 + AVSampleRateKey: @8000.00f,
  66 + AVNumberOfChannelsKey: @1,
  67 + AVLinearPCMBitDepthKey: @16,
  68 + AVLinearPCMIsNonInterleaved: @NO,
  69 + AVLinearPCMIsFloatKey: @NO,
  70 + AVLinearPC'MIsBigEndianKey: @NO};
  71 + */
  72 ++ (instancetype)messageWithAudio:(NSData *)audioData duration:(long)duration;
  73 +
  74 +@end
CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveCommentCountResult.h renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveCommentCountResult.h
CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveCommentDetailInfoResult.h renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveCommentDetailInfoResult.h
CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveCommentListResult.h renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveCommentListResult.h
CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveCommentManager.h renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNLiveCommentManager.h
CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Headers/CNliveChatImageMessage.h 0 → 100644
  1 +//
  2 +// CNliveChatImageMessage.h
  3 +// CNLiveChatManager
  4 +//
  5 +// Created by cnliveJunBo on 17/7/11.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import <UIKit/UIKit.h>
  11 +#import "CNLiveChatStatusDefine.h"
  12 +#import "CNLiveChatUserInfo.h"
  13 +
  14 +/*!
  15 + 图片消息类
  16 +
  17 + @discussion 图片消息类
  18 + */
  19 +@interface CNliveChatImageMessage : NSObject
  20 +
  21 +/*!
  22 + 图片消息的URL地址
  23 +
  24 + @discussion 发送方此字段为图片的本地路径,接收方此字段为网络URL地址。
  25 + */
  26 +@property(nonatomic, strong) NSString *imageUrl;
  27 +
  28 +/*!
  29 + 图片消息的缩略图
  30 + */
  31 +@property(nonatomic, strong) UIImage *thumbnailImage;
  32 +
  33 +/*!
  34 + 是否发送原图
  35 +
  36 + @discussion 在发送图片的时候,是否发送原图,默认值为NO。
  37 + */
  38 +@property(nonatomic, getter=isFull) BOOL full;
  39 +
  40 +/*!
  41 + 图片消息的附加信息
  42 + */
  43 +@property(nonatomic, strong) NSString *extra;
  44 +
  45 +/*!
  46 + 图片消息的原始图片信息
  47 + */
  48 +@property(nonatomic, strong) UIImage *originalImage;
  49 +
  50 +// * 基础属性 *
  51 +/**
  52 + 会话类型(私聊 / 聊天室)
  53 + */
  54 +@property (nonatomic, assign) CNLiveConversationType conversationType;
  55 +
  56 +/**
  57 + 目标ID(消息来自聊天室的ID / 接收者ID)
  58 + */
  59 +@property (nonatomic, copy) NSString *targetId;
  60 +
  61 +/**
  62 + 消息ID(本地存储的消息的唯一值(数据库索引唯一值))
  63 + */
  64 +@property (nonatomic, copy) NSString *messageId;
  65 +
  66 +/**
  67 + 发送者的用户信息(userId, name, portraitUri)
  68 + */
  69 +@property (nonatomic, strong) CNLiveChatUserInfo *userInfo;
  70 +
  71 +/*!
  72 + 初始化图片消息
  73 +
  74 + @param image 原始图片
  75 + @return 图片消息对象
  76 + */
  77 +// 发: originalImage thumbnailImage 有值 imageUrl 无值
  78 +// 收: thumbnailImage imageUrl 有值 originalImage 无值
  79 ++ (instancetype)messageWithImage:(UIImage *)image;
  80 +
  81 +/*!
  82 + 初始化图片消息
  83 +
  84 + @param imageURI 图片的本地路径
  85 + @return 图片消息对象
  86 + */
  87 +// 发(本地路径): originalImage thumbnailImage imageUrl 有值
  88 +// 收: originalImage 无值 thumbnailImage imageUrl 有值
  89 ++ (instancetype)messageWithImageURI:(NSString *)imageURI;
  90 +
  91 +@end
CNLiveChatSDKDemo/CNLiveChatManager.framework/Info.plist renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveChatManager.framework/Info.plist
No preview for this file type
CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveImageTableViewCell.h 0 → 100644
  1 +//
  2 +// CNLiveImageTableViewCell.h
  3 +// CNLiveChatSDKDemo
  4 +//
  5 +// Created by cnliveJunBo on 17/7/17.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +@interface CNLiveImageTableViewCell : UITableViewCell
  12 +
  13 +@property (nonatomic, strong) MessageModel *model;
  14 +
  15 +@end
CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveImageTableViewCell.m 0 → 100644
  1 +//
  2 +// CNLiveImageTableViewCell.m
  3 +// CNLiveChatSDKDemo
  4 +//
  5 +// Created by cnliveJunBo on 17/7/17.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import "CNLiveImageTableViewCell.h"
  10 +
  11 +@interface CNLiveImageTableViewCell()
  12 +
  13 +@property (nonatomic, strong) UIImageView *imgView;
  14 +
  15 +@end
  16 +
  17 +@implementation CNLiveImageTableViewCell
  18 +
  19 +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
  20 +{
  21 + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  22 + if (self) {
  23 + [self.contentView addSubview:self.imgView];
  24 + }
  25 + return self;
  26 +}
  27 +
  28 +- (void)setModel:(MessageModel *)model {
  29 + if (_model != model) {
  30 + _model = model;
  31 + }
  32 + [_imgView setImage:model.thumbnailImage]; // 缩略图
  33 +}
  34 +
  35 +- (UIImageView *)imgView {
  36 +
  37 + if (!_imgView) {
  38 + _imgView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 5, 80, 80)];
  39 + _imgView.backgroundColor = [UIColor lightGrayColor];
  40 + }
  41 + return _imgView;
  42 +}
  43 +
  44 +@end
CNLiveChatSDKDemo/CNLiveMsgTools.framework/CNLiveMsgTools renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveMsgTools.framework/CNLiveMsgTools
No preview for this file type
CNLiveChatSDKDemo/CNLiveMsgTools.framework/Emoji.plist renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveMsgTools.framework/Emoji.plist
No preview for this file type
CNLiveChatSDKDemo/CNLiveMsgTools.framework/Headers/CNLiveMsgManager.h renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveMsgTools.framework/Headers/CNLiveMsgManager.h
@@ -12,6 +12,7 @@ @@ -12,6 +12,7 @@
12 12
13 @property (nonatomic, readonly, assign) BOOL isTestEnvironment; 13 @property (nonatomic, readonly, assign) BOOL isTestEnvironment;
14 14
  15 +
15 + (NSString *)getCNLiveMsgVersion; 16 + (NSString *)getCNLiveMsgVersion;
16 17
17 18
@@ -25,6 +26,12 @@ @@ -25,6 +26,12 @@
25 - (NSDictionary *)getToolsInfo; 26 - (NSDictionary *)getToolsInfo;
26 27
27 28
  29 +- (NSDictionary *)messageWithImage:(id)image;
  30 +
  31 +
  32 +- (NSDictionary *)messageWithVoice:(NSData *)voiceData duration:(long)duration;
  33 +
  34 +
28 - (void)initCNLiveMsgToolsWithAppKey:(NSString *)appKey appId:(NSString *)appId; 35 - (void)initCNLiveMsgToolsWithAppKey:(NSString *)appKey appId:(NSString *)appId;
29 36
30 37
@@ -72,13 +79,23 @@ @@ -72,13 +79,23 @@
72 error:(void (^)(NSInteger errors, NSString *targetId))errorBlock; 79 error:(void (^)(NSInteger errors, NSString *targetId))errorBlock;
73 80
74 81
75 -- (void)sendCarrier:(NSString *)carrier 82 +- (void)sendCarrier:(NSDictionary *)carrier
76 type:(NSInteger)type 83 type:(NSInteger)type
77 targetId:(NSString *)targetId 84 targetId:(NSString *)targetId
78 success:(void (^)(NSString *carrier, NSString *messageId, NSString *targetId, NSInteger type, NSString *infoId, NSString *infoName, NSString *infoUrl, long long goTime, long long comeTime))successBlock 85 success:(void (^)(NSString *carrier, NSString *messageId, NSString *targetId, NSInteger type, NSString *infoId, NSString *infoName, NSString *infoUrl, long long goTime, long long comeTime))successBlock
79 error:(void (^)(NSInteger errors, NSString *messageId, NSString *targetId))errorBlock; 86 error:(void (^)(NSInteger errors, NSString *messageId, NSString *targetId))errorBlock;
80 87
81 88
  89 +- (void)sendMedia:(NSDictionary *)media type:(NSInteger)type
  90 + targetId:(NSString *)targetId
  91 + pushContent:(NSString *)pushContent
  92 + pushData:(NSString *)pushData
  93 + progress:(void (^)(int progress, NSString *messageId))progressBlock
  94 + success:(void (^)(NSString *messageId, NSString *targetId, NSInteger type, NSString *infoId, NSString *infoName, NSString *infoUrl))successBlock
  95 + error:(void (^)(NSInteger errorCode, NSString *messageId))errorBlock
  96 + cancel:(void (^)(NSString * messageId))cancelBlock;
  97 +
  98 +
82 - (NSInteger)getOnLineStatus; 99 - (NSInteger)getOnLineStatus;
83 100
84 101
CNLiveChatSDKDemo/CNLiveMsgTools.framework/Info.plist renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveMsgTools.framework/Info.plist
No preview for this file type
CNLiveChatSDKDemo/CNLiveMsgTools.framework/RCConfig.plist renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveMsgTools.framework/RCConfig.plist
No preview for this file type
CNLiveChatSDKDemo/CNLiveMsgTools.framework/en.lproj/RongCloudKit.strings renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveMsgTools.framework/en.lproj/RongCloudKit.strings
No preview for this file type
CNLiveChatSDKDemo/CNLiveMsgTools.framework/release_notes_ios.txt renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveMsgTools.framework/release_notes_ios.txt
CNLiveChatSDKDemo/CNLiveMsgTools.framework/zh-Hans.lproj/RongCloudKit.strings renamed to CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveMsgTools.framework/zh-Hans.lproj/RongCloudKit.strings
No preview for this file type
CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveVoiceTableViewCell.h 0 → 100644
  1 +//
  2 +// CNLiveVoiceTableViewCell.h
  3 +// CNLiveChatSDKDemo
  4 +//
  5 +// Created by cnliveJunBo on 17/7/17.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +@interface CNLiveVoiceTableViewCell : UITableViewCell
  12 +
  13 +@property (nonatomic, strong) MessageModel *model;
  14 +
  15 +@end
CNLiveChatSDKDemo/CNLiveChatSDKDemo/CNLiveVoiceTableViewCell.m 0 → 100644
  1 +//
  2 +// CNLiveVoiceTableViewCell.m
  3 +// CNLiveChatSDKDemo
  4 +//
  5 +// Created by cnliveJunBo on 17/7/17.
  6 +// Copyright © 2017年 cnlive. All rights reserved.
  7 +//
  8 +
  9 +#import "CNLiveVoiceTableViewCell.h"
  10 +
  11 +@interface CNLiveVoiceTableViewCell()<AVAudioPlayerDelegate> {
  12 +
  13 + BOOL _isPlaying;
  14 + NSTimer *_voiceTimer;
  15 + long _voiceTime;
  16 +}
  17 +
  18 +@property (nonatomic, strong) UIButton *voicePlayBtn;
  19 +
  20 +@property (nonatomic, strong) UILabel *timeLabel;
  21 +
  22 +@property (nonatomic, strong) AVAudioPlayer *player;
  23 +
  24 +@end
  25 +
  26 +@implementation CNLiveVoiceTableViewCell
  27 +
  28 +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
  29 +{
  30 + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  31 + if (self) {
  32 + [self.contentView addSubview:self.voicePlayBtn];
  33 + }
  34 + return self;
  35 +}
  36 +
  37 +- (void)setModel:(MessageModel *)model {
  38 + if (_model != model) {
  39 + _model = model;
  40 + }
  41 + _voiceTime = model.duration;
  42 +}
  43 +
  44 +- (void)timeCountDown {
  45 +
  46 + if (_voiceTime > 0) {
  47 + _voiceTime = _voiceTime - 1;
  48 + NSLog(@"%ld",_voiceTime);
  49 + self.timeLabel.text = [NSString stringWithFormat:@"%ld s",_voiceTime];
  50 + } else {
  51 + [_player stop];
  52 + _player = nil;
  53 + _isPlaying = NO;
  54 + [_voiceTimer invalidate];
  55 + _voiceTimer = nil;
  56 + [self.voicePlayBtn setImage:[UIImage imageNamed:@"语音播放"] forState:UIControlStateNormal];
  57 + [self.timeLabel removeFromSuperview];
  58 + _voiceTime = _model.duration;
  59 + }
  60 +}
  61 +
  62 +- (void)voicePlay {
  63 +
  64 + if (_isPlaying) {
  65 + [_player stop];
  66 + _player = nil;
  67 + [self.voicePlayBtn setImage:[UIImage imageNamed:@"语音播放"] forState:UIControlStateNormal];
  68 + } else {
  69 + [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
  70 + NSError *error=nil;
  71 + _player = [[AVAudioPlayer alloc] initWithData:_model.wavAudioData error:&error];
  72 + _player.delegate = self;
  73 + _player.numberOfLoops = 0;
  74 + [_player prepareToPlay];
  75 + if (error) {
  76 + NSLog(@"初始化播放器过程发生错误,错误信息:%@",error.localizedDescription);
  77 + }
  78 + [_player play];
  79 + [self.voicePlayBtn setImage:[UIImage imageNamed:@"语音播"] forState:UIControlStateNormal];
  80 + [self.contentView addSubview:self.timeLabel];
  81 + self.timeLabel.text = [NSString stringWithFormat:@"%ld s",_voiceTime];
  82 + _voiceTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeCountDown) userInfo:nil repeats:YES];
  83 + }
  84 + _isPlaying = !_isPlaying;
  85 +}
  86 +
  87 +- (UIButton *)voicePlayBtn {
  88 + if (!_voicePlayBtn) {
  89 + _voicePlayBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  90 + [_voicePlayBtn setFrame:CGRectMake(10, 5, 100, 40)];
  91 + [_voicePlayBtn setImage:[UIImage imageNamed:@"语音播放"] forState:UIControlStateNormal];
  92 + _voicePlayBtn.backgroundColor = [UIColor lightGrayColor];
  93 + [_voicePlayBtn addTarget:self action:@selector(voicePlay) forControlEvents:UIControlEventTouchUpInside];
  94 + }
  95 + return _voicePlayBtn;
  96 +}
  97 +
  98 +- (UILabel *)timeLabel {
  99 + if (!_timeLabel) {
  100 + _timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(110, 5, 50, 40)];
  101 + _timeLabel.backgroundColor = [UIColor lightGrayColor];
  102 + [_timeLabel setTextColor:[UIColor whiteColor]];
  103 + }
  104 + return _timeLabel;
  105 +}
  106 +
  107 +@end
CNLiveChatSDKDemo/CNLiveChatSDKDemo/ChatRoomViewController.m
@@ -8,20 +8,38 @@ @@ -8,20 +8,38 @@
8 8
9 #import "ChatRoomViewController.h" 9 #import "ChatRoomViewController.h"
10 10
11 -static NSString *cellId = @"cellId"; 11 +static NSString *textCellId = @"textCellId";
  12 +static NSString *voiceCellId = @"voiceCellId";
  13 +static NSString *imageCellId = @"imageCellId";
  14 +
  15 +#define chatRoomId @"67_78734255"
12 16
13 @interface ChatRoomViewController ()<UITextFieldDelegate, CNLiveChatManagerDelegate, UITableViewDelegate, UITableViewDataSource> { 17 @interface ChatRoomViewController ()<UITextFieldDelegate, CNLiveChatManagerDelegate, UITableViewDelegate, UITableViewDataSource> {
14 18
15 NSMutableArray *_messageArrayM; 19 NSMutableArray *_messageArrayM;
16 - NSString *_messageSelf; 20 + BOOL _isVoice;
  21 + NSTimer *_getCountTimer;
17 } 22 }
18 23
  24 +@property (nonatomic, strong) UIView *textViewBackView;
  25 +
19 @property (nonatomic, strong) UITextField *textField; 26 @property (nonatomic, strong) UITextField *textField;
20 27
21 @property (nonatomic, strong) UILabel *chatRoomPersonCountLabel; 28 @property (nonatomic, strong) UILabel *chatRoomPersonCountLabel;
22 29
23 @property (nonatomic, strong) UITableView *tableView; 30 @property (nonatomic, strong) UITableView *tableView;
24 31
  32 +@property (nonatomic, strong) UIButton *imgButton;
  33 +
  34 +@property (nonatomic, strong) UIButton *voiceButton;
  35 +
  36 +@property (nonatomic, strong) UIButton *voiceSendBtn;
  37 +
  38 +@property (nonatomic, strong) AVAudioRecorder *recorder;// 录音
  39 +@property (nonatomic, strong) NSURL *recordTempFileURL; // 录音临时地址
  40 +@property (nonatomic, strong) NSData *recordedData; // 录音数据
  41 +@property (nonatomic, assign) NSTimeInterval duration; // 录音时长
  42 +
25 @end 43 @end
26 44
27 @implementation ChatRoomViewController 45 @implementation ChatRoomViewController
@@ -30,26 +48,23 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -30,26 +48,23 @@ static NSString *cellId = @&quot;cellId&quot;;
30 [super viewDidLoad]; 48 [super viewDidLoad];
31 49
32 self.view.backgroundColor = [UIColor whiteColor]; 50 self.view.backgroundColor = [UIColor whiteColor];
33 -  
34 self.title = @"聊天室"; 51 self.title = @"聊天室";
35 - 52 + [self addNotification];
36 self.automaticallyAdjustsScrollViewInsets = NO; 53 self.automaticallyAdjustsScrollViewInsets = NO;
37 54
38 [CNLiveChatManager sharedCNLiveChatManager].delegate = self; 55 [CNLiveChatManager sharedCNLiveChatManager].delegate = self;
39 56
40 - [[CNLiveChatManager sharedCNLiveChatManager] joinChatRoom:@"67_7788" messageCount:10 success:^(NSString *targetId) { 57 + [[CNLiveChatManager sharedCNLiveChatManager] joinChatRoom:chatRoomId messageCount:10 success:^(NSString *targetId) {
41 58
42 NSLog(@"已成功加入聊天室:%@",targetId); 59 NSLog(@"已成功加入聊天室:%@",targetId);
43 - [self getChatRoomPersonCount];  
44 60
  61 + [self getChatRoomPersonCount]; // 获取聊天室人数
45 dispatch_async(dispatch_get_global_queue(0, 0), ^{ 62 dispatch_async(dispatch_get_global_queue(0, 0), ^{
46 - [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(getChatRoomPersonCount) userInfo:nil repeats:YES]; 63 + _getCountTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(getChatRoomPersonCount) userInfo:nil repeats:YES];
47 [[NSRunLoop currentRunLoop] run]; 64 [[NSRunLoop currentRunLoop] run];
48 }); 65 });
49 66
50 -  
51 } error:^(CNLiveChatErrorCode errors, NSString *targetId) { 67 } error:^(CNLiveChatErrorCode errors, NSString *targetId) {
52 -  
53 NSLog(@"加入聊天室:%@失败,错误码:%ld",targetId,(long)errors); 68 NSLog(@"加入聊天室:%@失败,错误码:%ld",targetId,(long)errors);
54 }]; 69 }];
55 70
@@ -57,8 +72,8 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -57,8 +72,8 @@ static NSString *cellId = @&quot;cellId&quot;;
57 UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; 72 UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
58 gestureRecognizer.cancelsTouchesInView = YES; 73 gestureRecognizer.cancelsTouchesInView = YES;
59 [self.tableView addGestureRecognizer:gestureRecognizer]; 74 [self.tableView addGestureRecognizer:gestureRecognizer];
60 - [self.view addSubview:self.textField];  
61 [self.view addSubview:self.chatRoomPersonCountLabel]; 75 [self.view addSubview:self.chatRoomPersonCountLabel];
  76 + [self.view addSubview:self.textViewBackView];
62 77
63 _messageArrayM = [[NSMutableArray alloc] init]; 78 _messageArrayM = [[NSMutableArray alloc] init];
64 } 79 }
@@ -67,7 +82,10 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -67,7 +82,10 @@ static NSString *cellId = @&quot;cellId&quot;;
67 82
68 [super viewWillDisappear:animated]; 83 [super viewWillDisappear:animated];
69 84
70 - [[CNLiveChatManager sharedCNLiveChatManager] quitChatRoom:@"67_7788" success:^(NSString *targetId) { 85 + [_getCountTimer invalidate];
  86 + _getCountTimer = nil;
  87 +
  88 + [[CNLiveChatManager sharedCNLiveChatManager] quitChatRoom:chatRoomId success:^(NSString *targetId) {
71 NSLog(@"退出聊天室:%@成功",targetId); 89 NSLog(@"退出聊天室:%@成功",targetId);
72 } error:^(CNLiveChatErrorCode errors, NSString *targetId) { 90 } error:^(CNLiveChatErrorCode errors, NSString *targetId) {
73 NSLog(@"退出聊天室:%@失败,错误码:%ld",targetId,(long)errors); 91 NSLog(@"退出聊天室:%@失败,错误码:%ld",targetId,(long)errors);
@@ -78,15 +96,13 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -78,15 +96,13 @@ static NSString *cellId = @&quot;cellId&quot;;
78 #pragma mark - 获取聊天室人数 96 #pragma mark - 获取聊天室人数
79 - (void)getChatRoomPersonCount { 97 - (void)getChatRoomPersonCount {
80 98
81 - [[CNLiveChatManager sharedCNLiveChatManager] getChatRoomInfo:@"67_7788" success:^(int totalMemberCount) { 99 + [[CNLiveChatManager sharedCNLiveChatManager] getChatRoomInfo:chatRoomId success:^(int totalMemberCount) {
82 100
83 - NSLog(@"success: %d",totalMemberCount);  
84 dispatch_async(dispatch_get_main_queue(), ^{ 101 dispatch_async(dispatch_get_main_queue(), ^{
85 self.chatRoomPersonCountLabel.text = [NSString stringWithFormat:@"聊天室人数为:%d",totalMemberCount]; 102 self.chatRoomPersonCountLabel.text = [NSString stringWithFormat:@"聊天室人数为:%d",totalMemberCount];
86 }); 103 });
87 104
88 } error:^(CNLiveChatErrorCode status) { 105 } error:^(CNLiveChatErrorCode status) {
89 -  
90 NSLog(@"failed"); 106 NSLog(@"failed");
91 }]; 107 }];
92 } 108 }
@@ -94,107 +110,147 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -94,107 +110,147 @@ static NSString *cellId = @&quot;cellId&quot;;
94 110
95 #pragma mark - UITableViewDelegate,UITableViewDataSource !!!!!!!!!!!!!!!!!!!!!!!!!! 111 #pragma mark - UITableViewDelegate,UITableViewDataSource !!!!!!!!!!!!!!!!!!!!!!!!!!
96 112
97 -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
98 - return 1;  
99 -}  
100 -  
101 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 113 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
102 return _messageArrayM.count; 114 return _messageArrayM.count;
103 } 115 }
104 116
105 -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
106 -  
107 - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId forIndexPath:indexPath]; 117 +- (id)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
108 118
109 MessageModel *model = _messageArrayM[indexPath.row]; 119 MessageModel *model = _messageArrayM[indexPath.row];
110 120
111 - NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@: %@",model.name,model.message]];  
112 -  
113 - if ([model.userId isEqualToString:[CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.userId]) { 121 + if (model.message) { // 文本消息
  122 + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:textCellId forIndexPath:indexPath];
  123 + NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@: %@",model.name,model.message]];
114 124
115 - [AttributedStr addAttribute:NSForegroundColorAttributeName  
116 -  
117 - value:[UIColor redColor]  
118 -  
119 - range:NSMakeRange(0, model.name.length)]; 125 + if ([model.userId isEqualToString:[CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.userId]) {
  126 + [AttributedStr addAttribute:NSForegroundColorAttributeName
  127 + value:[UIColor redColor]
  128 + range:NSMakeRange(0, model.name.length)];
  129 + cell.textLabel.attributedText = AttributedStr;
  130 + } else {
  131 + [AttributedStr addAttribute:NSForegroundColorAttributeName
  132 + value:[UIColor blackColor]
  133 + range:NSMakeRange(0, model.name.length)];
  134 + cell.textLabel.attributedText = AttributedStr;
  135 + }
  136 + return cell;
120 137
121 - cell.textLabel.attributedText = AttributedStr;  
122 - } else { 138 + } else if (model.wavAudioData) { // 语音消息
123 139
124 - [AttributedStr addAttribute:NSForegroundColorAttributeName  
125 -  
126 - value:[UIColor blackColor]  
127 -  
128 - range:NSMakeRange(0, model.name.length)]; 140 + CNLiveVoiceTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:voiceCellId forIndexPath:indexPath];
  141 + cell.model = model;
  142 + return cell;
  143 + } else if (model.wavAudioData || model.thumbnailImage) {
129 144
130 - cell.textLabel.attributedText = AttributedStr; 145 + CNLiveImageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:imageCellId forIndexPath:indexPath];
  146 + cell.model = model;
  147 + return cell;
131 } 148 }
132 -  
133 - return cell; 149 + return nil;
134 } 150 }
135 151
  152 +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  153 +
  154 + MessageModel *model = _messageArrayM[indexPath.row];
  155 + if (model.wavAudioData) {
  156 + return 50;
  157 + } else if (model.imageUrl || model.thumbnailImage) {
  158 + return 100;
  159 + }
  160 + return 30;
  161 +}
136 162
137 #pragma mark - UITextFieldDelegate !!!!!!!!!!!!!!!!!!!!!!!!!! 163 #pragma mark - UITextFieldDelegate !!!!!!!!!!!!!!!!!!!!!!!!!!
138 - (BOOL)textFieldShouldReturn:(UITextField *)textField { // 发送消息 164 - (BOOL)textFieldShouldReturn:(UITextField *)textField { // 发送消息
139 165
140 - [[CNLiveChatManager sharedCNLiveChatManager] sendMessage:textField.text type:CNLive_ConversationType_CHATROOM targetId:@"67_7788" success:^(CNLiveChatMessage *message) { 166 + [[CNLiveChatManager sharedCNLiveChatManager] sendMessage:textField.text type:CNLive_ConversationType_CHATROOM targetId:chatRoomId success:^(id message) {
141 167
142 - NSLog(@"发送消息成功:%@",message.messageId);  
143 // 自己发送的消息不会被onReceived:方法实时监听,需要自己做处理 168 // 自己发送的消息不会被onReceived:方法实时监听,需要自己做处理
144 - MessageModel *model = [[MessageModel alloc] init];  
145 -  
146 - model.message = _messageSelf;  
147 - CNLiveChatUserInfo *userInfo = [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo;  
148 - model.userId = userInfo.userId;  
149 - model.name = userInfo.name;  
150 - model.portraitUri = userInfo.portraitUri;  
151 - model.type = CNLive_ConversationType_CHATROOM;  
152 - model.messageId = message.messageId;  
153 -  
154 - [_messageArrayM addObject:model];  
155 -  
156 - // 此处更新 UI 应到主线程  
157 - dispatch_async(dispatch_get_main_queue(), ^{ 169 + if ([message isKindOfClass:[CNLiveChatMessage class]]) {
158 170
159 - [self.tableView reloadData]; 171 + CNLiveChatMessage *textMsg = message;
  172 + NSLog(@"文本消息发送成功:%@",textMsg.messageContent);
  173 + MessageModel *model = [[MessageModel alloc] init];
  174 + model.message = textMsg.messageContent;
  175 + model.userId = textMsg.userInfo.userId;
  176 + model.name = textMsg.userInfo.name;
  177 + model.portraitUri = textMsg.userInfo.portraitUri;
  178 + model.type = textMsg.conversationType;
  179 + model.messageId = textMsg.messageId;
  180 + [_messageArrayM addObject:model];
160 181
161 - [self scrollToBottom];  
162 - }); 182 + // 此处更新 UI 应到主线程
  183 + dispatch_async(dispatch_get_main_queue(), ^{
  184 + [self.tableView reloadData];
  185 + [self scrollToBottom];
  186 + });
  187 + }
163 188
164 } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) { 189 } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) {
165 -  
166 - NSLog(@"向聊天室:%@发送消息失败,错误代码:%ld,信息ID:%@",targetId,(long)errors,messageId); 190 + NSLog(@"向聊天室:%@发送文本消息失败,错误代码:%ld,信息ID:%@",targetId,(long)errors,messageId);
167 }]; 191 }];
168 192
169 - _messageSelf = textField.text;  
170 textField.text = @""; 193 textField.text = @"";
171 -  
172 return YES; 194 return YES;
173 } 195 }
174 196
175 197
176 #pragma mark - CNLiveChatManagerDelegate !!!!!!!!!!!!!!!!!!!!!!!!!! 198 #pragma mark - CNLiveChatManagerDelegate !!!!!!!!!!!!!!!!!!!!!!!!!!
177 -- (void)onReceived:(CNLiveChatMessage *)message {  
178 -  
179 - NSLog(@"收到消息类型:%lu,消息ID:%@,消息内容:%@,消息发送者信息:%@,消息ID:%@",(unsigned long)message.conversationType,message.targetId,message.messageContent,message.userInfo,message.messageId); 199 +- (void)onReceived:(id)message {
180 200
181 - // 只显示本聊天室信息  
182 - if (message.conversationType == CNLive_ConversationType_CHATROOM && [message.targetId isEqualToString:@"67_7788"]) { 201 + if ([message isKindOfClass:[CNLiveChatMessage class]]) {
183 202
184 - MessageModel *model = [[MessageModel alloc] init]; 203 + CNLiveChatMessage * msg = (CNLiveChatMessage *)message;
  204 + // 只显示本聊天室信息
  205 + if (msg.conversationType == CNLive_ConversationType_CHATROOM && [msg.targetId isEqualToString:chatRoomId]) {
  206 +
  207 + MessageModel *model = [[MessageModel alloc] init];
  208 + model.message = msg.messageContent;
  209 + model.userId = msg.userInfo.userId;
  210 + model.name = msg.userInfo.name;
  211 + model.portraitUri = msg.userInfo.portraitUri;
  212 + model.type = msg.conversationType;
  213 + [_messageArrayM addObject:model];
  214 + }
  215 + } else if ([message isKindOfClass:[CNliveChatImageMessage class]]) {
185 216
186 - model.message = message.messageContent;  
187 - model.userId = message.userInfo.userId;  
188 - model.name = message.userInfo.name;  
189 - model.portraitUri = message.userInfo.portraitUri;  
190 - model.type = message.conversationType; 217 + CNliveChatImageMessage * msg = (CNliveChatImageMessage *)message;
191 218
192 - [_messageArrayM addObject:model]; 219 + if (msg.conversationType == CNLive_ConversationType_CHATROOM && [msg.targetId isEqualToString:chatRoomId]) {
  220 +
  221 + MessageModel *model = [[MessageModel alloc] init];
  222 + model.imageUrl = msg.imageUrl;
  223 + model.thumbnailImage = msg.thumbnailImage;
  224 + model.isFull = msg.isFull;
  225 + model.originalImage = msg.originalImage;
  226 + model.extra = msg.extra;
  227 + model.userId = msg.userInfo.userId;
  228 + model.name = msg.userInfo.name;
  229 + model.portraitUri = msg.userInfo.portraitUri;
  230 + model.type = msg.conversationType;
  231 + [_messageArrayM addObject:model];
  232 + }
  233 +
  234 + } else if ([message isKindOfClass:[CNLiveChatVoiceMessage class]]) {
193 235
194 - [self.tableView reloadData]; 236 + CNLiveChatVoiceMessage * msg = (CNLiveChatVoiceMessage *)message;
195 237
196 - [self scrollToBottom]; 238 + if (msg.conversationType == CNLive_ConversationType_CHATROOM && [msg.targetId isEqualToString:chatRoomId]) {
  239 +
  240 + MessageModel *model = [[MessageModel alloc] init];
  241 + model.wavAudioData = msg.wavAudioData;
  242 + model.duration = msg.duration;
  243 + model.extra = msg.extra; // 扩展
  244 + model.targetId = msg.targetId;
  245 + model.userId = msg.userInfo.userId;
  246 + model.name = msg.userInfo.name;
  247 + model.portraitUri = msg.userInfo.portraitUri;
  248 + model.type = msg.conversationType;
  249 + [_messageArrayM addObject:model];
  250 + }
197 } 251 }
  252 + [self.tableView reloadData];
  253 + [self scrollToBottom];
198 } 254 }
199 255
200 - (void)onConnectionStatusChanged:(CNLiveConnectionStatus)status { 256 - (void)onConnectionStatusChanged:(CNLiveConnectionStatus)status {
@@ -221,12 +277,130 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -221,12 +277,130 @@ static NSString *cellId = @&quot;cellId&quot;;
221 NSLog(@"账号%@在其他设备登陆",userId); 277 NSLog(@"账号%@在其他设备登陆",userId);
222 } 278 }
223 279
  280 +#pragma mark - 图片 Button Action !!!!!!!!!!!!!!!!!!!!!!!!
  281 +- (void)sendImage {
  282 +
  283 + NSString *path = [[NSBundle mainBundle] pathForResource:@"tu.jpg" ofType:nil];
  284 + CNliveChatImageMessage *imageMsg = [CNliveChatImageMessage messageWithImageURI:path];
  285 +
  286 + [[CNLiveChatManager sharedCNLiveChatManager] sendMediaMessage:CNLive_ConversationType_CHATROOM targetId:chatRoomId content:imageMsg progress:^(int progress, NSString *messageId) {
  287 + NSLog(@"发送进度");
  288 + } success:^(CNliveChatImageMessage *message) {
  289 +
  290 + NSLog(@"图片消息发送成功~");
  291 + MessageModel *model = [[MessageModel alloc] init];
  292 + model.imageUrl = message.imageUrl;
  293 + model.thumbnailImage = message.thumbnailImage;
  294 + model.isFull = message.isFull;
  295 + model.originalImage = message.originalImage;
  296 + model.extra = message.extra;
  297 + model.userId = message.userInfo.userId;
  298 + model.name = message.userInfo.name;
  299 + model.portraitUri = message.userInfo.portraitUri;
  300 + model.type = message.conversationType;
  301 + model.messageId = message.messageId;
  302 + [_messageArrayM addObject:model];
  303 +
  304 + // 此处更新 UI 应到主线程
  305 + dispatch_async(dispatch_get_main_queue(), ^{
  306 + [self.tableView reloadData];
  307 + [self scrollToBottom];
  308 + });
  309 +
  310 + } error:^(CNLiveChatErrorCode errorCode, NSString *messageId) {
  311 + NSLog(@"发送图片消息失败,错误码:%ld",(long)errorCode);
  312 + }];
  313 +}
  314 +
  315 +#pragma mark - 语音 Button Action !!!!!!!!!!!!!!!!!!!!!!!!
  316 +- (void)voiceAction {
  317 +
  318 + _isVoice = !_isVoice;
  319 + if (_isVoice) {
  320 + [self.textField removeFromSuperview];
  321 + [self.textViewBackView addSubview:self.voiceSendBtn];
  322 + } else {
  323 + [self.voiceSendBtn removeFromSuperview];
  324 + [self.textViewBackView addSubview:self.textField];
  325 + }
  326 +}
  327 +
  328 +- (void)startRecord {
  329 + NSLog(@"讲话");
  330 +
  331 + [self.recorder prepareToRecord];
  332 +
  333 + [self.recorder record];
  334 +}
  335 +
  336 +- (void)stopRecord {
  337 + NSLog(@"松手");
  338 +
  339 + if (self.recorder.isRecording) {
  340 + self.recordedData =[NSData dataWithContentsOfURL:self.recordTempFileURL];
  341 + self.duration = self.recorder.currentTime;
  342 + [self.recorder stop];
  343 + self.recorder = nil;
  344 + }
  345 +
  346 + if (self.recordedData && self.duration > 1) {
  347 +
  348 + CNLiveChatVoiceMessage *voiceMsg = [CNLiveChatVoiceMessage messageWithAudio:self.recordedData duration:self.duration];
  349 +
  350 + [[CNLiveChatManager sharedCNLiveChatManager] sendMessage:voiceMsg type:CNLive_ConversationType_CHATROOM targetId:chatRoomId success:^(id message) {
  351 +
  352 + NSLog(@"语音消息发送成功");
  353 + // 自己发送的消息不会被onReceived:方法实时监听,需要自己做处理
  354 + if ([message isKindOfClass:[CNLiveChatVoiceMessage class]]) {
  355 +
  356 + CNLiveChatVoiceMessage *voiceMsg = message;
  357 + MessageModel *model = [[MessageModel alloc] init];
  358 +
  359 + model.wavAudioData = voiceMsg.wavAudioData;
  360 + model.duration = voiceMsg.duration;
  361 + model.extra = voiceMsg.extra; // 扩展
  362 + model.targetId = voiceMsg.targetId;
  363 + CNLiveChatUserInfo *userInfo = [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo;
  364 + model.userId = userInfo.userId;
  365 + model.name = userInfo.name;
  366 + model.portraitUri = userInfo.portraitUri;
  367 + model.type = CNLive_ConversationType_CHATROOM;
  368 +
  369 + [_messageArrayM addObject:model];
  370 +
  371 + // 此处更新 UI 应到主线程
  372 + dispatch_async(dispatch_get_main_queue(), ^{
  373 +
  374 + [self.tableView reloadData];
  375 +
  376 + [self scrollToBottom];
  377 + });
  378 + }
  379 +
  380 + } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) {
  381 + NSLog(@"语音发送失败,错误码:%ld",errors);
  382 + }];
  383 + } else {
  384 + NSLog(@"时间太短,重新录制");
  385 + }
  386 +}
  387 +
  388 +#pragma mark - Get Method !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  389 +- (UIView *)textViewBackView {
  390 + if (!_textViewBackView) {
  391 + _textViewBackView = [[UIView alloc] initWithFrame:CGRectMake(0, KScreenHeight-50, KScreenWidth, 50)];
  392 + _textViewBackView.backgroundColor = [UIColor colorWithRed:(230.0/255.0) green:(230.0/255.0) blue:(230.0/255.0) alpha:1];
  393 + [_textViewBackView addSubview:self.textField];
  394 + [_textViewBackView addSubview:self.voiceButton];
  395 + [_textViewBackView addSubview:self.imgButton];
  396 + }
  397 + return _textViewBackView;
  398 +}
224 399
225 -#pragma mark - Get Method !!!!!!!!!!!!!!!!!!!!!!!!!!  
226 - (UITextField *)textField { 400 - (UITextField *)textField {
227 401
228 if (!_textField) { 402 if (!_textField) {
229 - _textField = [self createTextFieldWithFrame:CGRectMake(10, 74, KScreenWidth - 20, 40) font:20]; 403 + _textField = [self createTextFieldWithFrame:CGRectMake(43, 5, KScreenWidth - 86, 40) font:20];
230 _textField.delegate = self; 404 _textField.delegate = self;
231 } 405 }
232 return _textField; 406 return _textField;
@@ -235,22 +409,82 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -235,22 +409,82 @@ static NSString *cellId = @&quot;cellId&quot;;
235 - (UILabel *)chatRoomPersonCountLabel { 409 - (UILabel *)chatRoomPersonCountLabel {
236 410
237 if (!_chatRoomPersonCountLabel) { 411 if (!_chatRoomPersonCountLabel) {
238 - _chatRoomPersonCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 124, KScreenWidth - 20, 35)]; 412 + _chatRoomPersonCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 64, KScreenWidth - 20, 35)];
239 } 413 }
240 return _chatRoomPersonCountLabel; 414 return _chatRoomPersonCountLabel;
241 } 415 }
242 416
243 -(UITableView *)tableView { 417 -(UITableView *)tableView {
244 if (!_tableView) { 418 if (!_tableView) {
245 - _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 159, KScreenWidth, KScreenHeight - 425) style:UITableViewStylePlain]; 419 + _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 97, KScreenWidth, KScreenHeight - 147) style:UITableViewStylePlain];
246 _tableView.rowHeight = 30; 420 _tableView.rowHeight = 30;
247 _tableView.delegate = self; 421 _tableView.delegate = self;
248 _tableView.dataSource = self; 422 _tableView.dataSource = self;
249 - [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellId]; 423 + [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:textCellId];
  424 + [_tableView registerClass:[CNLiveVoiceTableViewCell class] forCellReuseIdentifier:voiceCellId];
  425 + [_tableView registerClass:[CNLiveImageTableViewCell class] forCellReuseIdentifier:imageCellId];
250 } 426 }
251 return _tableView; 427 return _tableView;
252 } 428 }
253 429
  430 +- (UIButton *)imgButton {
  431 + if (!_imgButton) {
  432 + _imgButton = [UIButton buttonWithType:UIButtonTypeCustom];
  433 + _imgButton.frame = CGRectMake(KScreenWidth - 40, 5, 40, 40);
  434 + [_imgButton setImage:[UIImage imageNamed:@"加号"] forState:UIControlStateNormal];
  435 + [_imgButton addTarget:self action:@selector(sendImage) forControlEvents:UIControlEventTouchUpInside];
  436 + }
  437 + return _imgButton;
  438 +}
  439 +
  440 +- (UIButton *)voiceButton {
  441 + if (!_voiceButton) {
  442 + _voiceButton = [UIButton buttonWithType:UIButtonTypeCustom];
  443 + _voiceButton.frame = CGRectMake(0, 5, 40, 40);
  444 + [_voiceButton setImage:[UIImage imageNamed:@"语音"] forState:UIControlStateNormal];
  445 + [_voiceButton addTarget:self action:@selector(voiceAction) forControlEvents:UIControlEventTouchUpInside];
  446 + }
  447 + return _voiceButton;
  448 +}
  449 +
  450 +- (UIButton *)voiceSendBtn {
  451 + if (!_voiceSendBtn) {
  452 + _voiceSendBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  453 + _voiceSendBtn.frame = CGRectMake(43, 5, KScreenWidth - 86, 40);
  454 + [_voiceSendBtn setTitle:@"按住 说话" forState:UIControlStateNormal];
  455 + [_voiceSendBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  456 + [_voiceSendBtn setTitle:@"松手 发送" forState:UIControlStateHighlighted];
  457 + [_voiceSendBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
  458 + _voiceSendBtn.backgroundColor = [UIColor whiteColor];
  459 + [_voiceSendBtn addTarget:self action:@selector(startRecord) forControlEvents:UIControlEventTouchDown];
  460 + [_voiceSendBtn addTarget:self action:@selector(stopRecord) forControlEvents:UIControlEventTouchUpInside];
  461 + }
  462 + return _voiceSendBtn;
  463 +}
  464 +
  465 +- (AVAudioRecorder *)recorder { // 录音
  466 + if (!_recorder) {
  467 + NSDictionary *settings = @{AVFormatIDKey: @(kAudioFormatLinearPCM),
  468 + AVSampleRateKey: @8000.00f,
  469 + AVNumberOfChannelsKey: @1,
  470 + AVLinearPCMBitDepthKey: @16,
  471 + AVLinearPCMIsNonInterleaved: @NO,
  472 + AVLinearPCMIsFloatKey: @NO,
  473 + AVLinearPCMIsBigEndianKey: @NO};
  474 + NSError *error;
  475 + [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
  476 + _recorder = [[AVAudioRecorder alloc] initWithURL:self.recordTempFileURL settings:settings error:&error];
  477 + }
  478 + return _recorder;
  479 +}
  480 +
  481 +- (NSURL *)recordTempFileURL {
  482 + if (!_recordTempFileURL) {
  483 + _recordTempFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: @"tempAC.caf"]];
  484 + }
  485 + return _recordTempFileURL;
  486 +}
  487 +
254 488
255 #pragma mark - 创建文本框 !!!!!!!!!!!!!!!!!!!!!!!!!! 489 #pragma mark - 创建文本框 !!!!!!!!!!!!!!!!!!!!!!!!!!
256 - (UITextField *)createTextFieldWithFrame:(CGRect)frame font:(float)font { 490 - (UITextField *)createTextFieldWithFrame:(CGRect)frame font:(float)font {
@@ -276,6 +510,72 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -276,6 +510,72 @@ static NSString *cellId = @&quot;cellId&quot;;
276 } 510 }
277 } 511 }
278 512
  513 +- (void)addNotification {
  514 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
  515 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
  516 +}
  517 +
  518 +#pragma mark <KeyboardNotificationAction> !!!!!!!!!!!!!!!!!!!!!!!!!!!
  519 +- (void)keyboardWillShow:(NSNotification *)notification {
  520 +
  521 + CGRect keyboardRect = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
  522 + UIViewAnimationCurve curve = [[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
  523 + double duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  524 +
  525 + UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0,0.0,keyboardRect.size.height,0.0);
  526 + _tableView.contentInset = contentInsets;
  527 + [self scrollToBottom];
  528 +
  529 + [UIView animateWithDuration:duration
  530 + delay:0.0f
  531 + options:[self animationOptionsForCurve:curve]
  532 + animations:^{
  533 +
  534 + CGRect inputViewFrame = self.textViewBackView.frame;
  535 + if (keyboardRect.origin.y == KScreenHeight) {
  536 + self.textViewBackView.frame = CGRectMake(inputViewFrame.origin.x,
  537 + self.view.frame.size.height-(inputViewFrame.size.height),
  538 + inputViewFrame.size.width,
  539 + inputViewFrame.size.height);
  540 + } else {
  541 +
  542 + self.textViewBackView.frame = CGRectMake(inputViewFrame.origin.x,
  543 + self.view.frame.size.height-keyboardRect.size.height-_textViewBackView.frame.size.height,
  544 + inputViewFrame.size.width,
  545 + inputViewFrame.size.height);
  546 +
  547 + }
  548 + }
  549 + completion:^(BOOL finished) {
  550 + }];
  551 +}
  552 +
  553 +- (void)keyboardWillHide:(NSNotification *)notification
  554 +{
  555 + [self.textViewBackView setFrame:CGRectMake(0, KScreenHeight-50, KScreenWidth, self.textViewBackView.frame.size.height)];
  556 + _tableView.contentInset = UIEdgeInsetsZero;
  557 +}
  558 +
  559 +- (UIViewAnimationOptions)animationOptionsForCurve:(UIViewAnimationCurve)curve
  560 +{
  561 + switch (curve) {
  562 + case UIViewAnimationCurveEaseInOut:
  563 + return UIViewAnimationOptionCurveEaseInOut;
  564 + break;
  565 + case UIViewAnimationCurveEaseIn:
  566 + return UIViewAnimationOptionCurveEaseIn;
  567 + break;
  568 + case UIViewAnimationCurveEaseOut:
  569 + return UIViewAnimationOptionCurveEaseOut;
  570 + break;
  571 + case UIViewAnimationCurveLinear:
  572 + return UIViewAnimationOptionCurveLinear;
  573 + break;
  574 + }
  575 +
  576 + return kNilOptions;
  577 +}
  578 +
279 #pragma mark - 隐藏键盘 !!!!!!!!!!!!!!!!!!!!!!! 579 #pragma mark - 隐藏键盘 !!!!!!!!!!!!!!!!!!!!!!!
280 - (void)hideKeyboard { 580 - (void)hideKeyboard {
281 581
@@ -287,5 +587,4 @@ static NSString *cellId = @&quot;cellId&quot;; @@ -287,5 +587,4 @@ static NSString *cellId = @&quot;cellId&quot;;
287 // Dispose of any resources that can be recreated. 587 // Dispose of any resources that can be recreated.
288 } 588 }
289 589
290 -  
291 @end 590 @end
CNLiveChatSDKDemo/CNLiveChatSDKDemo/MessageModel.h
@@ -10,7 +10,44 @@ @@ -10,7 +10,44 @@
10 10
11 @interface MessageModel : NSObject 11 @interface MessageModel : NSObject
12 12
13 -@property (nonatomic, strong) NSString *message; 13 +@property (nonatomic, strong) NSString *message; // 文本消息
  14 +
  15 +/*!
  16 + 图片消息的URL地址
  17 +
  18 + @discussion 发送方此字段为图片的本地路径,接收方此字段为网络URL地址。
  19 + */
  20 +@property(nonatomic, strong) NSString *imageUrl;
  21 +
  22 +/*!
  23 + 图片消息的缩略图
  24 + */
  25 +@property(nonatomic, strong) UIImage *thumbnailImage;
  26 +/*!
  27 + 是否发送原图
  28 +
  29 + @discussion 在发送图片的时候,是否发送原图,默认值为NO。
  30 + */
  31 +@property(nonatomic, assign) BOOL isFull;
  32 +/*!
  33 + 图片消息的原始图片信息
  34 + */
  35 +@property(nonatomic, strong) UIImage *originalImage;
  36 +
  37 +/*!
  38 + wav格式的音频数据
  39 + */
  40 +@property(nonatomic, strong) NSData *wavAudioData;
  41 +
  42 +/*!
  43 + 语音消息的时长
  44 + */
  45 +@property(nonatomic, assign) long duration;
  46 +
  47 +/*!
  48 + 语音/图片消息的附加信息
  49 + */
  50 +@property(nonatomic, strong) NSString *extra;
14 51
15 @property (nonatomic, strong) NSString *targetId; 52 @property (nonatomic, strong) NSString *targetId;
16 53
CNLiveChatSDKDemo/CNLiveChatSDKDemo/PrefixHeader.pch
@@ -18,6 +18,11 @@ @@ -18,6 +18,11 @@
18 #import "MessageModel.h" 18 #import "MessageModel.h"
19 #import <CNLiveChatManager/CNLiveCommentManager.h> 19 #import <CNLiveChatManager/CNLiveCommentManager.h>
20 #import "praiseModel.h" 20 #import "praiseModel.h"
  21 +#import <AVFoundation/AVFoundation.h>
  22 +#import <CNLiveChatManager/CNLiveChatVoiceMessage.h>
  23 +#import <CNLiveChatManager/CNliveChatImageMessage.h>
  24 +#import "CNLiveImageTableViewCell.h"
  25 +#import "CNLiveVoiceTableViewCell.h"
21 26
22 #endif 27 #endif
23 28
CNLiveChatSDKDemo/CNLiveChatSDKDemo/PrivateViewController.m
@@ -8,18 +8,36 @@ @@ -8,18 +8,36 @@
8 8
9 #import "PrivateViewController.h" 9 #import "PrivateViewController.h"
10 10
11 -static NSString *priCellId = @"priCellId"; 11 +#define privateUserId @"67_170718"
  12 +
  13 +static NSString *textCellId = @"textCellId";
  14 +static NSString *voiceCellId = @"voiceCellId";
  15 +static NSString *imageCellId = @"imageCellId";
12 16
13 @interface PrivateViewController ()<UITextFieldDelegate, CNLiveChatManagerDelegate, UITableViewDelegate, UITableViewDataSource> { 17 @interface PrivateViewController ()<UITextFieldDelegate, CNLiveChatManagerDelegate, UITableViewDelegate, UITableViewDataSource> {
14 18
15 NSMutableArray *_messageArrayM; 19 NSMutableArray *_messageArrayM;
16 - NSString *_messageSelf; 20 + BOOL _isVoice;
  21 + NSTimer *_getCountTimer;
17 } 22 }
18 23
  24 +@property (nonatomic, strong) UIView *textViewBackView;
  25 +
19 @property (nonatomic, strong) UITextField *textField; 26 @property (nonatomic, strong) UITextField *textField;
20 27
21 @property (nonatomic, strong) UITableView *tableView; 28 @property (nonatomic, strong) UITableView *tableView;
22 29
  30 +@property (nonatomic, strong) UIButton *imgButton;
  31 +
  32 +@property (nonatomic, strong) UIButton *voiceButton;
  33 +
  34 +@property (nonatomic, strong) UIButton *voiceSendBtn;
  35 +
  36 +@property (nonatomic, strong) AVAudioRecorder *recorder;// 录音
  37 +@property (nonatomic, strong) NSURL *recordTempFileURL; // 录音临时地址
  38 +@property (nonatomic, strong) NSData *recordedData; // 录音数据
  39 +@property (nonatomic, assign) NSTimeInterval duration; // 录音时长
  40 +
23 @end 41 @end
24 42
25 @implementation PrivateViewController 43 @implementation PrivateViewController
@@ -27,153 +45,219 @@ static NSString *priCellId = @&quot;priCellId&quot;; @@ -27,153 +45,219 @@ static NSString *priCellId = @&quot;priCellId&quot;;
27 - (void)viewDidLoad { 45 - (void)viewDidLoad {
28 [super viewDidLoad]; 46 [super viewDidLoad];
29 47
30 - self.title = @"单聊";  
31 -  
32 self.view.backgroundColor = [UIColor whiteColor]; 48 self.view.backgroundColor = [UIColor whiteColor];
33 - 49 + self.title = @"单聊";
  50 + [self addNotification];
34 self.automaticallyAdjustsScrollViewInsets = NO; 51 self.automaticallyAdjustsScrollViewInsets = NO;
35 52
36 [CNLiveChatManager sharedCNLiveChatManager].delegate = self; 53 [CNLiveChatManager sharedCNLiveChatManager].delegate = self;
37 54
38 [self.view addSubview:self.tableView]; 55 [self.view addSubview:self.tableView];
39 UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; 56 UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
40 - gestureRecognizer.cancelsTouchesInView = NO; 57 + gestureRecognizer.cancelsTouchesInView = YES;
41 [self.tableView addGestureRecognizer:gestureRecognizer]; 58 [self.tableView addGestureRecognizer:gestureRecognizer];
42 - [self.view addSubview:self.textField]; 59 + [self.view addSubview:self.textViewBackView];
43 60
44 _messageArrayM = [[NSMutableArray alloc] init]; 61 _messageArrayM = [[NSMutableArray alloc] init];
45 62
46 // 获取最新消息 63 // 获取最新消息
47 [self getPrivateChattingRecords]; 64 [self getPrivateChattingRecords];
48 -  
49 - // 获取昵称信息  
50 - NSString *name = [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.name;  
51 - NSLog(@"昵称:%@",name);  
52 } 65 }
53 66
54 -#pragma mark - 懒加载 !!!!!!!!!!!!!!!!!!!!!!!!!!  
55 -- (UITextField *)textField { 67 +#pragma mark - 获取私聊最新历史聊天记录 !!!!!!!!!!!!!!!!!!!!!!!!!!!!
  68 +- (void)getPrivateChattingRecords {
56 69
57 - if (!_textField) {  
58 - _textField = [self createTextFieldWithFrame:CGRectMake(10, 74, KScreenWidth - 20, 40) font:20];  
59 - _textField.delegate = self;  
60 - }  
61 - return _textField;  
62 -} 70 + // 获取最新消息
  71 + NSArray *messageArray = [[CNLiveChatManager sharedCNLiveChatManager] getLatestMessages:CNLive_ConversationType_PRIVATE targetId:privateUserId count:20];
  72 +
  73 + for (id message in messageArray) {
  74 +
  75 + if ([message isKindOfClass:[CNLiveChatMessage class]]) {
  76 +
  77 + CNLiveChatMessage *textMsg = (CNLiveChatMessage *)message;
  78 + MessageModel *model = [[MessageModel alloc] init];
  79 + model.message = textMsg.messageContent;
  80 + model.userId = textMsg.userInfo.userId;
  81 + model.name = textMsg.userInfo.name;
  82 + model.portraitUri = textMsg.userInfo.portraitUri;
  83 + model.type = textMsg.conversationType;
  84 + if (![_messageArrayM containsObject:model]) {
  85 + [_messageArrayM insertObject:model atIndex:0];
  86 + }
  87 +
  88 + } else if ([message isKindOfClass:[CNliveChatImageMessage class]]) {
63 89
64 --(UITableView *)tableView {  
65 - if (!_tableView) {  
66 - _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 124, KScreenWidth, KScreenHeight - 425) style:UITableViewStylePlain];  
67 - _tableView.rowHeight = 30;  
68 - _tableView.delegate = self;  
69 - _tableView.dataSource = self;  
70 - [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:priCellId]; 90 + CNliveChatImageMessage *imageMsg = (CNliveChatImageMessage *)message;
  91 + MessageModel *model = [[MessageModel alloc] init];
  92 + model.imageUrl = imageMsg.imageUrl;
  93 + model.thumbnailImage = imageMsg.thumbnailImage;
  94 + model.isFull = imageMsg.isFull;
  95 + model.originalImage = imageMsg.originalImage;
  96 + model.extra = imageMsg.extra;
  97 + model.userId = imageMsg.userInfo.userId;
  98 + model.name = imageMsg.userInfo.name;
  99 + model.portraitUri = imageMsg.userInfo.portraitUri;
  100 + model.type = imageMsg.conversationType;
  101 + if (![_messageArrayM containsObject:model]) {
  102 + [_messageArrayM insertObject:model atIndex:0];
  103 + }
  104 +
  105 + } else if ([message isKindOfClass:[CNLiveChatVoiceMessage class]]) {
  106 +
  107 + CNLiveChatVoiceMessage *voiceMsg = (CNLiveChatVoiceMessage *)message;
  108 + MessageModel *model = [[MessageModel alloc] init];
  109 + model.wavAudioData = voiceMsg.wavAudioData;
  110 + model.duration = voiceMsg.duration;
  111 + model.extra = voiceMsg.extra; // 扩展
  112 + model.targetId = voiceMsg.targetId;
  113 + model.userId = voiceMsg.userInfo.userId;
  114 + model.name = voiceMsg.userInfo.name;
  115 + model.portraitUri = voiceMsg.userInfo.portraitUri;
  116 + model.type = voiceMsg.conversationType;
  117 + if (![_messageArrayM containsObject:model]) {
  118 + [_messageArrayM insertObject:model atIndex:0];
  119 + }
  120 + }
  121 + [self.tableView reloadData];
  122 + [self scrollToBottom];
71 } 123 }
72 - return _tableView;  
73 } 124 }
74 125
75 #pragma mark - UITableViewDelegate,UITableViewDataSource !!!!!!!!!!!!!!!!!!!!!!!!!! 126 #pragma mark - UITableViewDelegate,UITableViewDataSource !!!!!!!!!!!!!!!!!!!!!!!!!!
76 127
77 -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
78 - return 1;  
79 -}  
80 -  
81 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 128 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
82 return _messageArrayM.count; 129 return _messageArrayM.count;
83 } 130 }
84 131
85 -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
86 -  
87 - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:priCellId forIndexPath:indexPath]; 132 +- (id)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
88 133
89 MessageModel *model = _messageArrayM[indexPath.row]; 134 MessageModel *model = _messageArrayM[indexPath.row];
90 135
91 - NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@: %@",model.name,model.message]];  
92 -  
93 - if ([model.userId isEqualToString:[CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.userId]) { 136 + if (model.message) { // 文本消息
  137 + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:textCellId forIndexPath:indexPath];
  138 + NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@: %@",model.name,model.message]];
94 139
95 - [AttributedStr addAttribute:NSForegroundColorAttributeName  
96 -  
97 - value:[UIColor redColor]  
98 -  
99 - range:NSMakeRange(0, model.name.length)]; 140 + if ([model.userId isEqualToString:[CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.userId]) {
  141 + [AttributedStr addAttribute:NSForegroundColorAttributeName
  142 + value:[UIColor redColor]
  143 + range:NSMakeRange(0, model.name.length)];
  144 + cell.textLabel.attributedText = AttributedStr;
  145 + } else {
  146 + [AttributedStr addAttribute:NSForegroundColorAttributeName
  147 + value:[UIColor blackColor]
  148 + range:NSMakeRange(0, model.name.length)];
  149 + cell.textLabel.attributedText = AttributedStr;
  150 + }
  151 + return cell;
100 152
101 - cell.textLabel.attributedText = AttributedStr;  
102 - } else { 153 + } else if (model.wavAudioData) { // 语音消息
103 154
104 - [AttributedStr addAttribute:NSForegroundColorAttributeName  
105 -  
106 - value:[UIColor blackColor]  
107 -  
108 - range:NSMakeRange(0, model.name.length)]; 155 + CNLiveVoiceTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:voiceCellId forIndexPath:indexPath];
  156 + cell.model = model;
  157 + return cell;
  158 + } else if (model.wavAudioData || model.thumbnailImage) { // 图片消息
109 159
110 - cell.textLabel.attributedText = AttributedStr; 160 + CNLiveImageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:imageCellId forIndexPath:indexPath];
  161 + cell.model = model;
  162 + return cell;
111 } 163 }
112 -  
113 - return cell; 164 + return nil;
114 } 165 }
115 166
  167 +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  168 +
  169 + MessageModel *model = _messageArrayM[indexPath.row];
  170 + if (model.wavAudioData) {
  171 + return 50;
  172 + } else if (model.imageUrl || model.thumbnailImage) {
  173 + return 100;
  174 + }
  175 + return 30;
  176 +}
116 177
117 #pragma mark - UITextFieldDelegate !!!!!!!!!!!!!!!!!!!!!!!!!! 178 #pragma mark - UITextFieldDelegate !!!!!!!!!!!!!!!!!!!!!!!!!!
118 -- (BOOL)textFieldShouldReturn:(UITextField *)textField { // 发送消息 179 +- (BOOL)textFieldShouldReturn:(UITextField *)textField { // 发送文本消息
119 180
120 - [[CNLiveChatManager sharedCNLiveChatManager] sendMessage:textField.text type:CNLive_ConversationType_PRIVATE targetId:@"70_20170315" success:^(CNLiveChatMessage *message) { 181 + [[CNLiveChatManager sharedCNLiveChatManager] sendMessage:textField.text type:CNLive_ConversationType_PRIVATE targetId:privateUserId success:^(id message) {
121 182
122 - NSLog(@"发送消息成功:%@",message.messageId);  
123 // 自己发送的消息不会被onReceived:方法实时监听,需要自己做处理 183 // 自己发送的消息不会被onReceived:方法实时监听,需要自己做处理
124 - MessageModel *model = [[MessageModel alloc] init];  
125 -  
126 - model.message = _messageSelf;  
127 - CNLiveChatUserInfo *userInfo = [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo;  
128 - model.userId = userInfo.userId;  
129 - model.name = userInfo.name;  
130 - model.portraitUri = userInfo.portraitUri;  
131 - model.type = CNLive_ConversationType_CHATROOM;  
132 - model.messageId = message.messageId;  
133 -  
134 - [_messageArrayM addObject:model];  
135 -  
136 - // 此处更新 UI 应到主线程  
137 - dispatch_async(dispatch_get_main_queue(), ^{ 184 + if ([message isKindOfClass:[CNLiveChatMessage class]]) {
138 185
139 - [self.tableView reloadData]; 186 + CNLiveChatMessage *textMsg = message;
  187 + NSLog(@"文本消息发送成功:%@",textMsg.messageContent);
  188 + MessageModel *model = [[MessageModel alloc] init];
  189 + model.message = textMsg.messageContent;
  190 + model.userId = textMsg.userInfo.userId;
  191 + model.name = textMsg.userInfo.name;
  192 + model.portraitUri = textMsg.userInfo.portraitUri;
  193 + model.type = textMsg.conversationType;
  194 + model.messageId = textMsg.messageId;
  195 + [_messageArrayM addObject:model];
140 196
141 - [self scrollToBottom];  
142 - }); 197 + // 此处更新 UI 应到主线程
  198 + dispatch_async(dispatch_get_main_queue(), ^{
  199 + [self.tableView reloadData];
  200 + [self scrollToBottom];
  201 + });
  202 + }
143 203
144 } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) { 204 } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) {
145 -  
146 - NSLog(@"向:%@发送消息失败,错误代码:%ld,信息ID:%@",targetId,(long)errors,messageId); 205 + NSLog(@"发送文本消息失败,错误代码:%ld",(long)errors);
147 }]; 206 }];
148 207
149 - _messageSelf = textField.text;  
150 textField.text = @""; 208 textField.text = @"";
151 -  
152 return YES; 209 return YES;
153 } 210 }
154 211
155 212
156 #pragma mark - CNLiveChatManagerDelegate !!!!!!!!!!!!!!!!!!!!!!!!!! 213 #pragma mark - CNLiveChatManagerDelegate !!!!!!!!!!!!!!!!!!!!!!!!!!
157 -- (void)onReceived:(CNLiveChatMessage *)message {  
158 -  
159 - NSLog(@"收到消息类型:%lu,消息ID:%@,消息内容:%@,消息发送者信息:%@",(unsigned long)message.conversationType,message.targetId,message.messageContent,message.userInfo); 214 +- (void)onReceived:(id)message {
160 215
161 - if (message.conversationType == CNLive_ConversationType_PRIVATE) { 216 + if ([message isKindOfClass:[CNLiveChatMessage class]]) {
162 217
  218 + CNLiveChatMessage * msg = (CNLiveChatMessage *)message;
  219 +
163 MessageModel *model = [[MessageModel alloc] init]; 220 MessageModel *model = [[MessageModel alloc] init];
  221 + model.message = msg.messageContent;
  222 + model.userId = msg.userInfo.userId;
  223 + model.name = msg.userInfo.name;
  224 + model.portraitUri = msg.userInfo.portraitUri;
  225 + model.type = msg.conversationType;
  226 + [_messageArrayM addObject:model];
164 227
165 - model.message = message.messageContent;  
166 - model.userId = message.userInfo.userId;  
167 - model.name = message.userInfo.name;  
168 - model.portraitUri = message.userInfo.portraitUri;  
169 - model.type = message.conversationType; 228 + } else if ([message isKindOfClass:[CNliveChatImageMessage class]]) {
170 229
  230 + CNliveChatImageMessage * msg = (CNliveChatImageMessage *)message;
  231 +
  232 + MessageModel *model = [[MessageModel alloc] init];
  233 + model.imageUrl = msg.imageUrl;
  234 + model.thumbnailImage = msg.thumbnailImage;
  235 + model.isFull = msg.isFull;
  236 + model.originalImage = msg.originalImage;
  237 + model.extra = msg.extra;
  238 + model.userId = msg.userInfo.userId;
  239 + model.name = msg.userInfo.name;
  240 + model.portraitUri = msg.userInfo.portraitUri;
  241 + model.type = msg.conversationType;
171 [_messageArrayM addObject:model]; 242 [_messageArrayM addObject:model];
172 243
173 - [self.tableView reloadData]; 244 + } else if ([message isKindOfClass:[CNLiveChatVoiceMessage class]]) {
174 245
175 - [self scrollToBottom]; 246 + CNLiveChatVoiceMessage * msg = (CNLiveChatVoiceMessage *)message;
  247 +
  248 + MessageModel *model = [[MessageModel alloc] init];
  249 + model.wavAudioData = msg.wavAudioData;
  250 + model.duration = msg.duration;
  251 + model.extra = msg.extra; // 扩展
  252 + model.targetId = msg.targetId;
  253 + model.userId = msg.userInfo.userId;
  254 + model.name = msg.userInfo.name;
  255 + model.portraitUri = msg.userInfo.portraitUri;
  256 + model.type = msg.conversationType;
  257 + [_messageArrayM addObject:model];
176 } 258 }
  259 + [self.tableView reloadData];
  260 + [self scrollToBottom];
177 } 261 }
178 262
179 - (void)onConnectionStatusChanged:(CNLiveConnectionStatus)status { 263 - (void)onConnectionStatusChanged:(CNLiveConnectionStatus)status {
@@ -183,10 +267,211 @@ static NSString *priCellId = @&quot;priCellId&quot;; @@ -183,10 +267,211 @@ static NSString *priCellId = @&quot;priCellId&quot;;
183 267
184 - (void)kickedByAnotherDevice { 268 - (void)kickedByAnotherDevice {
185 269
  270 + [_messageArrayM removeAllObjects];
186 NSString *userId = [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.userId; 271 NSString *userId = [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo.userId;
187 NSLog(@"账号%@在其他设备登陆",userId); 272 NSLog(@"账号%@在其他设备登陆",userId);
188 } 273 }
189 274
  275 +#pragma mark - 图片 Button Action !!!!!!!!!!!!!!!!!!!!!!!!
  276 +- (void)sendImage {
  277 +
  278 + NSString *path = [[NSBundle mainBundle] pathForResource:@"tu.jpg" ofType:nil];
  279 + CNliveChatImageMessage *imageMsg = [CNliveChatImageMessage messageWithImageURI:path];
  280 +
  281 + [[CNLiveChatManager sharedCNLiveChatManager] sendMediaMessage:CNLive_ConversationType_PRIVATE targetId:privateUserId content:imageMsg progress:^(int progress, NSString *messageId) {
  282 + NSLog(@"发送进度");
  283 + } success:^(CNliveChatImageMessage *message) {
  284 +
  285 + NSLog(@"图片消息发送成功~");
  286 + MessageModel *model = [[MessageModel alloc] init];
  287 + model.imageUrl = message.imageUrl;
  288 + model.thumbnailImage = message.thumbnailImage;
  289 + model.isFull = message.isFull;
  290 + model.originalImage = message.originalImage;
  291 + model.extra = message.extra;
  292 + model.userId = message.userInfo.userId;
  293 + model.name = message.userInfo.name;
  294 + model.portraitUri = message.userInfo.portraitUri;
  295 + model.type = message.conversationType;
  296 + model.messageId = message.messageId;
  297 + [_messageArrayM addObject:model];
  298 +
  299 + // 此处更新 UI 应到主线程
  300 + dispatch_async(dispatch_get_main_queue(), ^{
  301 + [self.tableView reloadData];
  302 + [self scrollToBottom];
  303 + });
  304 +
  305 + } error:^(CNLiveChatErrorCode errorCode, NSString *messageId) {
  306 + NSLog(@"发送图片消息失败,错误码:%ld",(long)errorCode);
  307 + }];
  308 +}
  309 +
  310 +#pragma mark - 语音 Button Action !!!!!!!!!!!!!!!!!!!!!!!!
  311 +- (void)voiceAction {
  312 +
  313 + _isVoice = !_isVoice;
  314 + if (_isVoice) {
  315 + [self.textField removeFromSuperview];
  316 + [self.textViewBackView addSubview:self.voiceSendBtn];
  317 + } else {
  318 + [self.voiceSendBtn removeFromSuperview];
  319 + [self.textViewBackView addSubview:self.textField];
  320 + }
  321 +}
  322 +
  323 +- (void)startRecord {
  324 + NSLog(@"讲话");
  325 +
  326 + [self.recorder prepareToRecord];
  327 +
  328 + [self.recorder record];
  329 +}
  330 +
  331 +- (void)stopRecord {
  332 + NSLog(@"松手");
  333 +
  334 + if (self.recorder.isRecording) {
  335 + self.recordedData =[NSData dataWithContentsOfURL:self.recordTempFileURL];
  336 + self.duration = self.recorder.currentTime;
  337 + [self.recorder stop];
  338 + self.recorder = nil;
  339 + }
  340 +
  341 + if (self.recordedData && self.duration > 1) {
  342 +
  343 + CNLiveChatVoiceMessage *voiceMsg = [CNLiveChatVoiceMessage messageWithAudio:self.recordedData duration:self.duration];
  344 +
  345 + [[CNLiveChatManager sharedCNLiveChatManager] sendMessage:voiceMsg type:CNLive_ConversationType_PRIVATE targetId:privateUserId success:^(id message) {
  346 +
  347 + NSLog(@"语音消息发送成功");
  348 + // 自己发送的消息不会被onReceived:方法实时监听,需要自己做处理
  349 + if ([message isKindOfClass:[CNLiveChatVoiceMessage class]]) {
  350 +
  351 + CNLiveChatVoiceMessage *voiceMsg = message;
  352 + MessageModel *model = [[MessageModel alloc] init];
  353 +
  354 + model.wavAudioData = voiceMsg.wavAudioData;
  355 + model.duration = voiceMsg.duration;
  356 + model.extra = voiceMsg.extra; // 扩展
  357 + model.targetId = voiceMsg.targetId;
  358 + CNLiveChatUserInfo *userInfo = [CNLiveChatManager sharedCNLiveChatManager].currentUserInfo;
  359 + model.userId = userInfo.userId;
  360 + model.name = userInfo.name;
  361 + model.portraitUri = userInfo.portraitUri;
  362 + model.type = CNLive_ConversationType_PRIVATE;
  363 +
  364 + [_messageArrayM addObject:model];
  365 +
  366 + // 此处更新 UI 应到主线程
  367 + dispatch_async(dispatch_get_main_queue(), ^{
  368 +
  369 + [self.tableView reloadData];
  370 +
  371 + [self scrollToBottom];
  372 + });
  373 + }
  374 +
  375 + } error:^(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId) {
  376 + NSLog(@"语音发送失败,错误码:%ld",errors);
  377 + }];
  378 + } else {
  379 + NSLog(@"时间太短,重新录制");
  380 + }
  381 +}
  382 +
  383 +#pragma mark - Get Method !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  384 +- (UIView *)textViewBackView {
  385 + if (!_textViewBackView) {
  386 + _textViewBackView = [[UIView alloc] initWithFrame:CGRectMake(0, KScreenHeight-50, KScreenWidth, 50)];
  387 + _textViewBackView.backgroundColor = [UIColor colorWithRed:(230.0/255.0) green:(230.0/255.0) blue:(230.0/255.0) alpha:1];
  388 + [_textViewBackView addSubview:self.textField];
  389 + [_textViewBackView addSubview:self.voiceButton];
  390 + [_textViewBackView addSubview:self.imgButton];
  391 + }
  392 + return _textViewBackView;
  393 +}
  394 +
  395 +- (UITextField *)textField {
  396 +
  397 + if (!_textField) {
  398 + _textField = [self createTextFieldWithFrame:CGRectMake(43, 5, KScreenWidth - 86, 40) font:20];
  399 + _textField.delegate = self;
  400 + }
  401 + return _textField;
  402 +}
  403 +
  404 +-(UITableView *)tableView {
  405 + if (!_tableView) {
  406 + _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, KScreenWidth, KScreenHeight - 114) style:UITableViewStylePlain];
  407 + _tableView.rowHeight = 30;
  408 + _tableView.delegate = self;
  409 + _tableView.dataSource = self;
  410 + [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:textCellId];
  411 + [_tableView registerClass:[CNLiveVoiceTableViewCell class] forCellReuseIdentifier:voiceCellId];
  412 + [_tableView registerClass:[CNLiveImageTableViewCell class] forCellReuseIdentifier:imageCellId];
  413 + }
  414 + return _tableView;
  415 +}
  416 +
  417 +- (UIButton *)imgButton {
  418 + if (!_imgButton) {
  419 + _imgButton = [UIButton buttonWithType:UIButtonTypeCustom];
  420 + _imgButton.frame = CGRectMake(KScreenWidth - 40, 5, 40, 40);
  421 + [_imgButton setImage:[UIImage imageNamed:@"加号"] forState:UIControlStateNormal];
  422 + [_imgButton addTarget:self action:@selector(sendImage) forControlEvents:UIControlEventTouchUpInside];
  423 + }
  424 + return _imgButton;
  425 +}
  426 +
  427 +- (UIButton *)voiceButton {
  428 + if (!_voiceButton) {
  429 + _voiceButton = [UIButton buttonWithType:UIButtonTypeCustom];
  430 + _voiceButton.frame = CGRectMake(0, 5, 40, 40);
  431 + [_voiceButton setImage:[UIImage imageNamed:@"语音"] forState:UIControlStateNormal];
  432 + [_voiceButton addTarget:self action:@selector(voiceAction) forControlEvents:UIControlEventTouchUpInside];
  433 + }
  434 + return _voiceButton;
  435 +}
  436 +
  437 +- (UIButton *)voiceSendBtn {
  438 + if (!_voiceSendBtn) {
  439 + _voiceSendBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  440 + _voiceSendBtn.frame = CGRectMake(43, 5, KScreenWidth - 86, 40);
  441 + [_voiceSendBtn setTitle:@"按住 说话" forState:UIControlStateNormal];
  442 + [_voiceSendBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  443 + [_voiceSendBtn setTitle:@"松手 发送" forState:UIControlStateHighlighted];
  444 + [_voiceSendBtn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
  445 + _voiceSendBtn.backgroundColor = [UIColor whiteColor];
  446 + [_voiceSendBtn addTarget:self action:@selector(startRecord) forControlEvents:UIControlEventTouchDown];
  447 + [_voiceSendBtn addTarget:self action:@selector(stopRecord) forControlEvents:UIControlEventTouchUpInside];
  448 + }
  449 + return _voiceSendBtn;
  450 +}
  451 +
  452 +- (AVAudioRecorder *)recorder { // 录音
  453 + if (!_recorder) {
  454 + NSDictionary *settings = @{AVFormatIDKey: @(kAudioFormatLinearPCM),
  455 + AVSampleRateKey: @8000.00f,
  456 + AVNumberOfChannelsKey: @1,
  457 + AVLinearPCMBitDepthKey: @16,
  458 + AVLinearPCMIsNonInterleaved: @NO,
  459 + AVLinearPCMIsFloatKey: @NO,
  460 + AVLinearPCMIsBigEndianKey: @NO};
  461 + NSError *error;
  462 + [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
  463 + _recorder = [[AVAudioRecorder alloc] initWithURL:self.recordTempFileURL settings:settings error:&error];
  464 + }
  465 + return _recorder;
  466 +}
  467 +
  468 +- (NSURL *)recordTempFileURL {
  469 + if (!_recordTempFileURL) {
  470 + _recordTempFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: @"tempAC.caf"]];
  471 + }
  472 + return _recordTempFileURL;
  473 +}
  474 +
190 475
191 #pragma mark - 创建文本框 !!!!!!!!!!!!!!!!!!!!!!!!!! 476 #pragma mark - 创建文本框 !!!!!!!!!!!!!!!!!!!!!!!!!!
192 - (UITextField *)createTextFieldWithFrame:(CGRect)frame font:(float)font { 477 - (UITextField *)createTextFieldWithFrame:(CGRect)frame font:(float)font {
@@ -202,33 +487,6 @@ static NSString *priCellId = @&quot;priCellId&quot;; @@ -202,33 +487,6 @@ static NSString *priCellId = @&quot;priCellId&quot;;
202 return textField; 487 return textField;
203 } 488 }
204 489
205 -#pragma mark - 获取私聊最新历史聊天记录 !!!!!!!!!!!!!!!!!!!!!!!!  
206 -- (void)getPrivateChattingRecords {  
207 -  
208 - // 获取最新消息  
209 - NSArray *messageArray = [[CNLiveChatManager sharedCNLiveChatManager] getLatestMessages:CNLive_ConversationType_PRIVATE targetId:@"70_20170315" count:100];  
210 -  
211 - for (CNLiveChatMessage *message in messageArray) {  
212 -  
213 - MessageModel *model = [[MessageModel alloc] init];  
214 -  
215 - model.message = message.messageContent;  
216 - model.userId = message.userInfo.userId;  
217 - model.name = message.userInfo.name;  
218 - model.portraitUri = message.userInfo.portraitUri;  
219 - model.type = message.conversationType;  
220 -  
221 - if (![_messageArrayM containsObject:model]) {  
222 -  
223 - [_messageArrayM insertObject:model atIndex:0];  
224 - }  
225 -  
226 - [self.tableView reloadData];  
227 -  
228 - [self scrollToBottom];  
229 - }  
230 -}  
231 -  
232 #pragma mark - tableView 滚到最后一行 !!!!!!!!!!!!!!!!!!!!!!!!!! 490 #pragma mark - tableView 滚到最后一行 !!!!!!!!!!!!!!!!!!!!!!!!!!
233 - (void)scrollToBottom { 491 - (void)scrollToBottom {
234 492
@@ -239,6 +497,72 @@ static NSString *priCellId = @&quot;priCellId&quot;; @@ -239,6 +497,72 @@ static NSString *priCellId = @&quot;priCellId&quot;;
239 } 497 }
240 } 498 }
241 499
  500 +- (void)addNotification {
  501 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
  502 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
  503 +}
  504 +
  505 +#pragma mark <KeyboardNotificationAction> !!!!!!!!!!!!!!!!!!!!!!!!!!!
  506 +- (void)keyboardWillShow:(NSNotification *)notification {
  507 +
  508 + CGRect keyboardRect = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
  509 + UIViewAnimationCurve curve = [[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
  510 + double duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  511 +
  512 + UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0,0.0,keyboardRect.size.height,0.0);
  513 + _tableView.contentInset = contentInsets;
  514 + [self scrollToBottom];
  515 +
  516 + [UIView animateWithDuration:duration
  517 + delay:0.0f
  518 + options:[self animationOptionsForCurve:curve]
  519 + animations:^{
  520 +
  521 + CGRect inputViewFrame = self.textViewBackView.frame;
  522 + if (keyboardRect.origin.y == KScreenHeight) {
  523 + self.textViewBackView.frame = CGRectMake(inputViewFrame.origin.x,
  524 + self.view.frame.size.height-(inputViewFrame.size.height),
  525 + inputViewFrame.size.width,
  526 + inputViewFrame.size.height);
  527 + } else {
  528 +
  529 + self.textViewBackView.frame = CGRectMake(inputViewFrame.origin.x,
  530 + self.view.frame.size.height-keyboardRect.size.height-_textViewBackView.frame.size.height,
  531 + inputViewFrame.size.width,
  532 + inputViewFrame.size.height);
  533 +
  534 + }
  535 + }
  536 + completion:^(BOOL finished) {
  537 + }];
  538 +}
  539 +
  540 +- (void)keyboardWillHide:(NSNotification *)notification
  541 +{
  542 + [self.textViewBackView setFrame:CGRectMake(0, KScreenHeight-50, KScreenWidth, self.textViewBackView.frame.size.height)];
  543 + _tableView.contentInset = UIEdgeInsetsZero;
  544 +}
  545 +
  546 +- (UIViewAnimationOptions)animationOptionsForCurve:(UIViewAnimationCurve)curve
  547 +{
  548 + switch (curve) {
  549 + case UIViewAnimationCurveEaseInOut:
  550 + return UIViewAnimationOptionCurveEaseInOut;
  551 + break;
  552 + case UIViewAnimationCurveEaseIn:
  553 + return UIViewAnimationOptionCurveEaseIn;
  554 + break;
  555 + case UIViewAnimationCurveEaseOut:
  556 + return UIViewAnimationOptionCurveEaseOut;
  557 + break;
  558 + case UIViewAnimationCurveLinear:
  559 + return UIViewAnimationOptionCurveLinear;
  560 + break;
  561 + }
  562 +
  563 + return kNilOptions;
  564 +}
  565 +
242 #pragma mark - 隐藏键盘 !!!!!!!!!!!!!!!!!!!!!!! 566 #pragma mark - 隐藏键盘 !!!!!!!!!!!!!!!!!!!!!!!
243 - (void)hideKeyboard { 567 - (void)hideKeyboard {
244 568
@@ -250,6 +574,4 @@ static NSString *priCellId = @&quot;priCellId&quot;; @@ -250,6 +574,4 @@ static NSString *priCellId = @&quot;priCellId&quot;;
250 // Dispose of any resources that can be recreated. 574 // Dispose of any resources that can be recreated.
251 } 575 }
252 576
253 -  
254 -  
255 @end 577 @end
CNLiveChatSDKDemo/CNLiveChatSDKDemo/tu.jpg 0 → 100644

38.5 KB