CammentSDK 3.0.2

CammentSDK 3.0.2

Alex Fedosov 维护。



 
依赖库
AMPopTip~> 1.5
Texture~> 2.5
FLAnimatedImage~> 1.0
AWSCognito~> 2.6
AWSCognitoIdentityProvider~> 2.6
AWSIoT~> 2.6
AWSMobileAnalytics~> 2.6
AWSS3~> 2.6
AWSAPIGateway~> 2.6
ReactiveObjC~> 3.1
pop~> 1.0
MBProgressHUD~> 1.1
Tweaks~> 2.2
DateTools~> 2.0
CocoaLumberjack~> 3.4
GVUserDefaults~> 1.0
TLIndexPathTools~> 0.4
Mixpanel~> 3.2
TBStateMachine= 6.10.0
FBSDKCoreKit~> 4.29
FBSDKLoginKit~> 4.29
 

  • 作者
  • Alexander Fedosov

要求

要开始使用 Camment 移动 SDK for iOS,您可以设置 SDK 并创建一个新项目,或者您可以将 SDK 集成到现有的项目中。要使用 SDK,请在您的开发机上安装以下内容:

  • Xcode 7 或更高版本
  • iOS 8.1 或更高版本
  • Cocoapods

设置 Facebook SDK

如果您的 ios 应用程序已经安装了 Facebook SDK,请跳过此步骤。如果您以前还没有使用过,请遵循以下指南:https://developers.facebook.com/docs/ios/getting-started/

将 CammentSDK 框架添加到您的 Xcode 项目中

打开您的 Podfile 并添加 pod 'CammentSDK'

platform :ios, '8.1'

target 'Your target' do
    use_frameworks!
    pod 'CammentSDK'
end

然后运行 pod install

在项目的Info.plist中配置CammentSDK

将以下代码添加到您的Info.plist,以防止iOS的任何限制

<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSExceptionDomains</key>
		<dict>
			<key>cloudfront.net</key>
			<dict>
				<key>NSIncludesSubdomains</key>
				<true/>
				<key>NSThirdPartyExceptionMinimumTLSVersion</key>
				<string>TLSv1.0</string>
				<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
				<false/>
			</dict>
			<key>amazonaws.com</key>
			<dict>
				<key>NSIncludesSubdomains</key>
				<true/>
				<key>NSThirdPartyExceptionMinimumTLSVersion</key>
				<string>TLSv1.0</string>
				<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
				<false/>
			</dict>
			<key>amazonaws.com.cn</key>
			<dict>
				<key>NSIncludesSubdomains</key>
				<true/>
				<key>NSThirdPartyExceptionMinimumTLSVersion</key>
				<string>TLSv1.0</string>
				<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
				<false/>
			</dict>
		</dict>
		<key>NSAllowsArbitraryLoads</key>
		<false/>
	</dict>
	<key>CFBundleURLTypes</key>
	<array>
		<dict>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>camment</string>
			</array>
		</dict>
	</array>
	<key>NSCameraUsageDescription</key>
	<string>Camera is used to create camment chat and have discussions with short videos on your device</string>
	<key>NSMicrophoneUsageDescription</key>
	<string>Microphone is used to create camment chat and have discussions with short videos on your device</string>

将自定义字体复制到您的Xcode项目中

