# 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

  1. ใน Xcode, กดไปที่ File > Add Packages.
  2. ใส่ URL https://github.com/byteark/lighthouse-sdk-native-ios.git.
  3. เลือกเวอร์ชั่นของ SDK
  4. เมื่อสำเร็จ Xcode จะดาวน์โหลด Package ใน Background

# CocoaPods

ใช้ CocoaPods เพื่อติดตั้ง Lighthouse SDK Native

ข้อมูลเพิ่มเติมเกี่ยวกับ CocoaPods (opens new window)

สามารถลง CocoaPods ได้ด้วยการรันคำสั่งนี้ใน Terminal

$ gem install cocoapods
1

ติดตั้ง Lighthouse SDK Native ด้วย Cocoapods

  1. เพิ่ม source ลงไปใน Podfile
source 'git@github.com:byteark/lighthouse-sdk-native-ios-specs.git'
1
  1. เพิ่ม dependency ลงใน Podfile
pod 'LighthouseNativeSDK'
1
  1. ติดตั้ง dependency ด้วยคำสั่ง
$ pod install
1

คำแนะนำ: Cocoapods จะลง SDK จาก Github private repository โดยการใช้ SSH Key, หาท่านยังไม่ได้ตั้งค่า SSH Key สำหรับผู้ใช้งาน Github ปัจจุบัน โปรดทำตามขั้นตอนต่อไปนี้ เพิ่ม SSH Key สำหรับผูัใช้งาน Github (opens new window)

# การติดตั้งและใช้งาน SDK

  1. สร้าง 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:
  }
}
1
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
  1. สร้าง Lighthouse SDK Config Builder โดย การใช้ LighthouseNativeSDKConfigBuilder ซึ่งต้องการ Parameter ได้แก่
  • PlayerDataSource ที่ถูกสร้างจากขั้นตอนที่ 1
  • projectId Project ID ที่ของท่าน
let playerDataSource = PlayerDataSource(with: player)
let configBuilder = LighthouseNativeSDKConfigBuilder(
  playerDataSource: playerDataSource,
  projectId: "YOUR_PROJECT_ID",
  )
1
2
3
4
5
6
  1. สร้างและเพิ่ม 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()
1
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)
1

โดยรายละเอียดของข้อมูลสามารถศึกษาต่อได้ที่นี่ รายละเอียดข้อมูล Metadata

  1. สร้าง LighthouseNativeSDKConfig จาก LighthouseNativeSDKConfigBuilder
let config = configBuilder.build()
1
  1. สร้าง LighthouseNativeSDK ซึ่งต้องการ Parameter ได้แก่
  • PlayerDataSource ที่ถูกสร้างจากขั้นตอนที่ 1
  • Config ที่สร้างจากขั้นตอนที่ 4
let lighthouseSDK = LighthouseNativeSDK(playerDataSource: playerDataSource, config: config)
1
  1. สั่งงาน 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

  1. เมื่อ Player Instance ถูก destroy, สั่งฟังก์ชั่น destroy() เพื่อหยุดใช้งาน Lighthouse
lighthouseSDK.destroy()
1
  1. เมื่อ Source ของวิดีโอถูกเปลี่ยน สั่งฟังก์ชั่น destroy() เพื่อจบการทำงานของ Session และสร้าง Instance ของ Lighthouse ใหม่เพื่อเริ่ม Session ใหม่
lighthouseSDK.destroy()
initLighthouse() // Function to init Lighthouse instance
1
2
3
  1. เมื่อ Application เข้าสู่ Background state และไม่มีการเล่นใน Background สั่งงานฟังก์ชั่น flush() เพื่อส่งข้อมูล Analytic เข้าสู่ Server
lighthouseSDK.flush()
1