# ByteArk Lighthouse SDK สำหรับ iOS
ByteArk Lighthouse SDK รองรับการเชื่อมต่อกับระบบ ByteArk Lighthouse เพื่อเก็บข้อมูลสถิติการรับชมวิดีโอจากทางฝั่ง Client-side ซึ่งจะทำให้ได้ข้อมูลสถิติ และ พฤติกรรมการดูวิดีโอที่ละเอียดขึ้น โดยสามารถ Support Player ที่พัฒนาจาก AVPlayer หรือ Player อื่นๆได้
# สถานะ
- SDK เวอร์ชั่น 0.2.6 เป็น SDK เวอร์ชั่นเสถียรล่าสุดที่ถูกปล่อย
# ความเข้ากันได้
- ByteArk Lighthouse SDK Support iOS 13+
# การติดตั้ง ByteArk Lighthouse SDK
สำหรับตัวอย่าง Source code การ Integrate ByteArk Lighthouse SDK ของ Platform Android สามารถดูตัวอย่างได้ที่ Repository (opens new window) นี้
# การติดตั้ง ByteArk Lighthouse SDK
สามารถติดตั้ง ByteArk Lighthouse SDK ได้ผ่านช่องทางดังนี้
# Swift Package Manager
ใช้ Swift Package Manager เพื่อติดตั้ง Lighthouse SDK Native
- ใน Xcode, กดไปที่ File > Add Packages.
- ใส่ URL
https://github.com/byteark/lighthouse-sdk-native-ios.git
. - เลือกเวอร์ชั่นของ SDK
- เมื่อสำเร็จ Xcode จะดาวน์โหลด Package ใน Background
# CocoaPods
ใช้ CocoaPods เพื่อติดตั้ง Lighthouse SDK Native
ข้อมูลเพิ่มเติมเกี่ยวกับ CocoaPods (opens new window)
สามารถลง CocoaPods ได้ด้วยการรันคำสั่งนี้ใน Terminal
$ gem install cocoapods
ติดตั้ง Lighthouse SDK Native ด้วย Cocoapods
- เพิ่ม source ลงไปใน
Podfile
source 'git@github.com:byteark/lighthouse-sdk-native-ios-specs.git'
- เพิ่ม dependency ลงใน
Podfile
pod 'LighthouseNativeSDK'
- ติดตั้ง dependency ด้วยคำสั่ง
$ pod install
คำแนะนำ: Cocoapods จะลง SDK จาก Github private repository โดยการใช้ SSH Key, หาท่านยังไม่ได้ตั้งค่า SSH Key สำหรับผู้ใช้งาน Github ปัจจุบัน โปรดทำตามขั้นตอนต่อไปนี้ เพิ่ม SSH Key สำหรับผูัใช้งาน Github (opens new window)
# การติดตั้งและใช้งาน SDK
- สร้าง PlayerDataSource โดยการ Implement
IPlayerDataSource
เพื่อสร้างช่องทางในการดึงข้อมูลที่จำเป็นสำหรับการทำ Analytic จาก Player
class PlayerDataSource: IPlayerDataSource {
/// - Returns: your player name, to distinguish platforms.
/// e.g. byteark-player-ios, byteark-player-android, avplayer, exoplayer etc...,
/// EMPTY STRING IS NOT ALLOWED
func playerName() -> String {
// TODO:
}
/// - Returns: Your player version
/// EMPTY STRING IS NOT ALLOWED
func playerVersion() -> String {
// TODO:
}
/// - Returns: An Video Key from ByteArk e.g. RI2PimuHxDXw)
/// EMPTY STRING IS NOT ALLOWED
func mediaId() -> String {
// TODO:
}
/// - Returns: current media's title
func mediaTitle() -> String {
// TODO:
}
/// - Returns: current media's subtitle (short description) or nil
func mediaSubtitle() -> String? {
// TODO:
}
/// - Returns: MediaTypes.live or MediaTypes.vod
func mediaType() -> MediaTypes {
// TODO:
}
/// - Returns: media's URL
/// EMPTY STRING IS NOT ALLOWED
func mediaUrl() -> String {
// TODO:
}
/// - Returns: current media's cover image url string or nil
func coverImageUrl() -> String? {
// TODO:
}
/// Returns: player's current playback time (seconds) when video is VOD or nil when video is live stream
func currentTime() -> KotlinLong? {
// TODO:
}
/// - Returns: video's duration (seconds) e.g. 0 when video is live stream
func duration() -> KotlinLong? {
// TODO:
}
/// - Returns: true when video live stream, false when video is VOD
func isLive() -> Bool {
// TODO:
}
/// - Returns: how autoplay handled, "autoplay" or "manual" or nil if unknown.
func playbackAutoPlay() -> String? {
// TODO:
}
/// - Returns: current playback rate, such as 1.0 for normal speed.
func playbackRate() -> Float {
// TODO:
}
/// - Returns: current media resolution name, such as "1080p" or nil
func playbackResolution() -> String? {
// TODO:
}
/// - Returns:
/// - ResolutionModes.auto when your player automatic select resolution
/// - ResolutionModes.manual when user manual selected resolution
/// - nil
func playbackResolutionMode() -> ResolutionModes? {
// TODO:
}
/// - Returns: calculated bandwidth estimate when download video or nil
func playbackBandwidthEstimate() -> KotlinFloat? {
// TODO:
}
/// - Returns: calculated current buffer health or nil
func bufferHealth() -> KotlinFloat? {
// TODO:
}
/// - Returns: player's width or nil
func playerWidth() -> KotlinLong? {
// TODO:
}
/// - Returns: player's height or nil
func playerHeight() -> KotlinLong? {
// TODO:
}
/// - Returns: video's width or nil
func videoWidth() -> KotlinLong? {
// TODO:
}
/// - Returns: video's height or nil
func videHeight() -> KotlinLong? {
// TODO:
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
- สร้าง Lighthouse SDK Config Builder โดย การใช้
LighthouseNativeSDKConfigBuilder
ซึ่งต้องการ Parameter ได้แก่
PlayerDataSource
ที่ถูกสร้างจากขั้นตอนที่ 1projectId
Project ID ที่ของท่าน
let playerDataSource = PlayerDataSource(with: player)
let configBuilder = LighthouseNativeSDKConfigBuilder(
playerDataSource: playerDataSource,
projectId: "YOUR_PROJECT_ID",
)
2
3
4
5
6
- สร้างและเพิ่ม Metadata ของ Playback ที่กำลังเล่น (Optional)
สามารถเพิ่มข้อมูล PlaybackMetadata
ให้ Playback โดย การใช้ PlaybackMetadataBuilder
let metadataBuilder = PlaybackMetadataBuilder()
metadataBuilder.userId(USER_ID)
metadataBuilder.age(AGE)
metadataBuilder.country(COUNTRY)
metadataBuilder.city(CITY)
metadataBuilder.lat(LAT)
metadataBuilder.long(LONG)
metadataBuilder.gender(GENDER)
metadataBuilder.nationality(NATIONALITY)
metadataBuilder.subscriptionPlan(SUBSCRIPTION_PLAN)
metadataBuilder.accountCreationDate(ACCOUNT_CREATION_DATE)
metadataBuilder.videoTitle(videoItem.title)
metadataBuilder.seriesId(SERIES_ID)
metadataBuilder.seriesTitle(SERIES_TITLE)
metadataBuilder.season(SEASON)
metadataBuilder.episode(EPISODE)
metadataBuilder.subEpisode(SUB_EPISODE)
metadataBuilder.duration(DURATION)
metadataBuilder.publishedDate(PUBLISHED_DATE)
metadataBuilder.genres(GENRES)
metadataBuilder.rating(RATING)
metadataBuilder.d1(D1)
metadataBuilder.d2(D2)
metadataBuilder.d3(D3)
metadataBuilder.d4(D4)
metadataBuilder.d5(D5)
metadataBuilder.d6(D6)
metadataBuilder.d7(D7)
metadataBuilder.d8(D8)
metadataBuilder.d9(D9)
metadataBuilder.d10(D10)
let metadata = metadataBuilder.build()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
จากนั้นสามารถเพิ่ม PlaybackMetadata
แนบไปร่วมกับ LighthouseNativeSDKConfig
ได้โดยการใช้ฟังก์ชั่น
configBuilder.playbackMetaData(metadata)
โดยรายละเอียดของข้อมูลสามารถศึกษาต่อได้ที่นี่ รายละเอียดข้อมูล Metadata
- สร้าง
LighthouseNativeSDKConfig
จากLighthouseNativeSDKConfigBuilder
let config = configBuilder.build()
- สร้าง
LighthouseNativeSDK
ซึ่งต้องการ Parameter ได้แก่
PlayerDataSource
ที่ถูกสร้างจากขั้นตอนที่ 1Config
ที่สร้างจากขั้นตอนที่ 4
let lighthouseSDK = LighthouseNativeSDK(playerDataSource: playerDataSource, config: config)
- สั่งงาน Function จาก
lighthouseSDK
เพื่อเก็บข้อมูลการเล่นวิดีโอของผู้ใช้โดยอิงจาก Player Event และ Ad Event ตามตารางข้างต้นนี้
player's event | lighthouse sdk's method |
---|---|
ready | playerReady() |
load start | loadStart() |
loaded data | loadedData() |
first play | firstPlayStart() |
play | playerPlay() |
pause | playerPause() |
buffer start | bufferStart() |
buffer stop | bufferStop() |
seek start | seekStart() |
seek stop | seekStop() |
error | error() |
time update | timeUpdate() |
playback rate change | rateChange() |
resolution change | resolutionChange() |
player's resize | playerResize() |
end | playerEnd() |
exit | exit() |
player's ad event | lighthouse sdk's method |
---|---|
ad request | adRequest() |
ad load | adLoad() |
ad start | adStart() |
ad first quartile | adFirstQuartile() |
ad mid point | adMidPoint() |
ad third quartile | adThirdQuartile() |
ad complete | adComplete() |
ad all complete | adAllComplete() |
ad skipped | adSkipped() |
ad click | adClick() |
ad error | adError() |
ad impression | adImpression() |
โดยรายละเอียดของข้อมูลสามารถศึกษาต่อได้ที่นี่ รายละเอียดข้อมูล Player Event
- เมื่อ Player Instance ถูก destroy, สั่งฟังก์ชั่น
destroy()
เพื่อหยุดใช้งาน Lighthouse
lighthouseSDK.destroy()
- เมื่อ Source ของวิดีโอถูกเปลี่ยน สั่งฟังก์ชั่น
destroy()
เพื่อจบการทำงานของ Session และสร้าง Instance ของ Lighthouse ใหม่เพื่อเริ่ม Session ใหม่
lighthouseSDK.destroy()
initLighthouse() // Function to init Lighthouse instance
2
3
- เมื่อ Application เข้าสู่ Background state และไม่มีการเล่นใน Background สั่งงานฟังก์ชั่น
flush()
เพื่อส่งข้อมูล Analytic เข้าสู่ Server
lighthouseSDK.flush()