Commit 466297be1f555b887c38b130353068dc1e1a003b
Merge branch 'master' of bj.gitlab.cnlive.com:ios-team/LiveVideoCloud
Showing
22 changed files
with
1486 additions
and
51 deletions
LiveVideoCloud/LiveVideoCloud.xcodeproj/project.pbxproj
| @@ -22,8 +22,6 @@ | @@ -22,8 +22,6 @@ | ||
| 22 | 810B650A1E77B39D00133E15 /* LVCFullScreenPlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */; }; | 22 | 810B650A1E77B39D00133E15 /* LVCFullScreenPlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */; }; |
| 23 | 8112D4311E7927A5002E00F6 /* LVCPlayerLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */; }; | 23 | 8112D4311E7927A5002E00F6 /* LVCPlayerLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */; }; |
| 24 | 812E50531E7699DC004F5FCD /* CNLivePlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */; }; | 24 | 812E50531E7699DC004F5FCD /* CNLivePlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */; }; |
| 25 | - 812E50551E7699E9004F5FCD /* CNLiveMsgTools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 812E504F1E7699DC004F5FCD /* CNLiveMsgTools.framework */; }; | ||
| 26 | - 812E50561E7699E9004F5FCD /* CNLiveMsgTools.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 812E504F1E7699DC004F5FCD /* CNLiveMsgTools.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | ||
| 27 | 812E50581E7699E9004F5FCD /* CNLivePlayerSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | 25 | 812E50581E7699E9004F5FCD /* CNLivePlayerSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; |
| 28 | 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */; }; | 26 | 81FB5B3C1E7A6FFC00F98E1D /* SevenSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */; }; |
| 29 | D2029B861E6EAAA50027CD92 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B851E6EAAA50027CD92 /* main.m */; }; | 27 | D2029B861E6EAAA50027CD92 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D2029B851E6EAAA50027CD92 /* main.m */; }; |
| @@ -153,6 +151,19 @@ | @@ -153,6 +151,19 @@ | ||
| 153 | D25BF87A1E7B8A82007FB138 /* FilterFunctionView.m in Sources */ = {isa = PBXBuildFile; fileRef = D25BF8771E7B8A82007FB138 /* FilterFunctionView.m */; }; | 151 | D25BF87A1E7B8A82007FB138 /* FilterFunctionView.m in Sources */ = {isa = PBXBuildFile; fileRef = D25BF8771E7B8A82007FB138 /* FilterFunctionView.m */; }; |
| 154 | D25BF87B1E7B8A82007FB138 /* SliderView.m in Sources */ = {isa = PBXBuildFile; fileRef = D25BF8791E7B8A82007FB138 /* SliderView.m */; }; | 152 | D25BF87B1E7B8A82007FB138 /* SliderView.m in Sources */ = {isa = PBXBuildFile; fileRef = D25BF8791E7B8A82007FB138 /* SliderView.m */; }; |
| 155 | D25BF87D1E7B8C78007FB138 /* KSYGPUResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D25BF87C1E7B8C78007FB138 /* KSYGPUResource.bundle */; }; | 153 | D25BF87D1E7B8C78007FB138 /* KSYGPUResource.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D25BF87C1E7B8C78007FB138 /* KSYGPUResource.bundle */; }; |
| 154 | + D25BF8801E7BD266007FB138 /* LVCUGCLivePlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = D25BF87F1E7BD266007FB138 /* LVCUGCLivePlayerController.m */; }; | ||
| 155 | + D25BF8831E7F775F007FB138 /* LVCUGCPlayerLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = D25BF8821E7F775F007FB138 /* LVCUGCPlayerLoadingView.m */; }; | ||
| 156 | + D25BF8901E7F7F8F007FB138 /* UGCLoading.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = D25BF88F1E7F7F8F007FB138 /* UGCLoading.jpeg */; }; | ||
| 157 | + D25BF8931E7FBAEA007FB138 /* LVCUGCBackgroundView.m in Sources */ = {isa = PBXBuildFile; fileRef = D25BF8921E7FBAEA007FB138 /* LVCUGCBackgroundView.m */; }; | ||
| 158 | + D25BF8971E7FE01B007FB138 /* CNLiveMsgTools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25BF8961E7FE01B007FB138 /* CNLiveMsgTools.framework */; }; | ||
| 159 | + D25BF8991E7FE033007FB138 /* CNLiveChatManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25BF8981E7FE033007FB138 /* CNLiveChatManager.framework */; }; | ||
| 160 | + D25BF89A1E7FE046007FB138 /* CNLiveChatManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25BF8981E7FE033007FB138 /* CNLiveChatManager.framework */; }; | ||
| 161 | + D25BF89B1E7FE046007FB138 /* CNLiveChatManager.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D25BF8981E7FE033007FB138 /* CNLiveChatManager.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | ||
| 162 | + D25BF89C1E7FE049007FB138 /* CNLiveMsgTools.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25BF8961E7FE01B007FB138 /* CNLiveMsgTools.framework */; }; | ||
| 163 | + D25BF89D1E7FE049007FB138 /* CNLiveMsgTools.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D25BF8961E7FE01B007FB138 /* CNLiveMsgTools.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | ||
| 164 | + D25BF8A01E80C4BD007FB138 /* UIImage+LVCVagueImage.m in Sources */ = {isa = PBXBuildFile; fileRef = D25BF89F1E80C4BD007FB138 /* UIImage+LVCVagueImage.m */; }; | ||
| 165 | + D25BF8A31E80C4FC007FB138 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D25BF8A21E80C4FC007FB138 /* Accelerate.framework */; }; | ||
| 166 | + D25BF8A51E80EC76007FB138 /* 头像.jpg in Resources */ = {isa = PBXBuildFile; fileRef = D25BF8A41E80EC76007FB138 /* 头像.jpg */; }; | ||
| 156 | D2888D941E6EB8B4003A77C8 /* LVCTabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = D2888D931E6EB8B4003A77C8 /* LVCTabBar.m */; }; | 167 | D2888D941E6EB8B4003A77C8 /* LVCTabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = D2888D931E6EB8B4003A77C8 /* LVCTabBar.m */; }; |
| 157 | D2888D9E1E6EBF1B003A77C8 /* LVCLiveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2888D9B1E6EBF1B003A77C8 /* LVCLiveViewController.m */; }; | 168 | D2888D9E1E6EBF1B003A77C8 /* LVCLiveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2888D9B1E6EBF1B003A77C8 /* LVCLiveViewController.m */; }; |
| 158 | D2888DB11E6EC05F003A77C8 /* TempViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2888DB01E6EC05F003A77C8 /* TempViewController.m */; }; | 169 | D2888DB11E6EC05F003A77C8 /* TempViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D2888DB01E6EC05F003A77C8 /* TempViewController.m */; }; |
| @@ -185,8 +196,9 @@ | @@ -185,8 +196,9 @@ | ||
| 185 | dstPath = ""; | 196 | dstPath = ""; |
| 186 | dstSubfolderSpec = 10; | 197 | dstSubfolderSpec = 10; |
| 187 | files = ( | 198 | files = ( |
| 188 | - 812E50561E7699E9004F5FCD /* CNLiveMsgTools.framework in Embed Frameworks */, | ||
| 189 | 812E50581E7699E9004F5FCD /* CNLivePlayerSDK.framework in Embed Frameworks */, | 199 | 812E50581E7699E9004F5FCD /* CNLivePlayerSDK.framework in Embed Frameworks */, |
| 200 | + D25BF89B1E7FE046007FB138 /* CNLiveChatManager.framework in Embed Frameworks */, | ||
| 201 | + D25BF89D1E7FE049007FB138 /* CNLiveMsgTools.framework in Embed Frameworks */, | ||
| 190 | ); | 202 | ); |
| 191 | name = "Embed Frameworks"; | 203 | name = "Embed Frameworks"; |
| 192 | runOnlyForDeploymentPostprocessing = 0; | 204 | runOnlyForDeploymentPostprocessing = 0; |
| @@ -227,7 +239,6 @@ | @@ -227,7 +239,6 @@ | ||
| 227 | 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCFullScreenPlayerController.m; sourceTree = "<group>"; }; | 239 | 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCFullScreenPlayerController.m; sourceTree = "<group>"; }; |
| 228 | 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCPlayerLoadingView.h; sourceTree = "<group>"; }; | 240 | 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCPlayerLoadingView.h; sourceTree = "<group>"; }; |
| 229 | 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCPlayerLoadingView.m; sourceTree = "<group>"; }; | 241 | 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCPlayerLoadingView.m; sourceTree = "<group>"; }; |
| 230 | - 812E504F1E7699DC004F5FCD /* CNLiveMsgTools.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveMsgTools.framework; sourceTree = "<group>"; }; | ||
| 231 | 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLivePlayerSDK.framework; sourceTree = "<group>"; }; | 242 | 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLivePlayerSDK.framework; sourceTree = "<group>"; }; |
| 232 | 81FB5B3A1E7A6FFC00F98E1D /* SevenSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SevenSwitch.h; sourceTree = "<group>"; }; | 243 | 81FB5B3A1E7A6FFC00F98E1D /* SevenSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SevenSwitch.h; sourceTree = "<group>"; }; |
| 233 | 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SevenSwitch.m; sourceTree = "<group>"; }; | 244 | 81FB5B3B1E7A6FFC00F98E1D /* SevenSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SevenSwitch.m; sourceTree = "<group>"; }; |
| @@ -499,6 +510,19 @@ | @@ -499,6 +510,19 @@ | ||
| 499 | D25BF8781E7B8A82007FB138 /* SliderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SliderView.h; sourceTree = "<group>"; }; | 510 | D25BF8781E7B8A82007FB138 /* SliderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SliderView.h; sourceTree = "<group>"; }; |
| 500 | D25BF8791E7B8A82007FB138 /* SliderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SliderView.m; sourceTree = "<group>"; }; | 511 | D25BF8791E7B8A82007FB138 /* SliderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SliderView.m; sourceTree = "<group>"; }; |
| 501 | D25BF87C1E7B8C78007FB138 /* KSYGPUResource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = KSYGPUResource.bundle; sourceTree = "<group>"; }; | 512 | D25BF87C1E7B8C78007FB138 /* KSYGPUResource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = KSYGPUResource.bundle; sourceTree = "<group>"; }; |
| 513 | + D25BF87E1E7BD266007FB138 /* LVCUGCLivePlayerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCUGCLivePlayerController.h; sourceTree = "<group>"; }; | ||
| 514 | + D25BF87F1E7BD266007FB138 /* LVCUGCLivePlayerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCUGCLivePlayerController.m; sourceTree = "<group>"; }; | ||
| 515 | + D25BF8811E7F775F007FB138 /* LVCUGCPlayerLoadingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCUGCPlayerLoadingView.h; sourceTree = "<group>"; }; | ||
| 516 | + D25BF8821E7F775F007FB138 /* LVCUGCPlayerLoadingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCUGCPlayerLoadingView.m; sourceTree = "<group>"; }; | ||
| 517 | + D25BF88F1E7F7F8F007FB138 /* UGCLoading.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = UGCLoading.jpeg; sourceTree = "<group>"; }; | ||
| 518 | + D25BF8911E7FBAEA007FB138 /* LVCUGCBackgroundView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCUGCBackgroundView.h; sourceTree = "<group>"; }; | ||
| 519 | + D25BF8921E7FBAEA007FB138 /* LVCUGCBackgroundView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCUGCBackgroundView.m; sourceTree = "<group>"; }; | ||
| 520 | + D25BF8961E7FE01B007FB138 /* CNLiveMsgTools.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveMsgTools.framework; sourceTree = "<group>"; }; | ||
| 521 | + D25BF8981E7FE033007FB138 /* CNLiveChatManager.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CNLiveChatManager.framework; sourceTree = "<group>"; }; | ||
| 522 | + D25BF89E1E80C4BD007FB138 /* UIImage+LVCVagueImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+LVCVagueImage.h"; sourceTree = "<group>"; }; | ||
| 523 | + D25BF89F1E80C4BD007FB138 /* UIImage+LVCVagueImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+LVCVagueImage.m"; sourceTree = "<group>"; }; | ||
| 524 | + D25BF8A21E80C4FC007FB138 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; | ||
| 525 | + D25BF8A41E80EC76007FB138 /* 头像.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "头像.jpg"; sourceTree = "<group>"; }; | ||
| 502 | D2888D921E6EB8B4003A77C8 /* LVCTabBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCTabBar.h; sourceTree = "<group>"; }; | 526 | D2888D921E6EB8B4003A77C8 /* LVCTabBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCTabBar.h; sourceTree = "<group>"; }; |
| 503 | D2888D931E6EB8B4003A77C8 /* LVCTabBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCTabBar.m; sourceTree = "<group>"; }; | 527 | D2888D931E6EB8B4003A77C8 /* LVCTabBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LVCTabBar.m; sourceTree = "<group>"; }; |
| 504 | D2888D9A1E6EBF1B003A77C8 /* LVCLiveViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCLiveViewController.h; sourceTree = "<group>"; }; | 528 | D2888D9A1E6EBF1B003A77C8 /* LVCLiveViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LVCLiveViewController.h; sourceTree = "<group>"; }; |
| @@ -518,9 +542,13 @@ | @@ -518,9 +542,13 @@ | ||
| 518 | isa = PBXFrameworksBuildPhase; | 542 | isa = PBXFrameworksBuildPhase; |
| 519 | buildActionMask = 2147483647; | 543 | buildActionMask = 2147483647; |
| 520 | files = ( | 544 | files = ( |
| 545 | + D25BF8A31E80C4FC007FB138 /* Accelerate.framework in Frameworks */, | ||
| 521 | D2575C7D1E76A4F300E3A8FC /* NHGiftAnimtionSDK.a in Frameworks */, | 546 | D2575C7D1E76A4F300E3A8FC /* NHGiftAnimtionSDK.a in Frameworks */, |
| 522 | 812E50531E7699DC004F5FCD /* CNLivePlayerSDK.framework in Frameworks */, | 547 | 812E50531E7699DC004F5FCD /* CNLivePlayerSDK.framework in Frameworks */, |
| 523 | - 812E50551E7699E9004F5FCD /* CNLiveMsgTools.framework in Frameworks */, | 548 | + D25BF89A1E7FE046007FB138 /* CNLiveChatManager.framework in Frameworks */, |
| 549 | + D25BF8971E7FE01B007FB138 /* CNLiveMsgTools.framework in Frameworks */, | ||
| 550 | + D25BF8991E7FE033007FB138 /* CNLiveChatManager.framework in Frameworks */, | ||
| 551 | + D25BF89C1E7FE049007FB138 /* CNLiveMsgTools.framework in Frameworks */, | ||
| 524 | ); | 552 | ); |
| 525 | runOnlyForDeploymentPostprocessing = 0; | 553 | runOnlyForDeploymentPostprocessing = 0; |
| 526 | }; | 554 | }; |
| @@ -584,8 +612,9 @@ | @@ -584,8 +612,9 @@ | ||
| 584 | 812E504E1E7699B9004F5FCD /* CNLiveSDK */ = { | 612 | 812E504E1E7699B9004F5FCD /* CNLiveSDK */ = { |
| 585 | isa = PBXGroup; | 613 | isa = PBXGroup; |
| 586 | children = ( | 614 | children = ( |
| 615 | + D25BF8981E7FE033007FB138 /* CNLiveChatManager.framework */, | ||
| 616 | + D25BF8961E7FE01B007FB138 /* CNLiveMsgTools.framework */, | ||
| 587 | D25BF87C1E7B8C78007FB138 /* KSYGPUResource.bundle */, | 617 | D25BF87C1E7B8C78007FB138 /* KSYGPUResource.bundle */, |
| 588 | - 812E504F1E7699DC004F5FCD /* CNLiveMsgTools.framework */, | ||
| 589 | 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */, | 618 | 812E50501E7699DC004F5FCD /* CNLivePlayerSDK.framework */, |
| 590 | ); | 619 | ); |
| 591 | path = CNLiveSDK; | 620 | path = CNLiveSDK; |
| @@ -607,6 +636,7 @@ | @@ -607,6 +636,7 @@ | ||
| 607 | D2029B9D1E6EAAA50027CD92 /* LiveVideoCloudTests */, | 636 | D2029B9D1E6EAAA50027CD92 /* LiveVideoCloudTests */, |
| 608 | D2029BA81E6EAAA50027CD92 /* LiveVideoCloudUITests */, | 637 | D2029BA81E6EAAA50027CD92 /* LiveVideoCloudUITests */, |
| 609 | D2029B821E6EAAA50027CD92 /* Products */, | 638 | D2029B821E6EAAA50027CD92 /* Products */, |
| 639 | + D25BF8A11E80C4FC007FB138 /* Frameworks */, | ||
| 610 | ); | 640 | ); |
| 611 | sourceTree = "<group>"; | 641 | sourceTree = "<group>"; |
| 612 | }; | 642 | }; |
| @@ -628,7 +658,7 @@ | @@ -628,7 +658,7 @@ | ||
| 628 | D2029CDC1E6EAE2E0027CD92 /* UtilKits */, | 658 | D2029CDC1E6EAE2E0027CD92 /* UtilKits */, |
| 629 | D2029BD01E6EADE10027CD92 /* Classes */, | 659 | D2029BD01E6EADE10027CD92 /* Classes */, |
| 630 | D2029CD11E6EADE70027CD92 /* HttpService */, | 660 | D2029CD11E6EADE70027CD92 /* HttpService */, |
| 631 | - D2029CD71E6EAE140027CD92 /* Resource */, | 661 | + D25BF88A1E7F7F77007FB138 /* Resource */, |
| 632 | D2029B901E6EAAA50027CD92 /* animation.xcassets */, | 662 | D2029B901E6EAAA50027CD92 /* animation.xcassets */, |
| 633 | D2029CD61E6EADFB0027CD92 /* PrefixHeader.pch */, | 663 | D2029CD61E6EADFB0027CD92 /* PrefixHeader.pch */, |
| 634 | D2029B841E6EAAA50027CD92 /* Supporting Files */, | 664 | D2029B841E6EAAA50027CD92 /* Supporting Files */, |
| @@ -1082,45 +1112,6 @@ | @@ -1082,45 +1112,6 @@ | ||
| 1082 | path = HttpService; | 1112 | path = HttpService; |
| 1083 | sourceTree = "<group>"; | 1113 | sourceTree = "<group>"; |
| 1084 | }; | 1114 | }; |
| 1085 | - D2029CD71E6EAE140027CD92 /* Resource */ = { | ||
| 1086 | - isa = PBXGroup; | ||
| 1087 | - children = ( | ||
| 1088 | - D2029CD81E6EAE140027CD92 /* Fonts */, | ||
| 1089 | - D2029CD91E6EAE140027CD92 /* Images */, | ||
| 1090 | - D2029CDA1E6EAE140027CD92 /* Sound */, | ||
| 1091 | - D2029CDB1E6EAE140027CD92 /* Videos */, | ||
| 1092 | - ); | ||
| 1093 | - path = Resource; | ||
| 1094 | - sourceTree = "<group>"; | ||
| 1095 | - }; | ||
| 1096 | - D2029CD81E6EAE140027CD92 /* Fonts */ = { | ||
| 1097 | - isa = PBXGroup; | ||
| 1098 | - children = ( | ||
| 1099 | - ); | ||
| 1100 | - path = Fonts; | ||
| 1101 | - sourceTree = "<group>"; | ||
| 1102 | - }; | ||
| 1103 | - D2029CD91E6EAE140027CD92 /* Images */ = { | ||
| 1104 | - isa = PBXGroup; | ||
| 1105 | - children = ( | ||
| 1106 | - ); | ||
| 1107 | - path = Images; | ||
| 1108 | - sourceTree = "<group>"; | ||
| 1109 | - }; | ||
| 1110 | - D2029CDA1E6EAE140027CD92 /* Sound */ = { | ||
| 1111 | - isa = PBXGroup; | ||
| 1112 | - children = ( | ||
| 1113 | - ); | ||
| 1114 | - path = Sound; | ||
| 1115 | - sourceTree = "<group>"; | ||
| 1116 | - }; | ||
| 1117 | - D2029CDB1E6EAE140027CD92 /* Videos */ = { | ||
| 1118 | - isa = PBXGroup; | ||
| 1119 | - children = ( | ||
| 1120 | - ); | ||
| 1121 | - path = Videos; | ||
| 1122 | - sourceTree = "<group>"; | ||
| 1123 | - }; | ||
| 1124 | D2029CDC1E6EAE2E0027CD92 /* UtilKits */ = { | 1115 | D2029CDC1E6EAE2E0027CD92 /* UtilKits */ = { |
| 1125 | isa = PBXGroup; | 1116 | isa = PBXGroup; |
| 1126 | children = ( | 1117 | children = ( |
| @@ -1152,6 +1143,8 @@ | @@ -1152,6 +1143,8 @@ | ||
| 1152 | D2029CE91E6EAE2E0027CD92 /* UILabel+labelFitSize.m */, | 1143 | D2029CE91E6EAE2E0027CD92 /* UILabel+labelFitSize.m */, |
| 1153 | D2029CEA1E6EAE2E0027CD92 /* UIView+Extension.h */, | 1144 | D2029CEA1E6EAE2E0027CD92 /* UIView+Extension.h */, |
| 1154 | D2029CEB1E6EAE2E0027CD92 /* UIView+Extension.m */, | 1145 | D2029CEB1E6EAE2E0027CD92 /* UIView+Extension.m */, |
| 1146 | + D25BF89E1E80C4BD007FB138 /* UIImage+LVCVagueImage.h */, | ||
| 1147 | + D25BF89F1E80C4BD007FB138 /* UIImage+LVCVagueImage.m */, | ||
| 1155 | ); | 1148 | ); |
| 1156 | path = Category; | 1149 | path = Category; |
| 1157 | sourceTree = "<group>"; | 1150 | sourceTree = "<group>"; |
| @@ -1389,6 +1382,55 @@ | @@ -1389,6 +1382,55 @@ | ||
| 1389 | path = View; | 1382 | path = View; |
| 1390 | sourceTree = "<group>"; | 1383 | sourceTree = "<group>"; |
| 1391 | }; | 1384 | }; |
| 1385 | + D25BF88A1E7F7F77007FB138 /* Resource */ = { | ||
| 1386 | + isa = PBXGroup; | ||
| 1387 | + children = ( | ||
| 1388 | + D25BF88C1E7F7F77007FB138 /* Images */, | ||
| 1389 | + D25BF88B1E7F7F77007FB138 /* Fonts */, | ||
| 1390 | + D25BF88D1E7F7F77007FB138 /* Sound */, | ||
| 1391 | + D25BF88E1E7F7F77007FB138 /* Videos */, | ||
| 1392 | + ); | ||
| 1393 | + path = Resource; | ||
| 1394 | + sourceTree = "<group>"; | ||
| 1395 | + }; | ||
| 1396 | + D25BF88B1E7F7F77007FB138 /* Fonts */ = { | ||
| 1397 | + isa = PBXGroup; | ||
| 1398 | + children = ( | ||
| 1399 | + ); | ||
| 1400 | + path = Fonts; | ||
| 1401 | + sourceTree = "<group>"; | ||
| 1402 | + }; | ||
| 1403 | + D25BF88C1E7F7F77007FB138 /* Images */ = { | ||
| 1404 | + isa = PBXGroup; | ||
| 1405 | + children = ( | ||
| 1406 | + D25BF88F1E7F7F8F007FB138 /* UGCLoading.jpeg */, | ||
| 1407 | + D25BF8A41E80EC76007FB138 /* 头像.jpg */, | ||
| 1408 | + ); | ||
| 1409 | + path = Images; | ||
| 1410 | + sourceTree = "<group>"; | ||
| 1411 | + }; | ||
| 1412 | + D25BF88D1E7F7F77007FB138 /* Sound */ = { | ||
| 1413 | + isa = PBXGroup; | ||
| 1414 | + children = ( | ||
| 1415 | + ); | ||
| 1416 | + path = Sound; | ||
| 1417 | + sourceTree = "<group>"; | ||
| 1418 | + }; | ||
| 1419 | + D25BF88E1E7F7F77007FB138 /* Videos */ = { | ||
| 1420 | + isa = PBXGroup; | ||
| 1421 | + children = ( | ||
| 1422 | + ); | ||
| 1423 | + path = Videos; | ||
| 1424 | + sourceTree = "<group>"; | ||
| 1425 | + }; | ||
| 1426 | + D25BF8A11E80C4FC007FB138 /* Frameworks */ = { | ||
| 1427 | + isa = PBXGroup; | ||
| 1428 | + children = ( | ||
| 1429 | + D25BF8A21E80C4FC007FB138 /* Accelerate.framework */, | ||
| 1430 | + ); | ||
| 1431 | + name = Frameworks; | ||
| 1432 | + sourceTree = "<group>"; | ||
| 1433 | + }; | ||
| 1392 | D2888D911E6EB897003A77C8 /* View */ = { | 1434 | D2888D911E6EB897003A77C8 /* View */ = { |
| 1393 | isa = PBXGroup; | 1435 | isa = PBXGroup; |
| 1394 | children = ( | 1436 | children = ( |
| @@ -1436,6 +1478,8 @@ | @@ -1436,6 +1478,8 @@ | ||
| 1436 | 810B64E21E779AFE00133E15 /* LVCLivePlayerController.m */, | 1478 | 810B64E21E779AFE00133E15 /* LVCLivePlayerController.m */, |
| 1437 | 810B65081E77B39D00133E15 /* LVCFullScreenPlayerController.h */, | 1479 | 810B65081E77B39D00133E15 /* LVCFullScreenPlayerController.h */, |
| 1438 | 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */, | 1480 | 810B65091E77B39D00133E15 /* LVCFullScreenPlayerController.m */, |
| 1481 | + D25BF87E1E7BD266007FB138 /* LVCUGCLivePlayerController.h */, | ||
| 1482 | + D25BF87F1E7BD266007FB138 /* LVCUGCLivePlayerController.m */, | ||
| 1439 | ); | 1483 | ); |
| 1440 | path = Controller; | 1484 | path = Controller; |
| 1441 | sourceTree = "<group>"; | 1485 | sourceTree = "<group>"; |
| @@ -1454,6 +1498,10 @@ | @@ -1454,6 +1498,10 @@ | ||
| 1454 | 810B64DF1E779AE900133E15 /* LVCPlayer.m */, | 1498 | 810B64DF1E779AE900133E15 /* LVCPlayer.m */, |
| 1455 | 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */, | 1499 | 8112D42F1E7927A5002E00F6 /* LVCPlayerLoadingView.h */, |
| 1456 | 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */, | 1500 | 8112D4301E7927A5002E00F6 /* LVCPlayerLoadingView.m */, |
| 1501 | + D25BF8811E7F775F007FB138 /* LVCUGCPlayerLoadingView.h */, | ||
| 1502 | + D25BF8821E7F775F007FB138 /* LVCUGCPlayerLoadingView.m */, | ||
| 1503 | + D25BF8911E7FBAEA007FB138 /* LVCUGCBackgroundView.h */, | ||
| 1504 | + D25BF8921E7FBAEA007FB138 /* LVCUGCBackgroundView.m */, | ||
| 1457 | ); | 1505 | ); |
| 1458 | path = View; | 1506 | path = View; |
| 1459 | sourceTree = "<group>"; | 1507 | sourceTree = "<group>"; |
| @@ -1603,6 +1651,8 @@ | @@ -1603,6 +1651,8 @@ | ||
| 1603 | D2029C971E6EADE10027CD92 /* Info.plist in Resources */, | 1651 | D2029C971E6EADE10027CD92 /* Info.plist in Resources */, |
| 1604 | D2575C7F1E76A4F300E3A8FC /* NHPlaneViews.xib in Resources */, | 1652 | D2575C7F1E76A4F300E3A8FC /* NHPlaneViews.xib in Resources */, |
| 1605 | D2575C7B1E76A4F300E3A8FC /* NHCarViews.xib in Resources */, | 1653 | D2575C7B1E76A4F300E3A8FC /* NHCarViews.xib in Resources */, |
| 1654 | + D25BF8901E7F7F8F007FB138 /* UGCLoading.jpeg in Resources */, | ||
| 1655 | + D25BF8A51E80EC76007FB138 /* 头像.jpg in Resources */, | ||
| 1606 | D2029CC91E6EADE10027CD92 /* SVProgressHUD.bundle in Resources */, | 1656 | D2029CC91E6EADE10027CD92 /* SVProgressHUD.bundle in Resources */, |
| 1607 | D2575C801E76A4F300E3A8FC /* resource.bundle in Resources */, | 1657 | D2575C801E76A4F300E3A8FC /* resource.bundle in Resources */, |
| 1608 | D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */, | 1658 | D2029B941E6EAAA50027CD92 /* LaunchScreen.storyboard in Resources */, |
| @@ -1637,6 +1687,7 @@ | @@ -1637,6 +1687,7 @@ | ||
| 1637 | D2029CC31E6EADE10027CD92 /* UIImageView+HighlightedWebCache.m in Sources */, | 1687 | D2029CC31E6EADE10027CD92 /* UIImageView+HighlightedWebCache.m in Sources */, |
| 1638 | D22830FF1E77C69E00627701 /* GiftListView.m in Sources */, | 1688 | D22830FF1E77C69E00627701 /* GiftListView.m in Sources */, |
| 1639 | D2029CC01E6EADE10027CD92 /* UIImage+GIF.m in Sources */, | 1689 | D2029CC01E6EADE10027CD92 /* UIImage+GIF.m in Sources */, |
| 1690 | + D25BF8831E7F775F007FB138 /* LVCUGCPlayerLoadingView.m in Sources */, | ||
| 1640 | D2029BCF1E6EADD70027CD92 /* ZXTabBarController.m in Sources */, | 1691 | D2029BCF1E6EADD70027CD92 /* ZXTabBarController.m in Sources */, |
| 1641 | D2029D071E6EAE2E0027CD92 /* ZXConst.m in Sources */, | 1692 | D2029D071E6EAE2E0027CD92 /* ZXConst.m in Sources */, |
| 1642 | D2029CB81E6EADE10027CD92 /* SDImageCache.m in Sources */, | 1693 | D2029CB81E6EADE10027CD92 /* SDImageCache.m in Sources */, |
| @@ -1644,6 +1695,7 @@ | @@ -1644,6 +1695,7 @@ | ||
| 1644 | D2029CA71E6EADE10027CD92 /* MJRefreshAutoGifFooter.m in Sources */, | 1695 | D2029CA71E6EADE10027CD92 /* MJRefreshAutoGifFooter.m in Sources */, |
| 1645 | D2029CC11E6EADE10027CD92 /* UIImage+MultiFormat.m in Sources */, | 1696 | D2029CC11E6EADE10027CD92 /* UIImage+MultiFormat.m in Sources */, |
| 1646 | D2029C861E6EADE10027CD92 /* Tools.m in Sources */, | 1697 | D2029C861E6EADE10027CD92 /* Tools.m in Sources */, |
| 1698 | + D25BF8931E7FBAEA007FB138 /* LVCUGCBackgroundView.m in Sources */, | ||
| 1647 | D2029CA01E6EADE10027CD92 /* NSObject+MJProperty.m in Sources */, | 1699 | D2029CA01E6EADE10027CD92 /* NSObject+MJProperty.m in Sources */, |
| 1648 | D2029CB51E6EADE10027CD92 /* SDiOSVersion.m in Sources */, | 1700 | D2029CB51E6EADE10027CD92 /* SDiOSVersion.m in Sources */, |
| 1649 | D2029C9C1E6EADE10027CD92 /* MJPropertyType.m in Sources */, | 1701 | D2029C9C1E6EADE10027CD92 /* MJPropertyType.m in Sources */, |
| @@ -1719,6 +1771,7 @@ | @@ -1719,6 +1771,7 @@ | ||
| 1719 | D2029B861E6EAAA50027CD92 /* main.m in Sources */, | 1771 | D2029B861E6EAAA50027CD92 /* main.m in Sources */, |
| 1720 | D2029C8C1E6EADE10027CD92 /* AFURLSessionManager.m in Sources */, | 1772 | D2029C8C1E6EADE10027CD92 /* AFURLSessionManager.m in Sources */, |
| 1721 | D2029C9F1E6EADE10027CD92 /* NSObject+MJKeyValue.m in Sources */, | 1773 | D2029C9F1E6EADE10027CD92 /* NSObject+MJKeyValue.m in Sources */, |
| 1774 | + D25BF8A01E80C4BD007FB138 /* UIImage+LVCVagueImage.m in Sources */, | ||
| 1722 | D2888DB11E6EC05F003A77C8 /* TempViewController.m in Sources */, | 1775 | D2888DB11E6EC05F003A77C8 /* TempViewController.m in Sources */, |
| 1723 | 810B65021E779B1F00133E15 /* MASViewAttribute.m in Sources */, | 1776 | 810B65021E779B1F00133E15 /* MASViewAttribute.m in Sources */, |
| 1724 | D2029CAC1E6EADE10027CD92 /* MJRefreshBackStateFooter.m in Sources */, | 1777 | D2029CAC1E6EADE10027CD92 /* MJRefreshBackStateFooter.m in Sources */, |
| @@ -1732,6 +1785,7 @@ | @@ -1732,6 +1785,7 @@ | ||
| 1732 | D2029BCA1E6EADD70027CD92 /* BaseModel.m in Sources */, | 1785 | D2029BCA1E6EADD70027CD92 /* BaseModel.m in Sources */, |
| 1733 | D25BF87B1E7B8A82007FB138 /* SliderView.m in Sources */, | 1786 | D25BF87B1E7B8A82007FB138 /* SliderView.m in Sources */, |
| 1734 | 810B65041E779B1F00133E15 /* NSArray+MASAdditions.m in Sources */, | 1787 | 810B65041E779B1F00133E15 /* NSArray+MASAdditions.m in Sources */, |
| 1788 | + D25BF8801E7BD266007FB138 /* LVCUGCLivePlayerController.m in Sources */, | ||
| 1735 | D2029D031E6EAE2E0027CD92 /* UIImage+ZXExtension.m in Sources */, | 1789 | D2029D031E6EAE2E0027CD92 /* UIImage+ZXExtension.m in Sources */, |
| 1736 | D2029D0A1E6EAE2E0027CD92 /* ZXServerUrl.m in Sources */, | 1790 | D2029D0A1E6EAE2E0027CD92 /* ZXServerUrl.m in Sources */, |
| 1737 | D2029CCA1E6EADE10027CD92 /* SVProgressHUD.m in Sources */, | 1791 | D2029CCA1E6EADE10027CD92 /* SVProgressHUD.m in Sources */, |
| @@ -1956,6 +2010,7 @@ | @@ -1956,6 +2010,7 @@ | ||
| 1956 | buildSettings = { | 2010 | buildSettings = { |
| 1957 | BUNDLE_LOADER = "$(TEST_HOST)"; | 2011 | BUNDLE_LOADER = "$(TEST_HOST)"; |
| 1958 | INFOPLIST_FILE = LiveVideoCloudTests/Info.plist; | 2012 | INFOPLIST_FILE = LiveVideoCloudTests/Info.plist; |
| 2013 | + IPHONEOS_DEPLOYMENT_TARGET = 8.0; | ||
| 1959 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | 2014 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; |
| 1960 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloudTests; | 2015 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloudTests; |
| 1961 | PRODUCT_NAME = "$(TARGET_NAME)"; | 2016 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| @@ -1968,6 +2023,7 @@ | @@ -1968,6 +2023,7 @@ | ||
| 1968 | buildSettings = { | 2023 | buildSettings = { |
| 1969 | BUNDLE_LOADER = "$(TEST_HOST)"; | 2024 | BUNDLE_LOADER = "$(TEST_HOST)"; |
| 1970 | INFOPLIST_FILE = LiveVideoCloudTests/Info.plist; | 2025 | INFOPLIST_FILE = LiveVideoCloudTests/Info.plist; |
| 2026 | + IPHONEOS_DEPLOYMENT_TARGET = 8.0; | ||
| 1971 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | 2027 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; |
| 1972 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloudTests; | 2028 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloudTests; |
| 1973 | PRODUCT_NAME = "$(TARGET_NAME)"; | 2029 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| @@ -1979,6 +2035,7 @@ | @@ -1979,6 +2035,7 @@ | ||
| 1979 | isa = XCBuildConfiguration; | 2035 | isa = XCBuildConfiguration; |
| 1980 | buildSettings = { | 2036 | buildSettings = { |
| 1981 | INFOPLIST_FILE = LiveVideoCloudUITests/Info.plist; | 2037 | INFOPLIST_FILE = LiveVideoCloudUITests/Info.plist; |
| 2038 | + IPHONEOS_DEPLOYMENT_TARGET = 8.0; | ||
| 1982 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | 2039 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; |
| 1983 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloudUITests; | 2040 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloudUITests; |
| 1984 | PRODUCT_NAME = "$(TARGET_NAME)"; | 2041 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| @@ -1990,6 +2047,7 @@ | @@ -1990,6 +2047,7 @@ | ||
| 1990 | isa = XCBuildConfiguration; | 2047 | isa = XCBuildConfiguration; |
| 1991 | buildSettings = { | 2048 | buildSettings = { |
| 1992 | INFOPLIST_FILE = LiveVideoCloudUITests/Info.plist; | 2049 | INFOPLIST_FILE = LiveVideoCloudUITests/Info.plist; |
| 2050 | + IPHONEOS_DEPLOYMENT_TARGET = 8.0; | ||
| 1993 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | 2051 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; |
| 1994 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloudUITests; | 2052 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.zhangxu.LiveVideoCloudUITests; |
| 1995 | PRODUCT_NAME = "$(TARGET_NAME)"; | 2053 | PRODUCT_NAME = "$(TARGET_NAME)"; |
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/CNLiveChatManager
0 → 100755
No preview for this file type
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Headers/CNLiveChatManager.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveChatManager.h | ||
| 3 | +// CNLiveChatManager | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/2/27. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | +#import "CNLiveChatUserInfo.h" | ||
| 11 | +#import "CNLiveChatStatusDefine.h" | ||
| 12 | +#import "CNLiveChatMessage.h" | ||
| 13 | + | ||
| 14 | +@protocol CNLiveChatManagerDelegate <NSObject> | ||
| 15 | + | ||
| 16 | +@optional | ||
| 17 | +/** | ||
| 18 | + 连接状态的的监听器 | ||
| 19 | + | ||
| 20 | + @param status 网络连接状态码 | ||
| 21 | + */ | ||
| 22 | +- (void)onConnectionStatusChanged:(CNLiveConnectionStatus)status; | ||
| 23 | + | ||
| 24 | + | ||
| 25 | +/** | ||
| 26 | + 加入聊天室成功的监听 | ||
| 27 | + @param chatroomId 聊天室ID | ||
| 28 | + */ | ||
| 29 | +- (void)onChatRoomJoined:(NSString *)chatroomId; | ||
| 30 | + | ||
| 31 | + | ||
| 32 | +/*! | ||
| 33 | + 加入聊天室失败的监听 | ||
| 34 | + | ||
| 35 | + @param chatroomId 聊天室ID | ||
| 36 | + @param errorCode 加入失败的错误码 | ||
| 37 | + | ||
| 38 | + @discussion 如果错误码是CNLive_KICKED_FROM_CHATROOM或CNLive_CHATROOM_NOT_EXIST,则不会自动重新加入聊天室,App需要按照自己的逻辑处理。 | ||
| 39 | + */ | ||
| 40 | +- (void)onChatRoomJoinFailed:(NSString *)chatroomId | ||
| 41 | + errorCode:(CNLiveChatErrorCode)errorCode; | ||
| 42 | + | ||
| 43 | +/** | ||
| 44 | + 接收消息监听 | ||
| 45 | + | ||
| 46 | + @param message 消息实体类型对象(包括消息内容,消息ID,会话类型,目标ID,发送者的用户信息) | ||
| 47 | + */ | ||
| 48 | +- (void)onReceived:(CNLiveChatMessage *)message; | ||
| 49 | + | ||
| 50 | + | ||
| 51 | +/** | ||
| 52 | + 当前用户在其他设备上登录,此设备被踢下线。 | ||
| 53 | + */ | ||
| 54 | +- (void)kickedByAnotherDevice; | ||
| 55 | + | ||
| 56 | +@end | ||
| 57 | + | ||
| 58 | +@interface CNLiveChatManager : NSObject | ||
| 59 | + | ||
| 60 | +/** | ||
| 61 | + 聊天SDK代理,设置代理后,实现代理方法。 | ||
| 62 | + */ | ||
| 63 | +@property (nonatomic, weak) id<CNLiveChatManagerDelegate> delegate; | ||
| 64 | + | ||
| 65 | +/** | ||
| 66 | + 当前登录用户的用户信息 | ||
| 67 | + | ||
| 68 | + @discussion 用于与融云服务器建立连接之后,获取&设置当前用户的用户信息。 | ||
| 69 | + 用户ID不允许重新设置,只能设置昵称&头像。 | ||
| 70 | + */ | ||
| 71 | +@property(nonatomic, strong) CNLiveChatUserInfo *currentUserInfo; | ||
| 72 | + | ||
| 73 | +/** | ||
| 74 | + 获取SDK版本号 | ||
| 75 | + | ||
| 76 | + @return SDK版本号 | ||
| 77 | + */ | ||
| 78 | ++ (NSString *)getVersion; | ||
| 79 | + | ||
| 80 | + | ||
| 81 | +/** | ||
| 82 | + 获取视讯聊天核心类单例 | ||
| 83 | + | ||
| 84 | + @return 视讯聊天核心类单例 | ||
| 85 | + | ||
| 86 | + @discussion 您可以通过此方法,获取视讯聊天的单例,访问对象中的属性和方法。 | ||
| 87 | + */ | ||
| 88 | ++ (instancetype)sharedCNLiveChatManager; | ||
| 89 | + | ||
| 90 | + | ||
| 91 | +/** | ||
| 92 | + 初始化SDK方法 | ||
| 93 | + | ||
| 94 | + @param appKey 从视讯云平台获取到的appKey | ||
| 95 | + @param appId 从视讯云平台获取到的appId | ||
| 96 | + @warning 必传参数 | ||
| 97 | + @discussion 您在使用聊天SDK所有功能之前,您必须先调用此方法初始化SDK。 | ||
| 98 | + 在App整个生命周期中,您只需要执行一次初始化。 | ||
| 99 | + */ | ||
| 100 | +- (void)initWithAppKey:(NSString *)appKey appId:(NSString *)appId; | ||
| 101 | + | ||
| 102 | + | ||
| 103 | +/** | ||
| 104 | + 连接到视讯云服务器 | ||
| 105 | + | ||
| 106 | + @param successBlock 连接建立成功的回调。 | ||
| 107 | + @param errorBlock 连接建立成功的回调,返回错误码。 | ||
| 108 | + 注:连接服务器成功后才能使用聊天功能(如:单聊、加入聊天室、聊天室内 聊天); | ||
| 109 | + */ | ||
| 110 | +- (void)connectServerSuccess:(void (^)())successBlock | ||
| 111 | + error:(void (^)(CNLiveChatConnectErrorCode errors))errorBlock; | ||
| 112 | + | ||
| 113 | +/** | ||
| 114 | + 以用户信息登陆到视讯云服务器 | ||
| 115 | + | ||
| 116 | + @param userInfo 用户信息 | ||
| 117 | + @param successBlock 登陆成功的回调,返回登陆成功的用户ID。 | ||
| 118 | + @param errorBlock 登陆失败的回调,返回错误码。 | ||
| 119 | + 注:连接服务器成功后才能使用聊天功能(如:单聊、加入聊天室、聊天室内 聊天); | ||
| 120 | + */ | ||
| 121 | +- (void)loginServer:(CNLiveChatUserInfo *)userInfo | ||
| 122 | + success:(void (^)(NSString *userId))successBlock | ||
| 123 | + error:(void (^)(CNLiveChatConnectErrorCode errors))errorBlock; | ||
| 124 | + | ||
| 125 | + | ||
| 126 | +/** | ||
| 127 | + 当前用户登出服务器 | ||
| 128 | + */ | ||
| 129 | +- (void)logoutServer; | ||
| 130 | + | ||
| 131 | + | ||
| 132 | +/** | ||
| 133 | + 断开与服务器的连接 | ||
| 134 | + | ||
| 135 | + @param isReceivePush 与服务器断开后,是否还接收远程推送 | ||
| 136 | + */ | ||
| 137 | +- (void)disconnectServer:(BOOL)isReceivePush; | ||
| 138 | + | ||
| 139 | + | ||
| 140 | +/** | ||
| 141 | + 加入已经存在的聊天室(如果不存在或超限会返回聊天室不存在错误23410 或 人数超限23411) | ||
| 142 | + | ||
| 143 | + @param targetId 要加入的聊天室ID | ||
| 144 | + @param messageCount 进入聊天室时获取历史消息的数量,-1<=messageCount<=50 | ||
| 145 | + -1表示不获取任何历史消息,0表示不特殊设置而使用SDK默认的设置(默认为获取10条),0<messageCount<=50为具体获取的消息数量,最大值为50。 | ||
| 146 | + @param successBlock 加入聊天室成功的回调,返回成功加入的聊天室ID。 | ||
| 147 | + @param errorBlock 加入聊天室失败的回调,返回错误码以及加入失败的聊天室ID。 | ||
| 148 | + */ | ||
| 149 | +- (void)joinExistChatRoom:(NSString *)targetId | ||
| 150 | + messageCount:(int)messageCount | ||
| 151 | + success:(void (^)(NSString *targetId))successBlock | ||
| 152 | + error:(void (^)(CNLiveChatErrorCode errors, NSString *targetId))errorBlock; | ||
| 153 | + | ||
| 154 | + | ||
| 155 | +/** | ||
| 156 | + 加入聊天室,若不存在自动创建聊天室 | ||
| 157 | + | ||
| 158 | + @param targetId 要加入的聊天室ID | ||
| 159 | + @param messageCount 进入聊天室时获取历史消息的数量,-1<=messageCount<=50 | ||
| 160 | + -1表示不获取任何历史消息,0表示不特殊设置而使用SDK默认的设置(默认为获取10条),0<messageCount<=50为具体获取的消息数量,最大值为50。 | ||
| 161 | + @param successBlock 加入聊天室成功的回调,返回成功加入的聊天室ID | ||
| 162 | + @param errorBlock 加入聊天室失败的回调,返回错误码以及加入失败的聊天室ID | ||
| 163 | + */ | ||
| 164 | +- (void)joinChatRoom:(NSString *)targetId | ||
| 165 | + messageCount:(int)messageCount | ||
| 166 | + success:(void (^)(NSString *targetId))successBlock | ||
| 167 | + error:(void (^)(CNLiveChatErrorCode errors, NSString *targetId))errorBlock; | ||
| 168 | + | ||
| 169 | + | ||
| 170 | +/** | ||
| 171 | + 退出聊天室 | ||
| 172 | + | ||
| 173 | + @param targetId 要退出的聊天室ID | ||
| 174 | + @param successBlock 退出聊天室成功的回调,返回成功退出的聊天室ID | ||
| 175 | + @param errorBlock 退出聊天室失败的回调,返回失败的错误码以及退出失败的聊天室的ID | ||
| 176 | + */ | ||
| 177 | +- (void)quitChatRoom:(NSString *)targetId | ||
| 178 | + success:(void (^)(NSString *targetId))successBlock | ||
| 179 | + error:(void (^)(CNLiveChatErrorCode errors, NSString *targetId))errorBlock; | ||
| 180 | + | ||
| 181 | + | ||
| 182 | +/** | ||
| 183 | + 发送消息 | ||
| 184 | + | ||
| 185 | + @param message 消息内容 | ||
| 186 | + @param type 会话类型(私聊 / 聊天室) | ||
| 187 | + @param targetId 会话目标ID(私聊:用户ID / 聊天室:聊天室ID) | ||
| 188 | + @param successBlock 发送消息成功的回调,消息实体类型对象(包括消息内容,消息ID,会话类型,目标ID,发送者的用户信息) | ||
| 189 | + @param errorBlock 发送消息失败的回调,返回错误码,消息ID,目标ID | ||
| 190 | + */ | ||
| 191 | +- (void)sendMessage:(NSString *)message | ||
| 192 | + type:(CNLiveConversationType)type | ||
| 193 | + targetId:(NSString *)targetId | ||
| 194 | + success:(void (^)(CNLiveChatMessage *message))successBlock | ||
| 195 | + error:(void (^)(CNLiveChatErrorCode errors, NSString *messageId, NSString *targetId))errorBlock; | ||
| 196 | + | ||
| 197 | + | ||
| 198 | +/** | ||
| 199 | + 获取当前SDK的连接状态 | ||
| 200 | + | ||
| 201 | + @return 当前SDK的连接状态 | ||
| 202 | + */ | ||
| 203 | +- (CNLiveConnectionStatus)getConnectionStatus; | ||
| 204 | + | ||
| 205 | + | ||
| 206 | +/** | ||
| 207 | + 获取某个会话中指定数量的最新消息 | ||
| 208 | + | ||
| 209 | + @param conversationType 会话类型(私聊 / 聊天室) | ||
| 210 | + @param targetId 会话目标ID(私聊:用户ID / 聊天室:聊天室ID) | ||
| 211 | + @param count 所要获取的消息数量 | ||
| 212 | + | ||
| 213 | + @return 消息数组(CNLiveChatMessage类型) | ||
| 214 | + @discussion | ||
| 215 | + 此方法会获取该会话中指定数量的最新消息实体,返回的消息实体按照时间从新到旧排列。 | ||
| 216 | + 如果会话中的消息数量小于参数count的值,会将该会话中的所有消息返回。 | ||
| 217 | + */ | ||
| 218 | +- (NSArray *)getLatestMessages:(CNLiveConversationType)conversationType | ||
| 219 | + targetId:(NSString *)targetId | ||
| 220 | + count:(int)count; | ||
| 221 | + | ||
| 222 | + | ||
| 223 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Headers/CNLiveChatMessage.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveChatMessage.h | ||
| 3 | +// CNLiveChatManager | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/3. | ||
| 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 CNLiveChatMessage : NSObject | ||
| 14 | + | ||
| 15 | +/** | ||
| 16 | + 会话类型(私聊 / 聊天室) | ||
| 17 | + */ | ||
| 18 | +@property (nonatomic, assign) CNLiveConversationType conversationType; | ||
| 19 | + | ||
| 20 | +/** | ||
| 21 | + 目标ID(消息来自聊天室的ID / 接收者ID) | ||
| 22 | + */ | ||
| 23 | +@property (nonatomic, assign) NSString *targetId; | ||
| 24 | + | ||
| 25 | +/** | ||
| 26 | + 消息ID(本地存储的消息的唯一值(数据库索引唯一值)) | ||
| 27 | + */ | ||
| 28 | +@property (nonatomic, assign) NSString *messageId; | ||
| 29 | + | ||
| 30 | +/** | ||
| 31 | + 消息内容 | ||
| 32 | + */ | ||
| 33 | +@property (nonatomic, strong) NSString *messageContent; | ||
| 34 | + | ||
| 35 | +/** | ||
| 36 | + 发送者的用户信息(userId, name, portraitUri) | ||
| 37 | + */ | ||
| 38 | +@property (nonatomic, strong) CNLiveChatUserInfo *userInfo; | ||
| 39 | + | ||
| 40 | +/** | ||
| 41 | + 消息的接收时间(Unix时间戳、毫秒) | ||
| 42 | + */ | ||
| 43 | +@property(nonatomic, assign) long long receivedTime; | ||
| 44 | + | ||
| 45 | +/** | ||
| 46 | + 消息的发送时间(Unix时间戳、毫秒) | ||
| 47 | + */ | ||
| 48 | +@property(nonatomic, assign) long long sentTime; | ||
| 49 | + | ||
| 50 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Headers/CNLiveChatStatusDefine.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveChatStatusDefine.h | ||
| 3 | +// CNLiveChatManager | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/1. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +#pragma mark - 错误码相关 | ||
| 12 | + | ||
| 13 | +#pragma mark CNLiveChatConnectErrorCode - 建立连接返回的错误码 | ||
| 14 | +/*! | ||
| 15 | + 建立连接返回的错误码 | ||
| 16 | + | ||
| 17 | + @discussion | ||
| 18 | + 开发者仅需要关注以下几种连接错误码,其余错误码SDK均会进行自动重连,开发者无须处理。 | ||
| 19 | + CNLive_CONN_ID_REJECT, CNLive_CONN_TOKEN_INCORRECT, CNLive_CONN_NOT_AUTHRORIZED, | ||
| 20 | + CNLive_CONN_PACKAGE_NAME_INVALID, CNLive_CONN_APP_BLOCKED_OR_DELETED, | ||
| 21 | + CNLive_CONN_USER_BLOCKED, CNLive_DISCONN_KICK, CNLive_CLIENT_NOT_INIT, CNLive_INVALID_PARAMETER, CNLive_INVALID_ARGUMENT | ||
| 22 | + */ | ||
| 23 | +typedef NS_ENUM(NSInteger, CNLiveChatConnectErrorCode) { | ||
| 24 | + | ||
| 25 | + /*! | ||
| 26 | + 连接已被释放 | ||
| 27 | + | ||
| 28 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 29 | + */ | ||
| 30 | + CNLive_NET_CHANNEL_INVALID = 30001, | ||
| 31 | + | ||
| 32 | + /*! | ||
| 33 | + 连接不可用 | ||
| 34 | + | ||
| 35 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 36 | + */ | ||
| 37 | + CNLive_NET_UNAVAILABLE = 30002, | ||
| 38 | + | ||
| 39 | + /*! | ||
| 40 | + 导航HTTP发送失败 | ||
| 41 | + | ||
| 42 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 43 | + */ | ||
| 44 | + CNLive_NAVI_REQUEST_FAIL = 30004, | ||
| 45 | + | ||
| 46 | + /*! | ||
| 47 | + 导航HTTP请求失败 | ||
| 48 | + | ||
| 49 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 50 | + */ | ||
| 51 | + CNLive_NAVI_RESPONSE_ERROR = 30007, | ||
| 52 | + | ||
| 53 | + /*! | ||
| 54 | + 导航HTTP返回数据格式错误 | ||
| 55 | + | ||
| 56 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 57 | + */ | ||
| 58 | + CNLive_NODE_NOT_FOUND = 30008, | ||
| 59 | + | ||
| 60 | + /*! | ||
| 61 | + 创建Socket连接失败 | ||
| 62 | + | ||
| 63 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 64 | + */ | ||
| 65 | + CNLive_SOCKET_NOT_CONNECTED = 30010, | ||
| 66 | + | ||
| 67 | + /*! | ||
| 68 | + Socket断开 | ||
| 69 | + | ||
| 70 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 71 | + */ | ||
| 72 | + CNLive_SOCKET_DISCONNECTED = 30011, | ||
| 73 | + | ||
| 74 | + /*! | ||
| 75 | + PING失败 | ||
| 76 | + | ||
| 77 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 78 | + */ | ||
| 79 | + CNLive_PING_SEND_FAIL = 30012, | ||
| 80 | + | ||
| 81 | + /*! | ||
| 82 | + PING超时 | ||
| 83 | + | ||
| 84 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 85 | + */ | ||
| 86 | + CNLive_PONG_RECV_FAIL = 30013, | ||
| 87 | + | ||
| 88 | + /*! | ||
| 89 | + 信令发送失败 | ||
| 90 | + | ||
| 91 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 92 | + */ | ||
| 93 | + CNLive_MSG_SEND_FAIL = 30014, | ||
| 94 | + | ||
| 95 | + /*! | ||
| 96 | + 连接过于频繁 | ||
| 97 | + | ||
| 98 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 99 | + */ | ||
| 100 | + CNLive_CONN_OVERFREQUENCY = 30015, | ||
| 101 | + | ||
| 102 | + /*! | ||
| 103 | + 连接ACK超时 | ||
| 104 | + | ||
| 105 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 106 | + */ | ||
| 107 | + CNLive_CONN_ACK_TIMEOUT = 31000, | ||
| 108 | + | ||
| 109 | + /*! | ||
| 110 | + 信令版本错误 | ||
| 111 | + | ||
| 112 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 113 | + */ | ||
| 114 | + CNLive_CONN_PROTO_VERSION_ERROR = 31001, | ||
| 115 | + | ||
| 116 | + /*! | ||
| 117 | + AppKey错误 | ||
| 118 | + | ||
| 119 | + @discussion 请检查您使用的AppKey是否正确。(*自行处理) | ||
| 120 | + */ | ||
| 121 | + CNLive_CONN_ID_REJECT = 31002, | ||
| 122 | + | ||
| 123 | + /*! | ||
| 124 | + 服务器当前不可用(预留) | ||
| 125 | + | ||
| 126 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 127 | + */ | ||
| 128 | + CNLive_CONN_SERVER_UNAVAILABLE = 31003, | ||
| 129 | + | ||
| 130 | + /*! | ||
| 131 | + Token无效 | ||
| 132 | + | ||
| 133 | + @discussion Token无效一般有以下两种原因。(*自行处理) | ||
| 134 | + 一是token错误,请您检查客户端初始化使用的AppKey和您服务器获取token使用的AppKey是否一致; | ||
| 135 | + 二是token过期,是因为您在开发者后台设置了token过期时间,您需要请求您的服务器重新获取token并再次用新的token建立连接。 | ||
| 136 | + */ | ||
| 137 | + CNLive_CONN_TOKEN_INCORRECT = 31004, | ||
| 138 | + | ||
| 139 | + /*! | ||
| 140 | + AppKey与Token不匹配 | ||
| 141 | + | ||
| 142 | + @discussion | ||
| 143 | + 请检查您使用的AppKey与Token是否正确,是否匹配。一般有以下两种原因。(*自行处理) | ||
| 144 | + 一是token错误,请您检查客户端初始化使用的AppKey和您服务器获取token使用的AppKey是否一致; | ||
| 145 | + 二是token过期,是因为您在开发者后台设置了token过期时间,您需要请求您的服务器重新获取token并再次用新的token建立连接。 | ||
| 146 | + */ | ||
| 147 | + CNLive_CONN_NOT_AUTHRORIZED = 31005, | ||
| 148 | + | ||
| 149 | + /*! | ||
| 150 | + 连接重定向 | ||
| 151 | + | ||
| 152 | + @discussion 建立连接的临时错误码,SDK会做好自动重连,开发者无须处理。 | ||
| 153 | + */ | ||
| 154 | + CNLive_CONN_REDIRECTED = 31006, | ||
| 155 | + | ||
| 156 | + /*! | ||
| 157 | + BundleID不正确 | ||
| 158 | + | ||
| 159 | + @discussion 请检查您App的BundleID是否正确。(*自行处理) | ||
| 160 | + */ | ||
| 161 | + CNLive_CONN_PACKAGE_NAME_INVALID = 31007, | ||
| 162 | + | ||
| 163 | + /*! | ||
| 164 | + AppKey被封禁或已删除 | ||
| 165 | + | ||
| 166 | + @discussion 请检查您使用的AppKey是否正确。(*自行处理) | ||
| 167 | + */ | ||
| 168 | + CNLive_CONN_APP_BLOCKED_OR_DELETED = 31008, | ||
| 169 | + | ||
| 170 | + /*! | ||
| 171 | + 用户被封禁 | ||
| 172 | + | ||
| 173 | + @discussion 请检查您使用的Token是否正确,以及对应的UserId是否被封禁。(*自行处理) | ||
| 174 | + */ | ||
| 175 | + CNLive_CONN_USER_BLOCKED = 31009, | ||
| 176 | + | ||
| 177 | + /*! | ||
| 178 | + Token请求失败 | ||
| 179 | + | ||
| 180 | + @discussion 请检查连接服务器方法的参数是否正确,特别是用户信息中的用户ID。也可能是无网络。(*自行处理) | ||
| 181 | + */ | ||
| 182 | + CNLive_CONN_TOKEN_NULL = 31012, | ||
| 183 | + | ||
| 184 | + /*! | ||
| 185 | + 当前用户在其他设备上登陆,此设备被踢下线。(*自行处理) | ||
| 186 | + */ | ||
| 187 | + CNLive_DISCONN_KICK = 31010, | ||
| 188 | + | ||
| 189 | + /*! | ||
| 190 | + SDK没有初始化 | ||
| 191 | + | ||
| 192 | + @discussion 在使用SDK任何功能之前,必须先Init。(*自行处理) | ||
| 193 | + */ | ||
| 194 | + CNLive_CONN_CLIENT_NOT_INIT = 33001, | ||
| 195 | + | ||
| 196 | + /*! | ||
| 197 | + 开发者接口调用时传入的参数错误 | ||
| 198 | + | ||
| 199 | + @discussion 请检查接口调用时传入的参数类型和值。(*自行处理) | ||
| 200 | + */ | ||
| 201 | + CNLive_CONN_INVALID_PARAMETER = 33003, | ||
| 202 | + | ||
| 203 | + /*! | ||
| 204 | + Connection已经存在 | ||
| 205 | + | ||
| 206 | + @discussion | ||
| 207 | + 调用过connect之后,建议在token错误或者被踢下线或者用户logout的情况下才需要再次调用connect。SDK会自动重连,不需要应用多次调用connect来保证连接性。(*自行处理) | ||
| 208 | + */ | ||
| 209 | + CNLive_CONNECTION_EXIST = 34001, | ||
| 210 | + | ||
| 211 | + /*! | ||
| 212 | + Connection正在连接 | ||
| 213 | + | ||
| 214 | + @discussion | ||
| 215 | + Connection正在连接,此时不能再次做connect操作,稍后再做操作(*自行处理) | ||
| 216 | + */ | ||
| 217 | + CNLive_CONNECTION_CONNING = 34002, | ||
| 218 | + | ||
| 219 | + /*! | ||
| 220 | + 开发者接口调用时传入的参数错误 | ||
| 221 | + | ||
| 222 | + @discussion 请检查接口调用时传入的参数类型和值。(*自行处理) | ||
| 223 | + */ | ||
| 224 | + CNLive_INVALID_ARGUMENT = -1000 | ||
| 225 | +}; | ||
| 226 | + | ||
| 227 | +#pragma mark CNLiveChatErrorCode - 具体业务错误码 | ||
| 228 | +/*! | ||
| 229 | + 具体业务错误码 | ||
| 230 | + */ | ||
| 231 | +typedef NS_ENUM(NSInteger, CNLiveChatErrorCode) { | ||
| 232 | + /*! | ||
| 233 | + 未知错误(预留) | ||
| 234 | + */ | ||
| 235 | + CNLive_ERRORCODE_UNKNOWN = -1, | ||
| 236 | + | ||
| 237 | + /*! | ||
| 238 | + token错误 | ||
| 239 | + */ | ||
| 240 | + CNLive_ERRORCODE_BY_TOKENERROR = 302, | ||
| 241 | + | ||
| 242 | + /*! | ||
| 243 | + 鉴权失败 此AppId无权加入此targetId的聊天室 | ||
| 244 | + */ | ||
| 245 | + CNLive_ERRORCODE_BY_AUTHENTICATIONERROR = 303, | ||
| 246 | + | ||
| 247 | + /*! | ||
| 248 | + 不合法的 targetId | ||
| 249 | + */ | ||
| 250 | + CNLive_ERRORCODE_BY_TARGETIDERROR = 304, | ||
| 251 | + | ||
| 252 | + /*! | ||
| 253 | + 不合法的 会话类型 type | ||
| 254 | + */ | ||
| 255 | + CNLive_ERRORCODE_BY_CONVERSATIONTYPEERROR = 305, | ||
| 256 | + | ||
| 257 | + /*! | ||
| 258 | + 已被对方加入黑名单 | ||
| 259 | + */ | ||
| 260 | + CNLive_REJECTED_BY_BLACKLIST = 405, | ||
| 261 | + | ||
| 262 | + /*! | ||
| 263 | + 超时 | ||
| 264 | + */ | ||
| 265 | + CNLive_ERRORCODE_TIMEOUT = 5004, | ||
| 266 | + | ||
| 267 | + /*! | ||
| 268 | + 发送消息频率过高,1秒钟最多只允许发送5条消息 | ||
| 269 | + */ | ||
| 270 | + CNLive_SEND_MSG_FREQUENCY_OVERRUN = 20604, | ||
| 271 | + | ||
| 272 | + /*! | ||
| 273 | + 不在该聊天室中 | ||
| 274 | + */ | ||
| 275 | + CNLive_NOT_IN_CHATROOM = 23406, | ||
| 276 | + | ||
| 277 | + /*! | ||
| 278 | + 在该聊天室中已被禁言 | ||
| 279 | + */ | ||
| 280 | + CNLive_FORBIDDEN_IN_CHATROOM = 23408, | ||
| 281 | + | ||
| 282 | + /*! | ||
| 283 | + 已被踢出聊天室 | ||
| 284 | + */ | ||
| 285 | + CNLive_KICKED_FROM_CHATROOM = 23409, | ||
| 286 | + | ||
| 287 | + /*! | ||
| 288 | + 聊天室不存在 | ||
| 289 | + */ | ||
| 290 | + CNLive_CHATROOM_NOT_EXIST = 23410, | ||
| 291 | + | ||
| 292 | + /*! | ||
| 293 | + 聊天室成员超限 | ||
| 294 | + */ | ||
| 295 | + CNLive_CHATROOM_IS_FULL = 23411, | ||
| 296 | + | ||
| 297 | + /*! | ||
| 298 | + 聊天室接口参数无效 | ||
| 299 | + */ | ||
| 300 | + CNLive_PARAMETER_INVALID_CHATROOM = 23412, | ||
| 301 | + | ||
| 302 | + /*! | ||
| 303 | + 聊天室云存储业务未开通 | ||
| 304 | + */ | ||
| 305 | + CNLive_ROAMING_SERVICE_UNAVAILABLE_CHATROOM = 23414, | ||
| 306 | + | ||
| 307 | + /*! | ||
| 308 | + 当前连接不可用(连接已经被释放) | ||
| 309 | + */ | ||
| 310 | + CNLive_CHANNEL_INVALID = 30001, | ||
| 311 | + | ||
| 312 | + /*! | ||
| 313 | + 当前连接不可用 | ||
| 314 | + */ | ||
| 315 | + CNLive_NETWORK_UNAVAILABLE = 30002, | ||
| 316 | + | ||
| 317 | + /*! | ||
| 318 | + 消息响应超时 | ||
| 319 | + */ | ||
| 320 | + CNLive_MSG_RESPONSE_TIMEOUT = 30003, | ||
| 321 | + | ||
| 322 | + /*! | ||
| 323 | + SDK没有初始化 | ||
| 324 | + | ||
| 325 | + @discussion 在使用SDK任何功能之前,必须先Init。 | ||
| 326 | + */ | ||
| 327 | + CNLive_CLIENT_NOT_INIT = 33001, | ||
| 328 | + | ||
| 329 | + /*! | ||
| 330 | + 数据库错误 | ||
| 331 | + | ||
| 332 | + @discussion 请检查您使用的Token和userId是否正确。 | ||
| 333 | + */ | ||
| 334 | + CNLive_DATABASE_ERROR = 33002, | ||
| 335 | + | ||
| 336 | + /*! | ||
| 337 | + 开发者接口调用时传入的参数错误 | ||
| 338 | + | ||
| 339 | + @discussion 请检查接口调用时传入的参数类型和值。 | ||
| 340 | + */ | ||
| 341 | + CNLive_INVALID_PARAMETER = 33003, | ||
| 342 | + | ||
| 343 | + /*! | ||
| 344 | + 历史消息云存储业务未开通 | ||
| 345 | + */ | ||
| 346 | + CNLive_MSG_ROAMING_SERVICE_UNAVAILABLE = 33007, | ||
| 347 | + | ||
| 348 | + /*! | ||
| 349 | + 消息大小超限,消息体(序列化成json格式之后的内容)最大128k bytes。 | ||
| 350 | + */ | ||
| 351 | + CNLive_MSG_SIZE_OUT_OF_LIMIT = 30016 | ||
| 352 | +}; | ||
| 353 | + | ||
| 354 | +#pragma mark - 会话相关 | ||
| 355 | + | ||
| 356 | +#pragma mark CNLiveConversationType - 会话类型 | ||
| 357 | +/*! | ||
| 358 | + 会话类型 | ||
| 359 | + */ | ||
| 360 | +typedef NS_ENUM(NSUInteger, CNLiveConversationType) { | ||
| 361 | + /*! | ||
| 362 | + 私聊 | ||
| 363 | + */ | ||
| 364 | + CNLive_ConversationType_PRIVATE = 1, | ||
| 365 | + | ||
| 366 | + /*! | ||
| 367 | + 聊天室 | ||
| 368 | + */ | ||
| 369 | + CNLive_ConversationType_CHATROOM = 4, | ||
| 370 | +}; | ||
| 371 | + | ||
| 372 | +#pragma mark - 线上状态 | ||
| 373 | + | ||
| 374 | +#pragma mark CNLiveConnectionStatus - 网络连接状态码 | ||
| 375 | +/*! | ||
| 376 | + 网络连接状态码 | ||
| 377 | + | ||
| 378 | + @discussion 开发者仅需要关注以下几种连接状态,其余状态SDK均会进行自动重连。 | ||
| 379 | + CNLive_ConnectionStatus_Connected, CNLive_ConnectionStatus_Connecting, | ||
| 380 | + CNLive_ConnectionStatus_Unconnected, | ||
| 381 | + CNLive_ConnectionStatus_SignUp, CNLive_ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT, | ||
| 382 | + CNLive_ConnectionStatus_TOKEN_INCORRECT | ||
| 383 | + */ | ||
| 384 | +typedef NS_ENUM(NSInteger, CNLiveConnectionStatus) { | ||
| 385 | + /*! | ||
| 386 | + 未知状态 | ||
| 387 | + | ||
| 388 | + @discussion 建立连接中出现异常的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 389 | + */ | ||
| 390 | + CNLive_ConnectionStatus_UNKNOWN = -1, | ||
| 391 | + | ||
| 392 | + /*! | ||
| 393 | + 连接成功 | ||
| 394 | + */ | ||
| 395 | + CNLive_ConnectionStatus_Connected = 0, | ||
| 396 | + | ||
| 397 | + /*! | ||
| 398 | + 当前设备网络不可用 | ||
| 399 | + | ||
| 400 | + @discussion 建立连接的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 401 | + */ | ||
| 402 | + CNLive_ConnectionStatus_NETWORK_UNAVAILABLE = 1, | ||
| 403 | + | ||
| 404 | + /*! | ||
| 405 | + 当前设备切换到飞行模式 | ||
| 406 | + | ||
| 407 | + @discussion 建立连接的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 408 | + */ | ||
| 409 | + CNLive_ConnectionStatus_AIRPLANE_MODE = 2, | ||
| 410 | + | ||
| 411 | + /*! | ||
| 412 | + 当前设备切换到 2G(GPRS、EDGE)低速网络 | ||
| 413 | + | ||
| 414 | + @discussion 建立连接的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 415 | + */ | ||
| 416 | + CNLive_ConnectionStatus_Cellular_2G = 3, | ||
| 417 | + | ||
| 418 | + /*! | ||
| 419 | + 当前设备切换到 3G 或 4G 高速网络 | ||
| 420 | + | ||
| 421 | + @discussion 建立连接的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 422 | + */ | ||
| 423 | + CNLive_ConnectionStatus_Cellular_3G_4G = 4, | ||
| 424 | + | ||
| 425 | + /*! | ||
| 426 | + 当前设备切换到 WIFI 网络 | ||
| 427 | + | ||
| 428 | + @discussion 建立连接的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 429 | + */ | ||
| 430 | + CNLive_ConnectionStatus_WIFI = 5, | ||
| 431 | + | ||
| 432 | + /*! | ||
| 433 | + 当前用户在其他设备上登录,此设备被踢下线 | ||
| 434 | + */ | ||
| 435 | + CNLive_ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT = 6, | ||
| 436 | + | ||
| 437 | + /*! | ||
| 438 | + 当前用户在 Web 端登录 | ||
| 439 | + | ||
| 440 | + @discussion 建立连接的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 441 | + */ | ||
| 442 | + CNLive_ConnectionStatus_LOGIN_ON_WEB = 7, | ||
| 443 | + | ||
| 444 | + /*! | ||
| 445 | + 服务器异常 | ||
| 446 | + | ||
| 447 | + @discussion 建立连接的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 448 | + */ | ||
| 449 | + CNLive_ConnectionStatus_SERVER_INVALID = 8, | ||
| 450 | + | ||
| 451 | + /*! | ||
| 452 | + 连接验证异常 | ||
| 453 | + | ||
| 454 | + @discussion 建立连接的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 455 | + */ | ||
| 456 | + CNLive_ConnectionStatus_VALIDATE_INVALID = 9, | ||
| 457 | + | ||
| 458 | + /*! | ||
| 459 | + 连接中 | ||
| 460 | + */ | ||
| 461 | + CNLive_ConnectionStatus_Connecting = 10, | ||
| 462 | + | ||
| 463 | + /*! | ||
| 464 | + 连接失败或未连接 | ||
| 465 | + */ | ||
| 466 | + CNLive_ConnectionStatus_Unconnected = 11, | ||
| 467 | + | ||
| 468 | + /*! | ||
| 469 | + 已注销 | ||
| 470 | + */ | ||
| 471 | + CNLive_ConnectionStatus_SignUp = 12, | ||
| 472 | + | ||
| 473 | + /*! | ||
| 474 | + Token无效 | ||
| 475 | + | ||
| 476 | + @discussion | ||
| 477 | + Token无效一般有两种原因。一是token错误,请您检查客户端初始化使用的AppKey和您服务器获取token使用的AppKey是否一致;二是token过期,是因为您在开发者后台设置了token过期时间,您需要请求您的服务器重新获取token并再次用新的token建立连接。 | ||
| 478 | + */ | ||
| 479 | + CNLive_ConnectionStatus_TOKEN_INCORRECT = 31004, | ||
| 480 | + | ||
| 481 | + /*! | ||
| 482 | + 与服务器的连接已断开 | ||
| 483 | + | ||
| 484 | + @discussion 建立连接的临时状态,SDK会做好自动重连,开发者无须处理。 | ||
| 485 | + */ | ||
| 486 | + CNLive_ConnectionStatus_DISCONN_EXCEPTION = 31011, | ||
| 487 | + | ||
| 488 | + /*! | ||
| 489 | + 与服务器的连接已断开 | ||
| 490 | + | ||
| 491 | + @discussion 无法自动重连,需手动重新连接服务器connectServerSuccess:error:。 | ||
| 492 | + */ | ||
| 493 | + CNLive_ConnectionStatus_DISCONN_MANUALCONN = 32011 | ||
| 494 | +}; | ||
| 495 | + | ||
| 496 | + |
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Headers/CNLiveChatUserInfo.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveChatUserInfo.h | ||
| 3 | +// CNLiveChatManager | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/1. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +@interface CNLiveChatUserInfo : NSObject | ||
| 12 | + | ||
| 13 | +/*! | ||
| 14 | + 用户ID(一旦以一个用户ID连接到服务器,就不能再修改用户ID了,如果修改也会被忽略) | ||
| 15 | + */ | ||
| 16 | +@property(nonatomic, strong, readonly) NSString *userId; | ||
| 17 | + | ||
| 18 | +/*! | ||
| 19 | + 用户名称 | ||
| 20 | + */ | ||
| 21 | +@property(nonatomic, strong) NSString *name; | ||
| 22 | + | ||
| 23 | +/*! | ||
| 24 | + 用户头像的URL | ||
| 25 | + */ | ||
| 26 | +@property(nonatomic, strong) NSString *portraitUri; | ||
| 27 | + | ||
| 28 | +/*! | ||
| 29 | + 用户信息的初始化方法, | ||
| 30 | + | ||
| 31 | + @param userId 用户ID | ||
| 32 | + @param username 用户名称 | ||
| 33 | + @param portrait 用户头像的URL | ||
| 34 | + @return 用户信息对象 | ||
| 35 | + */ | ||
| 36 | +- (instancetype)initWithUserId:(NSString *)userId | ||
| 37 | + name:(NSString *)username | ||
| 38 | + portrait:(NSString *)portrait; | ||
| 39 | + | ||
| 40 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Info.plist
0 → 100644
No preview for this file type
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveChatManager.framework/Modules/module.modulemap
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveMsgTools.framework/CNLiveMsgTools
No preview for this file type
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveMsgTools.framework/Headers/CNLiveMsgManager.h
| @@ -17,9 +17,8 @@ | @@ -17,9 +17,8 @@ | ||
| 17 | + (instancetype)sharedCNLiveMsgManager; | 17 | + (instancetype)sharedCNLiveMsgManager; |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | -- (void)setToolsInfoWithInfoId:(NSString *)infoId | ||
| 21 | - infoName:(NSString *)infoName | ||
| 22 | - infoUrl:(NSString *)infoUrl; | 20 | +- (void)setToolsInfoWithInfoName:(NSString *)infoName |
| 21 | + infoUrl:(NSString *)infoUrl; | ||
| 23 | 22 | ||
| 24 | 23 | ||
| 25 | - (NSDictionary *)getToolsInfo; | 24 | - (NSDictionary *)getToolsInfo; |
| @@ -72,8 +71,8 @@ | @@ -72,8 +71,8 @@ | ||
| 72 | - (void)sendCarrier:(NSString *)carrier | 71 | - (void)sendCarrier:(NSString *)carrier |
| 73 | type:(NSInteger)type | 72 | type:(NSInteger)type |
| 74 | targetId:(NSString *)targetId | 73 | targetId:(NSString *)targetId |
| 75 | - success:(void (^)(NSString *carrier, NSString *targetId, NSInteger type, NSString *infoId, NSString *infoName, NSString *infoUrl))successBlock | ||
| 76 | - error:(void (^)(NSInteger errors, NSString *targetId, NSInteger type))errorBlock; | 74 | + success:(void (^)(NSString *carrier, NSString *messageId, NSString *targetId, NSInteger type, NSString *infoId, NSString *infoName, NSString *infoUrl, long long goTime, long long comeTime))successBlock |
| 75 | + error:(void (^)(NSInteger errors, NSString *messageId, NSString *targetId))errorBlock; | ||
| 77 | 76 | ||
| 78 | 77 | ||
| 79 | - (NSInteger)getOnLineStatus; | 78 | - (NSInteger)getOnLineStatus; |
LiveVideoCloud/LiveVideoCloud/Classes/CNLiveSDK/CNLiveMsgTools.framework/Info.plist
No preview for this file type
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/HomeViewController.m
| @@ -10,6 +10,7 @@ | @@ -10,6 +10,7 @@ | ||
| 10 | #import "LVCLivePlayerController.h" | 10 | #import "LVCLivePlayerController.h" |
| 11 | #import "LVCInteractionController.h" | 11 | #import "LVCInteractionController.h" |
| 12 | #import "LVCLivePlayerController.h" | 12 | #import "LVCLivePlayerController.h" |
| 13 | +#import "LVCUGCLivePlayerController.h" | ||
| 13 | 14 | ||
| 14 | @interface HomeViewController () | 15 | @interface HomeViewController () |
| 15 | 16 | ||
| @@ -43,6 +44,12 @@ | @@ -43,6 +44,12 @@ | ||
| 43 | [liveBtn addTarget:self action:@selector(liveAction) forControlEvents:UIControlEventTouchUpInside]; | 44 | [liveBtn addTarget:self action:@selector(liveAction) forControlEvents:UIControlEventTouchUpInside]; |
| 44 | [self.view addSubview:liveBtn]; | 45 | [self.view addSubview:liveBtn]; |
| 45 | 46 | ||
| 47 | + UIButton *UGCLiveBtn = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 48 | + UGCLiveBtn.frame = CGRectMake(0, 200, self.view.width, 40); | ||
| 49 | + [UGCLiveBtn setTitle:@"UGC直播" forState:UIControlStateNormal]; | ||
| 50 | + [UGCLiveBtn addTarget:self action:@selector(UGCLiveAction) forControlEvents:UIControlEventTouchUpInside]; | ||
| 51 | + [self.view addSubview:UGCLiveBtn]; | ||
| 52 | + | ||
| 46 | [[UIApplication sharedApplication].keyWindow addSubview:self.interactionBtn]; | 53 | [[UIApplication sharedApplication].keyWindow addSubview:self.interactionBtn]; |
| 47 | } | 54 | } |
| 48 | 55 | ||
| @@ -53,6 +60,12 @@ | @@ -53,6 +60,12 @@ | ||
| 53 | [self.navigationController pushViewController:liveVC animated:YES]; | 60 | [self.navigationController pushViewController:liveVC animated:YES]; |
| 54 | } | 61 | } |
| 55 | 62 | ||
| 63 | +- (void)UGCLiveAction | ||
| 64 | +{ | ||
| 65 | + LVCUGCLivePlayerController *UGCLiveVC = [[LVCUGCLivePlayerController alloc] init]; | ||
| 66 | + [self.navigationController pushViewController:UGCLiveVC animated:YES]; | ||
| 67 | +} | ||
| 68 | + | ||
| 56 | - (void)interactionAction | 69 | - (void)interactionAction |
| 57 | { | 70 | { |
| 58 | LVCInteractionController *intVC = [[LVCInteractionController alloc] init]; | 71 | LVCInteractionController *intVC = [[LVCInteractionController alloc] init]; |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCUGCLivePlayerController.h
0 → 100644
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/Controller/LVCUGCLivePlayerController.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCUGCLivePlayerController.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/17. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCUGCLivePlayerController.h" | ||
| 10 | +#import <CNLivePlayerSDK/CNLiveWebcastManager.h> | ||
| 11 | +#import "LVCUGCPlayerLoadingView.h" | ||
| 12 | +#import "LVCUGCBackgroundView.h" | ||
| 13 | + | ||
| 14 | +#define KAppId @"60_irn9edco29" | ||
| 15 | +#define KAppKey @"69fe70bda67e059286ad509d9f5377f815955645b52f94" | ||
| 16 | + | ||
| 17 | +@interface LVCUGCLivePlayerController () | ||
| 18 | + | ||
| 19 | +@property (nonatomic, strong) CNLiveMoviePlayerController *player;// 播放器 | ||
| 20 | + | ||
| 21 | +@property (nonatomic, strong) LVCUGCBackgroundView *bgView; // 背景视图 | ||
| 22 | + | ||
| 23 | +@property (nonatomic, strong) LVCUGCPlayerLoadingView *loadingView; // 加载视图 | ||
| 24 | + | ||
| 25 | +@end | ||
| 26 | + | ||
| 27 | +@implementation LVCUGCLivePlayerController | ||
| 28 | + | ||
| 29 | +- (void)viewWillAppear:(BOOL)animated { | ||
| 30 | + | ||
| 31 | + [super viewWillAppear:animated]; | ||
| 32 | + | ||
| 33 | + self.navigationController.navigationBar.hidden = YES; | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +- (void)viewWillDisappear:(BOOL)animated { | ||
| 37 | + | ||
| 38 | + [super viewWillDisappear:animated]; | ||
| 39 | + | ||
| 40 | + self.navigationController.navigationBar.hidden = NO; | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +- (void)viewDidLoad { | ||
| 44 | + [super viewDidLoad]; | ||
| 45 | + | ||
| 46 | + self.view.backgroundColor = [UIColor whiteColor]; | ||
| 47 | + | ||
| 48 | + [self.view addSubview:self.loadingView]; | ||
| 49 | + [self.view addSubview:self.bgView]; | ||
| 50 | + | ||
| 51 | + //添加播放器通知 | ||
| 52 | + [self installMovieNotificationObservers]; | ||
| 53 | + | ||
| 54 | + [[CNLiveWebcastManager manager] initWithAppId:KAppId appKey:KAppKey]; | ||
| 55 | + | ||
| 56 | + //直播播放 | ||
| 57 | + _player = [[CNLiveMoviePlayerController alloc] initLivePlayWithChannelId:@"iOStest" | ||
| 58 | + authSuccess:^{ | ||
| 59 | + | ||
| 60 | + _player.videoDecoderMode = CNLiveMovieVideoDecoderMode_AUTO; | ||
| 61 | + _player.view.frame = self.view.bounds; | ||
| 62 | + _player.shouldAutoplay = YES; | ||
| 63 | + [_player prepareToPlay]; | ||
| 64 | + [self.view addSubview:_player.view]; | ||
| 65 | + [self.view sendSubviewToBack:_player.view]; | ||
| 66 | + | ||
| 67 | + } authFailed:^(NSDictionary *errorInfo) { | ||
| 68 | + NSLog(@"初始化直播播放器失败:%@", errorInfo); | ||
| 69 | + | ||
| 70 | + | ||
| 71 | + } getAnchorStatusResult:^(BOOL result) { | ||
| 72 | + | ||
| 73 | + NSLog(@"-------------获取主播状态%d", result ? YES : NO); | ||
| 74 | + | ||
| 75 | + }]; | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | +#pragma mark - 添加通知监听 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| 79 | +-(void)installMovieNotificationObservers //添加视频播放通知 | ||
| 80 | +{ | ||
| 81 | + //视频加载状态改变 | ||
| 82 | + [[NSNotificationCenter defaultCenter] addObserver:self | ||
| 83 | + selector:@selector(loadStateDidChange:) | ||
| 84 | + name:MPMoviePlayerLoadStateDidChangeNotification | ||
| 85 | + object:nil]; | ||
| 86 | + | ||
| 87 | + //视频播放错误及结束原因 | ||
| 88 | + [[NSNotificationCenter defaultCenter] addObserver:self | ||
| 89 | + selector:@selector(moviePlayBackDidFinish:) | ||
| 90 | + name:MPMoviePlayerPlaybackDidFinishNotification | ||
| 91 | + object:nil]; | ||
| 92 | + | ||
| 93 | + //视频缓冲至可播放状态 | ||
| 94 | + [[NSNotificationCenter defaultCenter] addObserver:self | ||
| 95 | + selector:@selector(mediaIsPreparedToPlayDidChange:) | ||
| 96 | + name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification | ||
| 97 | + object:nil]; | ||
| 98 | + | ||
| 99 | + //视频播放状态改变 | ||
| 100 | + [[NSNotificationCenter defaultCenter] addObserver:self | ||
| 101 | + selector:@selector(moviePlayBackStateDidChange:) | ||
| 102 | + name:MPMoviePlayerPlaybackStateDidChangeNotification | ||
| 103 | + object:nil]; | ||
| 104 | + | ||
| 105 | + | ||
| 106 | + //获取主播状态通知(点播和普通播放不需要注册该通知) | ||
| 107 | + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(anchorStatusChanged:) | ||
| 108 | + name:CNLiveAnchorStatusChangedNotification | ||
| 109 | + object:nil]; | ||
| 110 | + | ||
| 111 | +} | ||
| 112 | + | ||
| 113 | +#pragma mark - 移除通知 | ||
| 114 | +- (void)removeMovieNotificationObservers | ||
| 115 | +{ | ||
| 116 | + [[NSNotificationCenter defaultCenter]removeObserver:self | ||
| 117 | + name:MPMoviePlayerLoadStateDidChangeNotification | ||
| 118 | + object:nil]; | ||
| 119 | + [[NSNotificationCenter defaultCenter]removeObserver:self | ||
| 120 | + name:MPMoviePlayerPlaybackDidFinishNotification | ||
| 121 | + object:nil]; | ||
| 122 | + [[NSNotificationCenter defaultCenter]removeObserver:self | ||
| 123 | + name:MPMediaPlaybackIsPreparedToPlayDidChangeNotification | ||
| 124 | + object:nil]; | ||
| 125 | + [[NSNotificationCenter defaultCenter]removeObserver:self | ||
| 126 | + name:MPMoviePlayerPlaybackStateDidChangeNotification | ||
| 127 | + object:nil]; | ||
| 128 | + | ||
| 129 | + [[NSNotificationCenter defaultCenter]removeObserver:self | ||
| 130 | + name:CNLiveAnchorStatusChangedNotification | ||
| 131 | + object:nil]; | ||
| 132 | +} | ||
| 133 | + | ||
| 134 | +#pragma mark - 通知 Action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| 135 | +//视频加载状态改变 | ||
| 136 | +- (void)loadStateDidChange:(NSNotification *)notification | ||
| 137 | +{ | ||
| 138 | + if (_player) { | ||
| 139 | + MPMovieLoadState loadState = _player.loadState; | ||
| 140 | + if ((loadState & MPMovieLoadStatePlaythroughOK) != 0) { | ||
| 141 | + | ||
| 142 | + NSLog(@"loadStateDidChange: MPMovieLoadStatePlaythroughOK: %d\n", (int)loadState); | ||
| 143 | + | ||
| 144 | + } else if ((loadState & MPMovieLoadStateStalled) != 0) { | ||
| 145 | + NSLog(@"loadStateDidChange: MPMovieLoadStateStalled: %d\n", (int)loadState); | ||
| 146 | + | ||
| 147 | + } else { | ||
| 148 | + NSLog(@"loadStateDidChange: ???: %d\n", (int)loadState); | ||
| 149 | + } | ||
| 150 | + } | ||
| 151 | +} | ||
| 152 | + | ||
| 153 | +//视频播放错误及结束原因 | ||
| 154 | +- (void)moviePlayBackDidFinish:(NSNotification *)notification | ||
| 155 | +{ | ||
| 156 | + if (_player) { | ||
| 157 | + int reason = [[[notification userInfo] valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue]; | ||
| 158 | + if (MPMovieFinishReasonPlaybackError == reason) { | ||
| 159 | + | ||
| 160 | + | ||
| 161 | + } else { | ||
| 162 | + | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + switch (reason) | ||
| 166 | + { | ||
| 167 | + case MPMovieFinishReasonPlaybackEnded: | ||
| 168 | + NSLog(@"playbackStateDidChange: MPMovieFinishReasonPlaybackEnded: %d\n", reason); | ||
| 169 | + break; | ||
| 170 | + | ||
| 171 | + case MPMovieFinishReasonUserExited: | ||
| 172 | + NSLog(@"playbackStateDidChange: MPMovieFinishReasonUserExited: %d\n", reason); | ||
| 173 | + break; | ||
| 174 | + | ||
| 175 | + case MPMovieFinishReasonPlaybackError: | ||
| 176 | + NSLog(@"playbackStateDidChange: MPMovieFinishReasonPlaybackError: %d\n", reason); | ||
| 177 | + break; | ||
| 178 | + | ||
| 179 | + default: | ||
| 180 | + NSLog(@"playbackPlayBackDidFinish: ???: %d\n", reason); | ||
| 181 | + break; | ||
| 182 | + } | ||
| 183 | + } | ||
| 184 | +} | ||
| 185 | + | ||
| 186 | +//视频缓冲至可播放状态 | ||
| 187 | +- (void)mediaIsPreparedToPlayDidChange:(NSNotification *)notification | ||
| 188 | +{ | ||
| 189 | + if (_player) { | ||
| 190 | + NSLog(@"isPreparedToPlay"); | ||
| 191 | + if (_loadingView) { | ||
| 192 | + [_loadingView removeFromSuperview]; | ||
| 193 | + } | ||
| 194 | + } | ||
| 195 | +} | ||
| 196 | + | ||
| 197 | +//视频播放状态改变 | ||
| 198 | +- (void)moviePlayBackStateDidChange:(NSNotification *)notification | ||
| 199 | +{ | ||
| 200 | + if (_player) { | ||
| 201 | + | ||
| 202 | + switch (_player.playbackState) { | ||
| 203 | + case MPMoviePlaybackStateStopped: { | ||
| 204 | + | ||
| 205 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateStopped"); | ||
| 206 | + break; | ||
| 207 | + } | ||
| 208 | + case MPMoviePlaybackStatePlaying: { | ||
| 209 | + | ||
| 210 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStatePlaying"); | ||
| 211 | + break; | ||
| 212 | + } | ||
| 213 | + case MPMoviePlaybackStatePaused: | ||
| 214 | + | ||
| 215 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStatePaused"); | ||
| 216 | + break; | ||
| 217 | + case MPMoviePlaybackStateInterrupted: | ||
| 218 | + | ||
| 219 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateInterrupted"); | ||
| 220 | + break; | ||
| 221 | + case MPMoviePlaybackStateSeekingForward: | ||
| 222 | + | ||
| 223 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateSeekingForward"); | ||
| 224 | + break; | ||
| 225 | + case MPMoviePlaybackStateSeekingBackward: | ||
| 226 | + | ||
| 227 | + NSLog(@"moviePlayBackStateDidChange : MPMoviePlaybackStateSeekingBackward"); | ||
| 228 | + break; | ||
| 229 | + default: | ||
| 230 | + | ||
| 231 | + NSLog(@"moviePlayBackStateDidChange : %ld", (long)_player.playbackState); | ||
| 232 | + break; | ||
| 233 | + } | ||
| 234 | + } | ||
| 235 | +} | ||
| 236 | + | ||
| 237 | + | ||
| 238 | + | ||
| 239 | +// 获取主播状态通知 | ||
| 240 | +- (void)anchorStatusChanged:(NSNotification *)notification | ||
| 241 | +{ | ||
| 242 | + if (_player.anchorStatus == 2) { // 已结束 | ||
| 243 | + | ||
| 244 | + } | ||
| 245 | + _bgView.anchorStatus = _player.anchorStatus; | ||
| 246 | +} | ||
| 247 | + | ||
| 248 | +//重新连接获取主播状态 | ||
| 249 | +- (void)anchorStatusConnectFailed | ||
| 250 | +{ | ||
| 251 | + | ||
| 252 | +} | ||
| 253 | + | ||
| 254 | +#pragma mark - getter | ||
| 255 | +- (LVCUGCPlayerLoadingView *)loadingView { | ||
| 256 | + | ||
| 257 | + if (!_loadingView) { | ||
| 258 | + _loadingView = [[LVCUGCPlayerLoadingView alloc] initWithFrame:self.view.bounds bgImageURLStr:@""]; | ||
| 259 | + } | ||
| 260 | + return _loadingView; | ||
| 261 | +} | ||
| 262 | + | ||
| 263 | +- (LVCUGCBackgroundView *)bgView { | ||
| 264 | + | ||
| 265 | + if (!_bgView) { | ||
| 266 | + _bgView = [[LVCUGCBackgroundView alloc] init]; | ||
| 267 | + _bgView.backgroundColor = [UIColor whiteColor]; | ||
| 268 | + _bgView.hidden = YES; | ||
| 269 | + } | ||
| 270 | + return _bgView; | ||
| 271 | +} | ||
| 272 | + | ||
| 273 | +#pragma mark - 内存警告 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| 274 | +- (void)didReceiveMemoryWarning { | ||
| 275 | + [super didReceiveMemoryWarning]; | ||
| 276 | + // Dispose of any resources that can be recreated. | ||
| 277 | +} | ||
| 278 | + | ||
| 279 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCUGCBackgroundView.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCUGCBackgroundView.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/20. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +@interface LVCUGCBackgroundView : UIView | ||
| 12 | + | ||
| 13 | +@property (nonatomic, assign) int anchorStatus; //设置主播状态 | ||
| 14 | + | ||
| 15 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCUGCBackgroundView.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCUGCBackgroundView.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/20. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCUGCBackgroundView.h" | ||
| 10 | + | ||
| 11 | +@interface LVCUGCBackgroundView() | ||
| 12 | + | ||
| 13 | +@property (nonatomic, strong) UIImageView *iconView; | ||
| 14 | + | ||
| 15 | +@property (nonatomic, strong) UILabel *nicknameLabel; | ||
| 16 | + | ||
| 17 | +@property (nonatomic, strong) UILabel *playInfoLabel; | ||
| 18 | + | ||
| 19 | +@property (nonatomic, strong) UIButton *backButton; | ||
| 20 | + | ||
| 21 | +@end | ||
| 22 | + | ||
| 23 | +@implementation LVCUGCBackgroundView | ||
| 24 | + | ||
| 25 | + | ||
| 26 | +- (instancetype)initWithFrame:(CGRect)frame | ||
| 27 | +{ | ||
| 28 | + self = [super initWithFrame:frame]; | ||
| 29 | + if (self) { | ||
| 30 | + [self addSubview:self.iconView]; | ||
| 31 | + [self addSubview:self.nicknameLabel]; | ||
| 32 | + [self addSubview:self.playInfoLabel]; | ||
| 33 | + [self addSubview:self.backButton]; | ||
| 34 | + } | ||
| 35 | + return self; | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +#pragma mark - setter !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| 39 | +- (void)setAnchorStatus:(int)anchorStatus | ||
| 40 | +{ | ||
| 41 | + switch (anchorStatus) { | ||
| 42 | + case 0: | ||
| 43 | + self.hidden = YES; | ||
| 44 | + break; | ||
| 45 | + | ||
| 46 | + case 1: | ||
| 47 | + _playInfoLabel.text = @"主播已离开,马上回来~"; | ||
| 48 | + self.hidden = NO; | ||
| 49 | + break; | ||
| 50 | + | ||
| 51 | + case 2: | ||
| 52 | + _playInfoLabel.text = @"直播已结束"; | ||
| 53 | + self.hidden = NO; | ||
| 54 | + break; | ||
| 55 | + | ||
| 56 | + default: | ||
| 57 | + break; | ||
| 58 | + } | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | +#pragma mark - getter !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
| 62 | + | ||
| 63 | +- (UIImageView *)iconView { | ||
| 64 | + | ||
| 65 | + if (!_iconView) { | ||
| 66 | + NSString *path = [[NSBundle mainBundle] pathForResource:@"头像" ofType:@"jpg"]; | ||
| 67 | + UIImage *image = [UIImage imageWithContentsOfFile:path]; | ||
| 68 | + _iconView = [[UIImageView alloc] initWithImage:image]; | ||
| 69 | + _iconView.frame = CGRectMake((SCREEN_WIDTH - 100) * 0.5, 200, 100, 100); | ||
| 70 | + _iconView.layer.cornerRadius = 50; | ||
| 71 | + _iconView.layer.masksToBounds = YES; | ||
| 72 | + } | ||
| 73 | + return _iconView; | ||
| 74 | +} | ||
| 75 | + | ||
| 76 | +- (UILabel *)nicknameLabel { | ||
| 77 | + | ||
| 78 | + if (!_nicknameLabel) { | ||
| 79 | + _nicknameLabel = [[UILabel alloc] initWithFrame:CGRectMake((SCREEN_WIDTH - 100) * 0.5, 310, 100, 30)]; | ||
| 80 | + _nicknameLabel.textAlignment = NSTextAlignmentCenter; | ||
| 81 | + _nicknameLabel.text = @"奥斯卡大家发你看"; | ||
| 82 | + } | ||
| 83 | + return _nicknameLabel; | ||
| 84 | +} | ||
| 85 | + | ||
| 86 | +- (UILabel *)playInfoLabel { | ||
| 87 | + | ||
| 88 | + if (!_playInfoLabel) { | ||
| 89 | + _playInfoLabel = [[UILabel alloc] initWithFrame:CGRectMake((SCREEN_WIDTH - 100) * 0.5, 350, 100, 50)]; | ||
| 90 | + _playInfoLabel.textAlignment = NSTextAlignmentCenter; | ||
| 91 | + _playInfoLabel.font = [UIFont systemFontOfSize:18]; | ||
| 92 | + } | ||
| 93 | + return _playInfoLabel; | ||
| 94 | +} | ||
| 95 | + | ||
| 96 | +- (UIButton *)backButton { | ||
| 97 | + | ||
| 98 | + if (!_backButton) { | ||
| 99 | + _backButton = [UIButton buttonWithType:UIButtonTypeCustom]; | ||
| 100 | + _backButton.frame = CGRectMake((SCREEN_WIDTH - 200) * 0.5, 410, 200, 40); | ||
| 101 | + _backButton.layer.cornerRadius = 20; | ||
| 102 | + _backButton.layer.masksToBounds = YES; | ||
| 103 | + _backButton.titleLabel.text = @"返回列表"; | ||
| 104 | + _backButton.titleLabel.textAlignment = NSTextAlignmentCenter; | ||
| 105 | + _backButton.titleLabel.font = [UIFont systemFontOfSize:18]; | ||
| 106 | + } | ||
| 107 | + return _backButton; | ||
| 108 | +} | ||
| 109 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCUGCPlayerLoadingView.h
0 → 100644
| 1 | +// | ||
| 2 | +// LVCUGCPlayerLoadingView.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/20. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +@interface LVCUGCPlayerLoadingView : UIView | ||
| 12 | + | ||
| 13 | +- (instancetype)initWithFrame:(CGRect)frame bgImageURLStr:(NSString *)bgImageURLStr; | ||
| 14 | + | ||
| 15 | +@end |
LiveVideoCloud/LiveVideoCloud/Classes/Sections/homeSections/View/LVCUGCPlayerLoadingView.m
0 → 100644
| 1 | +// | ||
| 2 | +// LVCUGCPlayerLoadingView.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/20. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "LVCUGCPlayerLoadingView.h" | ||
| 10 | +#import "UIImage+LVCVagueImage.h" | ||
| 11 | + | ||
| 12 | +@interface LVCUGCPlayerLoadingView() { | ||
| 13 | + | ||
| 14 | + NSString *_bgImageURLStr; | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +@property (nonatomic, strong) UIImageView *bgImageView; | ||
| 18 | + | ||
| 19 | +@end | ||
| 20 | + | ||
| 21 | +@implementation LVCUGCPlayerLoadingView | ||
| 22 | + | ||
| 23 | +- (instancetype)initWithFrame:(CGRect)frame bgImageURLStr:(NSString *)bgImageURLStr | ||
| 24 | +{ | ||
| 25 | + self = [super initWithFrame:frame]; | ||
| 26 | + if (self) { | ||
| 27 | + _bgImageURLStr = bgImageURLStr; | ||
| 28 | + [self addSubview:self.bgImageView]; | ||
| 29 | + } | ||
| 30 | + return self; | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +- (UIImageView *)bgImageView { | ||
| 34 | + if (!_bgImageView) { | ||
| 35 | + | ||
| 36 | + NSString *path = [[NSBundle mainBundle] pathForResource:@"UGCLoading" ofType:@"jpeg"]; | ||
| 37 | + UIImage *image = [UIImage imageWithContentsOfFile:path]; | ||
| 38 | + UIImage *blurImage = [UIImage boxblurImage:image withBlurNumber:0.6]; | ||
| 39 | + _bgImageView = [[UIImageView alloc] initWithImage:blurImage]; | ||
| 40 | + _bgImageView.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); | ||
| 41 | + _bgImageView.contentMode = UIViewContentModeScaleAspectFill; | ||
| 42 | + _bgImageView.clipsToBounds = YES; | ||
| 43 | + } | ||
| 44 | + return _bgImageView; | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +@end |
LiveVideoCloud/LiveVideoCloud/Resource/Images/UGCLoading.jpeg
0 → 100644
876 KB
LiveVideoCloud/LiveVideoCloud/Resource/Images/头像.jpg
0 → 100644
4.88 KB
LiveVideoCloud/LiveVideoCloud/UtilKits/Category/UIImage+LVCVagueImage.h
0 → 100644
| 1 | +// | ||
| 2 | +// UIImage+LVCVagueImage.h | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/21. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +@interface UIImage (LVCVagueImage) | ||
| 12 | + | ||
| 13 | ++ (UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur; | ||
| 14 | + | ||
| 15 | +@end |
LiveVideoCloud/LiveVideoCloud/UtilKits/Category/UIImage+LVCVagueImage.m
0 → 100644
| 1 | +// | ||
| 2 | +// UIImage+LVCVagueImage.m | ||
| 3 | +// LiveVideoCloud | ||
| 4 | +// | ||
| 5 | +// Created by cnliveJunBo on 17/3/21. | ||
| 6 | +// Copyright © 2017年 cnlive. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "UIImage+LVCVagueImage.h" | ||
| 10 | +#import <Accelerate/Accelerate.h> | ||
| 11 | + | ||
| 12 | +@implementation UIImage (LVCVagueImage) | ||
| 13 | + | ||
| 14 | ++ (UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur | ||
| 15 | +{ | ||
| 16 | + if (blur < 0.f || blur > 1.f) { | ||
| 17 | + blur = 0.5f; | ||
| 18 | + } | ||
| 19 | + int boxSize = (int)(blur * 40); | ||
| 20 | + boxSize = boxSize - (boxSize % 2) + 1; | ||
| 21 | + CGImageRef img = image.CGImage; | ||
| 22 | + vImage_Buffer inBuffer, outBuffer; | ||
| 23 | + vImage_Error error; | ||
| 24 | + void *pixelBuffer; | ||
| 25 | + //从CGImage中获取数据 | ||
| 26 | + CGDataProviderRef inProvider = CGImageGetDataProvider(img); | ||
| 27 | + CFDataRef inBitmapData = CGDataProviderCopyData(inProvider); | ||
| 28 | + //设置从CGImage获取对象的属性 | ||
| 29 | + inBuffer.width = CGImageGetWidth(img); | ||
| 30 | + inBuffer.height = CGImageGetHeight(img); | ||
| 31 | + inBuffer.rowBytes = CGImageGetBytesPerRow(img); | ||
| 32 | + inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData); | ||
| 33 | + pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img)); | ||
| 34 | + if(pixelBuffer == NULL) | ||
| 35 | + NSLog(@"No pixelbuffer"); | ||
| 36 | + outBuffer.data = pixelBuffer; | ||
| 37 | + outBuffer.width = CGImageGetWidth(img); | ||
| 38 | + outBuffer.height = CGImageGetHeight(img); | ||
| 39 | + outBuffer.rowBytes = CGImageGetBytesPerRow(img); | ||
| 40 | + error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend); | ||
| 41 | + if (error) { | ||
| 42 | + NSLog(@"error from convolution %ld", error); | ||
| 43 | + } | ||
| 44 | + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); | ||
| 45 | + CGContextRef ctx = CGBitmapContextCreate( outBuffer.data, outBuffer.width, outBuffer.height, 8, outBuffer.rowBytes, colorSpace, kCGImageAlphaNoneSkipLast); | ||
| 46 | + CGImageRef imageRef = CGBitmapContextCreateImage (ctx); | ||
| 47 | + UIImage *returnImage = [UIImage imageWithCGImage:imageRef]; | ||
| 48 | + //clean up CGContextRelease(ctx); | ||
| 49 | + CGColorSpaceRelease(colorSpace); | ||
| 50 | + free(pixelBuffer); | ||
| 51 | + CFRelease(inBitmapData); | ||
| 52 | + CGColorSpaceRelease(colorSpace); | ||
| 53 | + CGImageRelease(imageRef); | ||
| 54 | + return returnImage; | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +@end |