Camment SDK使用自定义字体Nunito-Medium.ttfNunito-Light。确保您已从我们的GitHub下载了字体并将其添加到项目中。您可以通过以下链接下载字体:[https://github.com/camment/sdk-ios/blob/master/Nunito-Medium.ttf](https://github.com/cammen.../[https://github.com/camment/sdk-ios/blob/master/Nunito-Light.ttf](https://github.com/cammen...)

在Info.plist文件中声明自定义字体

<key>UIAppFonts</key>
<array>
  <string>Nunito-Medium.ttf</string>
  <string>Nunito-Light.ttf</string>
</array>

在AppDelegate.m中设置SDK

打开AppDelegate.m并导入CammentSDK头文件

#import <CammentSDK/CammentSDK.h>
#import <CammentSDK/CMFacebookIdentityProvider.h>

向AppDelegate添加以下行

@interface AppDelegate ()
@property (nonatomic, strong) CMFacebookIdentityProvider *facebookIdentityProvider;
@end

...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[FBSDKApplicationDelegate sharedInstance] application:application
                             didFinishLaunchingWithOptions:launchOptions];
    [[CammentSDK instance] application:application didFinishLaunchingWithOptions:launchOptions];
    ...
    return YES;
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
                                                                  openURL:url
                                                        sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                                               annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
                    ];
    [[CammentSDK instance] application:application openURL:url options:options];
    return handled;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(nullable NSString *)sourceApplication
         annotation:(id)annotation
{
    BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
                                                                  openURL:url
                                                        sourceApplication:sourceApplication
                                                               annotation:annotation
                    ];
    [[CammentSDK instance] openURL:url sourceApplication:sourceApplication annotation:annotation];
    return handled;
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [FBSDKAppEvents activateApp];
    [[CammentSDK instance] applicationDidBecomeActive:application];
}

使用API Key配置CammentSDK

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    NSString *apiKey = @"YOUR_API_KEY";
    self.facebookIdentityProvider = [CMFacebookIdentityProvider new];
    [[CammentSDK instance] configureWithApiKey:apiKey
                              identityProvider:self.facebookIdentityProvider];
    ...
}

现在您可以使用CammentSDK了。

在您的视频播放器上方添加CammentSDK覆盖层

打开您希望使用CammentSDK的View Controller,并导入头文件

#import <CammentSDK/CammentSDK.h>

创建一个新的属性,使用CMCammentOverlayController类。此类是所有camment覆盖内部逻辑的容器

@property (nonatomic, strong) CMCammentOverlayController *cammentOverlayController;

在创建Camment覆盖之前,我们需要提供一些配置选项。首先,创建一个显示元数据对象,该对象包含您的显示标识符

CMShowMetadata *metadata = [CMShowMetadata new];
metadata.uuid = @"Any string unique identifier of your show";

显示标识符是任何定义您的显示的字符串。选择任何有意义的uuid。然后我们需要创建一个对象来描述覆盖布局的视觉配置。

CMCammentOverlayLayoutConfig *overlayLayoutConfig = [CMCammentOverlayLayoutConfig new];
// Let's display camment button at bottom right corner
overlayLayoutConfig.cammentButtonLayoutPosition = CMCammentOverlayLayoutPositionBottomRight;

现在实例化控制器并将其subview添加到视图控制器的视图中

self.cammentOverlayController = [[CMCammentOverlayController alloc] initWithShowMetadata:metadata overlayLayoutConfig:overlayLayoutConfig];
[self.cammentOverlayController addToParentViewController:self];
[self.view addSubview:[_cammentOverlayController cammentView]];

适当地布局覆盖subview

-(void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    [[self.cammentOverlayController cammentView] setFrame:self.view.bounds];
}

现在将您的播放器视图添加到camment覆盖中。假设您的播放器变量的名称为myPlayerView,而且是UIView的子类。

[self.cammentOverlayController setContentView:myPlayerView];

检查两个重要的事项

  • myPlayerView没有superview,这意味着您从未以这种方式添加过它:[view addSubview: myPlayerView]
  • 您不能使用默认的 Cocoa Touch 方法 addSubview 将 myPlayerView 添加到 overlay 视图上。您应该使用 setContentView

现在我们基本完成了。还有一个重要的事情需要注意。为了提升用户体验,我们建议用户开始录制评论时静音视频播放器,并在用户播放评论时至少降低音量一半。为了实现这一点,请实现 CMCammentOverlayControllerDelegate 协议。

self.cammentOverlayController.overlayDelegate = self;

该协议提供了四种方法来通知您的评论是否正在录制或播放。

- (void)cammentOverlayDidStartRecording {
    // Mute your player here
}

- (void)cammentOverlayDidFinishRecording {
    // Restore normal volume
}

- (void)cammentOverlayDidStartPlaying {
    // Decrease volume level
}

- (void)cammentOverlayDidFinishPlaying {
    // Restore normal volume
}

配置 CammentSDK UI 代理

