This project is an open source version of White-SDK-IOS. In order to better display the source code structure, 'Whiteboard' divided the project into several 'subpods', which is more conducive to developers to view the source code level of the project. To do this, you need to modify the reference relationship.
pod 'Whiteboard'
dependencies: [
.package(url: "https://github.com/netless-io/Whiteboard-iOS.git", .upToNextMajor(from: "2.15.0"))
]
cd Example
pod install
Go to the Example folder and open the Example.xcworkspace
project file.
At the same time in
WhiteUtils.m
fill inWhiteSDKToken
,WhiteAppIdentifier
according to the code comment
/* FIXME: sdkToken
Please register at https://console.netless.link and get the SDK token
This SDK token should not be stored on the client side, and all requests involving SDK tokens (all requests in the current class) should be placed on the server to avoid unnecessary risks caused by leaks.
*/
#define WhiteSDKToken <#@sdk Token#>
#define WhiteAppIdentifier <#@App identifier#>
If you need to go to a specific room for debugging, go to the Whiteboard-Prefix.pch
file, uncomment WhiteRoomUUID
and WhiteRoomToken
and fill in the specified contents.
// If you add WhiteRoomUUID and WhiteRoomToken, then, you can define WhiteSDKToken as @""
//#define WhiteSDKToken <#@sdk Token#>
//#define WhiteAppIdentifier <#@App identifier#>
// If you need access to a specific room, uncomment the following two lines and fill in the corresponding UUID and RoomToken
//#define WhiteRoomUUID <#Room UUID#>
//#define WhiteRoomToken <#Room Token#>
At this point, if you add or replay a room, you will enter that room.
Unit tests need to test some special behaviors, so the following operations are required for the corresponding room:
Running device: iOS 10 + Development environment: Xcode 10+
SDK is composed of multiple subpods
, and the dependency structure is shown in the following figure:
parameter configuration class: A class used to describe and store API parameters, return values, status, and other configuration items. Mainly used to interact with
webview
.
JSON
conversion via YYModel
. Contains the following parts:
Object
base class, the base class of all the parameters used in the SDK
configuration class.Room
and Player
API.SDK
Displayer
and some related classes, mainly as follows:
WhiteSDK
and its initialization parameter class.whiteCommonCallbacks
set byWhiteSDK
Displayer
as Room
and Player
.Displayer
API.Displayer
is a class used to describe the current RoomState. It is the base class of RoomState
and PlayerState
.Room
class, and its related event callback class.WhiteSDK+Room
, using the SDK
API to create Room
.Room
.Room
.Player
class, and its related event callback class.WhiteSDK+Player
, using the SDK
API to create Player
.Player
specific parameter configuration class.Player
.iOS
side, and synchronize with the whiteboard playing state
WhiteCombinePlayer
class, and some of its related classes.SDK now supports CombinePlayer to play audio and video in the Native end, and SDK will be responsible for synchronizing the state of audio and video with the whiteboard playback.
Specific code examples, see WhitePlayerViewController
m3u8 format of the audio and video, may need to be after a combinePlayerEndBuffering calls to
seek
. (otherwise it may still start playing from the original position)
#import <Whiteboard/Whiteboard.h>
@implementation WhitePlayerViewController
- (void)initPlayer
{
// Create WhitePlayer logic
// 1. Configure SDK initialization parameters, more parameters, see the WhitesdkConfiguration header file
WhiteSdkConfiguration *config = [[WhiteSdkConfiguration alloc] initWithApp:[WhiteUtils appIdentifier]];
// 2. Initialize the SDK
self.sdk = [[WhiteSDK alloc] initWithWhiteBoardView:self.boardView config:config commonCallbackDelegate:self.commonDelegate];
// 3. WhitePlayerConfig, Room UUID and RoomToken are required. For more parameters, see the WhitePlayerConfig.h header file
WhitePlayerConfig *playerConfig = [[WhitePlayerConfig alloc] initWithRoom:self.roomUuid roomToken:self.roomToken];
// This is an example of how to do this
self.combinePlayer = [[WhiteCombinePlayer alloc] initWithMediaUrl:[NSURL URLWithString:@"https://netless-media.oss-cn-hangzhou.aliyuncs.com/c447a98ece45696f09c7fc88f649c082_3002a61acef14e4aa1b0154f734a991d.m3u8"]];
// Display the AVPlayer screen
[self.videoView setAVPlayer:self.combinePlayer.nativePlayer];
// Configure the Delegate
self.combinePlayer.delegate = self;
[self.sdk createReplayerWithConfig:playerConfig callbacks:self.eventDelegate completionHandler:^(BOOL success, WhitePlayer * _Nonnull player, NSError * _Nonnull error) {
if (self.playBlock) {
self.playBlock(player, error);
} else if (error) {
NSLog(@"Failed to create playback room error:%@", [error localizedDescription]);
} else {
self.player = player;
[self.player addHighFrequencyEventListener:@"a" fireInterval:1000];
//Config WhitePlayer
self.combinePlayer.whitePlayer = player;
//WhitePlayer need to manually seek to 0 to trigger the buffering behavior
[player seekToScheduleTime:0];
}
}];
}
#pragma mark - WhitePlayerEventDelegate
- (void)phaseChanged:(WhitePlayerPhase)phase
{
NSLog(@"player %s %ld", __FUNCTION__, (long)phase);
// Attention! This must be done for the WhiteCombinePlayer to properly synchronize the state
[self.combinePlayer updateWhitePlayerPhase:phase];
}
// Other callback methods...
#pragma mark - WhiteCombinePlayerDelegate
- (void)combinePlayerStartBuffering
{
//Either end goes into the buffer
NSLog(@"combinePlayerStartBuffering");
}
- (void)combinePlayerEndBuffering
{
//Both ends end buffering
NSLog(@"combinePlayerEndBuffering");
}
@end
Principle: Download all the required dynamic-conversion-zip in advance, use the custom Scheme request supported by WKWebView iOS 11, intercept the WebView request, and return the local resources on the local side.
For specific implementation, please check the Git record:
add dependency to demo for ppt zip feature
implement local zip
Note that the current demo, realizes the interception, also need to
WhiteBaseViewController. M
, theWhitePptParams
scheme parameter of the tokPPTScheme
.
Custom App plugin can extend the whiteboard functionality, users write js code to implement their own whiteboard plugin.
How to Develop Custom Whiteboard App
Native side needs to register the corresponding App to the SDK when using the custom App.
The registration method is registerAppWithParams:
of WhiteSDk
.
where WhiteRegisterAppParams
has two ways to generate.
@interface WhiteRegisterAppParams : WhiteObject
/** Create a custom app generated by js code
@param javascriptString js code string
@param kind plug-in type name, needs to be consistent across multiple ends
@param appOptions additional parameters for plugin registration, fill in as needed
@param variable The name of the app variable to be inserted in the above injected javascript
*/
+ (instancetype)paramsWithJavascriptString: (NSString *)javascriptString kind:(NSString *)kind appOptions:(NSDictionary *)appOptions variable:(NSString *)variable;
@interface WhiteRegisterAppParams : WhiteObject
/** Create a custom app generated by remote js
@param url js address
@param kind The name of the plugin type, which needs to be consistent across multiple ends. (The whiteboard will use this name to find the app entry)
@param appOptions Additional parameters for plugin registration, fill in as needed
*/
+ (instancetype)paramsWithUrl: (NSString *)url kind:(NSString *)kind appOptions:(NSDictionary *)appOptions;
The method to add a custom App is addApp:comletionHandler:
of WhiteRoom
where WhiteAppParam
is used to describe your custom app
Please call this method to complete the initialization of WhiteAppParam
@interface WhiteAppParam : WhiteObject
/* Specific App, generally used to create custom App insertion parameters
@param kind The kind used when registering the App
@param options See [WhiteAppOptions](https://raw.github.com/netless-io/Whiteboard-iOS/master/WhiteAppOptions) for details
@param attrs Parameters to initialize the App, fill in as needed
*/
- (instancetype)initWithKind:(NSString *)kind options:(WhiteAppOptions *)options attrs:(NSDictionary *)attrs;
navigationDelegate
of WhiteBoardView
to listen to webViewWebContentProcessDidTerminate:
method. This method will be called when the whiteboard is killed and you can prompt the user to reconnect to resume the whiteboard in this method.#import "YYModel.h"
needs to be replaced with #if __has_include(<YYModel/YYModel.h>) #import <YYModel/YYModel.h>
.Whiteboard/Whiteboard-YYKit
with Whiteboard
. The YYModel code has been Forked to White_YYModel as YYModel no longer supports Xcode 15 integration.link |
Stars: 25 |
Last commit: 4 days ago |
Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics