要求
要开始使用 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.ttf
和Nunito-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
}