Camment SDK 使用 UIAlertController 显示重要消息,如其他用户的邀请。为了确保 UIAlertController 在视图控制器层次结构中的正确位置显示,我们需要处理 UI 代理事件。当 SDK 想要显示通知时,UI 代理有一个方法会被调用。

- (void)cammentSDKWantsPresentViewController:(UIViewController * _Nonnull)viewController;

处理事件的地方取决于您的应用程序架构,但最基本的设置可以在可见的视图控制器中处理此方法。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [CammentSDK instance].sdkUIDelegate = self;
}

- (void)cammentSDKWantsPresentViewController:(UIViewController *_Nonnull)viewController {
    [self presentViewController:viewController animated:YES completion:nil];
}

配置 CammentSDK 代理

当用户加入任何群组时,SDK 会通过 CMCammentSDKDelegate 代理通知您。 wherever it works better for your app. 通常建议在一个可以管理屏幕之间内部导航的对象中实现代理。

@interface YourRouterObject()<CMCammentSDKDelegate>
@end
- (void)didJoinToShow:(CMShowMetadata *)metadata {
  NSString *showUuid = metadata.uuid;
  // open video player for show with uuid
}

同步群组成员间的视频

CammentSDK 确保每个人都同时观看同一节目。所有同步操作都是自动完成的,您只需确保您的视频播放器能够适当响应来自 SDK 的所有事件。第一步是提供 SDK 当前的播放状态,从您的播放器中。我们建议每秒做一次,并在用户按下播放/暂停按钮时立即操作,因此当播放状态发生变化时,您应调用

    CMShowMetadata *metadata = [CMShowMetadata new];
    metadata.uuid = @"YOUR_SHOW_IDENTIFIER";
    [[CammentSDK instance] updateVideoStreamStateIsPlaying:isPlaying
                                                      show:metadata
                                                 timestamp:timeInterval];

isPlaying 使用此代码指示您的视频播放器是否暂停,metadata 是您的节目元数据对象,您使用它来配置评论覆盖,timeInterval 是从节目开始到当前位置的秒数。

看看一些示例。

    // User watched your show for one minute
    [[CammentSDK instance] updateVideoStreamStateIsPlaying:YES
                                                      show:metadata
                                                 timestamp:60];

    // Then paused video
    [[CammentSDK instance] updateVideoStreamStateIsPlaying:NO
                                                      show:metadata
                                                 timestamp:60];
    // Then started  again
    [[CammentSDK instance] updateVideoStreamStateIsPlaying:YES
                                                      show:metadata
                                                 timestamp:60];
    // After 1 second
    [[CammentSDK instance] updateVideoStreamStateIsPlaying:YES
                                                      show:metadata
                                                 timestamp:61];
    // etc

有时 CammentSDK 需要知道您的播放器状态,而无需等待您调用更新方法。为了按请求提供播放器状态,您需要实现 CammentOverlayControllerDelegate 协议中所需的方法。

- (void)cammentOverlayDidRequestPlayerState:(void (^)(BOOL isPlaying, NSTimeInterval timestamp))playerStateBlock {
    // call playerStateBlock with current player state
    // Notice that CammentSDK don't need metadata object at the moment
    playerStateBlock(YES, 62);
}

到目前为止,我们已经在这段之间设置了您的视频播放器和CammentSDK之间的单向通信,因此它了解播放器的位置和状态。如果我们想在多个客户端SDK之间同步视频,应该有一种方法来更改播放器状态。为此,您的应用应订阅来自CammentSDK的新时间戳通知。

- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    // here you setup CammentSDK overlay
    ...
    // Subscribe to notification about player state
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNewTimestamp:) name:CMNewTimestampAvailableVideoPlayerNotification object:[CammentSDK instance]];
    }

- (void)didReceiveNewTimestamp:(NSNotification *)notification {
    NSDictionary *dict = notification.userInfo;
    NSTimeInterval newTimestamp = [(NSNumber *)dict[CMNewTimestampKey] doubleValue];
    BOOL isPlaying = [(NSNumber *)dict[CMVideoIsPlayingKey] boolValue];

    // here you already know if player should be paused or not and the right timestamp
    // pass those values to your video player
}