wenweiwei преди 3 години
родител
ревизия
d6fa186923

+ 2 - 2
BFFramework.podspec

@@ -8,7 +8,7 @@
 
 Pod::Spec.new do |s|
   s.name             = 'BFFramework'
-  s.version          = '1.0.6'
+  s.version          = '1.0.7'
   s.summary          = 'Byte fllow 基础组件库'
   s.swift_version    = '5.0'
 # This description is used to generate tags and improve search results.
@@ -21,7 +21,7 @@ Pod::Spec.new do |s|
 TODO: Add long description of the pod here.
                        DESC
 
-  s.homepage         = 'https://github.com/287971051@qq.com/BFFramework'
+  s.homepage         = 'https://git.yishihui.com/iOS'
   # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
   s.license          = { :type => 'MIT', :file => 'LICENSE' }
   s.author           = { '287971051@qq.com' => '287971051@qq.com' }

+ 184 - 23
BFFramework/Classes/BFModules/BFUtility/PQSingletoVideoPlayer.swift

@@ -7,12 +7,14 @@
 //  Copyright © 2020 BytesFlow. All rights reserved.
 //
 
-import UIKit
 import BFCommonKit
+import UIKit
 
 public class PQSingletoVideoPlayer: NSObject {
     public static let shared = PQSingletoVideoPlayer()
     public var isPlayEnd: Bool = false // 是否已播放完成
+    public var isHomePageAllList: Bool = false // 首页加入/关注是否是全部列表
+    public var lastPlaybackTime: Float = 0 // 上次上报播放时长
     public var isRealPlay: Bool = false // 是否已真实播放
     public var isSemiRealPlay: Bool = false // 是否已播放到十秒
     public var isPlayBegin: Bool = false // 是否已缓冲完成开始播放
@@ -29,8 +31,9 @@ public class PQSingletoVideoPlayer: NSObject {
     public var isPlaying: Bool {
         return player.isPlaying()
     }
-    public var autoResumePlayWhenEnterForeground:Bool = true
-    var shouldResumePlayWhenEnterForeground:Bool = false
+
+    public var autoResumePlayWhenEnterForeground: Bool = true
+    var shouldResumePlayWhenEnterForeground: Bool = false
 
     public lazy var player: TXVodPlayer = {
         let player = TXVodPlayer()
@@ -47,10 +50,11 @@ public class PQSingletoVideoPlayer: NSObject {
     /// - Parameters:
     ///   - videoData: <#videoData description#>
     ///   - controllerView: <#controllerView description#>
-    public func configPlyer(videoData: BFVideoItemProtocol, controllerView: UIView, renderMode: TX_Enum_Type_RenderMode = .RENDER_MODE_FILL_SCREEN) {
+    public func configPlyer(videoData: BFVideoItemProtocol, controllerView: UIView, renderMode: TX_Enum_Type_RenderMode = .RENDER_MODE_FILL_SCREEN, isAllList: Bool = false) {
 //        if playVideoData?.id == videoData.id {
 //            return
 //        }
+        isHomePageAllList = isAllList
         isPlayEnd = false
         isRealPlay = false
         isSemiRealPlay = false
@@ -77,12 +81,13 @@ public class PQSingletoVideoPlayer: NSObject {
             player.setStartTime(progress)
         }
         playId = getUniqueId(desc: "playId")
+        lastPlaybackTime = 0
         BFLog(message: "\(String(describing: videoData.title)) 开始播放 \(videoData.videoPath ?? "")")
         if PQSingletoMemoryUtil.shared.playCount < 4 {
             PQSingletoMemoryUtil.shared.playCount = PQSingletoMemoryUtil.shared.playCount + 1
         }
     }
-    
+
     public func reRenderView(newView: UIView) {
         player.removeVideoWidget()
         player.setupVideoWidget(newView, insert: 0)
@@ -91,6 +96,20 @@ public class PQSingletoVideoPlayer: NSObject {
     /// 重制播放
     public func resetPlayer() {
         if playControllerView != nil {
+            let playDuration = player.currentPlaybackTime() - lastPlaybackTime
+            debugPrint("当前播放时长:\(player.currentPlaybackTime()),lastPlaybackTime:\(lastPlaybackTime),playDuration:\(playDuration)")
+            if playDuration > 0 {
+                var extParams: [String: Any]?
+                if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                    extParams = ["topicId": isHomePageAllList ? "all" : "\(playVideoData?.topicData?["id"] ?? "")"]
+                } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                    extParams = ["followedUid": isHomePageAllList ? "all" : "\(playVideoData?.user?["uid"] ?? "")"]
+                } else if (playVideoData?.pageSource == .sp_cmunit_newTopicDetail || playVideoData?.pageSource == .sp_cmunit_hotTopicDetail) {
+                    extParams = ["topicId": "\(playVideoData?.topicData?["id"] ?? "")"]
+                }
+                PQEventTrackViewModel.baseReportUpload(logType: .st_log_type_pLayaction, businessType: .bt_videoPlayDuration, objectType: nil, pageSource: playVideoData?.pageSource ?? .sp_cmunit_recommend, eventData: ["pageSource": (playVideoData?.pageSource ?? .sp_cmunit_recommend).rawValue, "playDuration": Int64(playDuration * 1000), "playId": playId, "uid": "\(playVideoData?.user?["uid"] ?? "")", "videoId": playVideoData?.id ?? 0], extParams: extParams, remindmsg: "播放时长统计")
+                lastPlaybackTime = player.currentPlaybackTime()
+            }
             player.removeVideoWidget()
             player.setupVideoWidget(playControllerView, insert: 0)
             if playVideoData!.playProgress >= 0.0 {
@@ -122,6 +141,20 @@ public class PQSingletoVideoPlayer: NSObject {
     /// 暂停播放
     public func pausePlayer() {
         player.pause()
+        let playDuration = player.currentPlaybackTime() - lastPlaybackTime
+        debugPrint("当前播放时长:\(player.currentPlaybackTime()),lastPlaybackTime:\(lastPlaybackTime),playDuration:\(playDuration)")
+        if playDuration > 0 {
+            var extParams: [String: Any]?
+            if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                extParams = ["topicId": isHomePageAllList ? "all" : "\(playVideoData?.topicData?["id"] ?? "")"]
+            } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                extParams = ["followedUid": isHomePageAllList ? "all" : "\(playVideoData?.user?["uid"] ?? "")"]
+            } else if (playVideoData?.pageSource == .sp_cmunit_newTopicDetail || playVideoData?.pageSource == .sp_cmunit_hotTopicDetail) {
+                extParams = ["topicId": "\(playVideoData?.topicData?["id"] ?? "")"]
+            }
+            PQEventTrackViewModel.baseReportUpload(logType: .st_log_type_pLayaction, businessType: .bt_videoPlayDuration, objectType: nil, pageSource: playVideoData?.pageSource ?? .sp_cmunit_recommend, eventData: ["pageSource": (playVideoData?.pageSource ?? .sp_cmunit_recommend).rawValue, "playDuration": Int64(playDuration * 1000), "playId": playId, "uid": "\(playVideoData?.user?["uid"] ?? "")", "videoId": playVideoData?.id ?? 0], extParams: extParams, remindmsg: "播放时长统计")
+            lastPlaybackTime = player.currentPlaybackTime()
+        }
     }
 
     /// 继续播放
@@ -130,6 +163,20 @@ public class PQSingletoVideoPlayer: NSObject {
         if renderMode != nil {
             player.setRenderMode(renderMode!)
         }
+        let playDuration = player.currentPlaybackTime() - lastPlaybackTime
+        debugPrint("当前播放时长:\(player.currentPlaybackTime()),lastPlaybackTime:\(lastPlaybackTime),playDuration:\(playDuration)")
+        if playDuration > 0 {
+            var extParams: [String: Any]?
+            if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                extParams = ["topicId": isHomePageAllList ? "all" : "\(playVideoData?.topicData?["id"] ?? "")"]
+            } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                extParams = ["followedUid": isHomePageAllList ? "all" : "\(playVideoData?.user?["uid"] ?? "")"]
+            } else if (playVideoData?.pageSource == .sp_cmunit_newTopicDetail || playVideoData?.pageSource == .sp_cmunit_hotTopicDetail) {
+                extParams = ["topicId": "\(playVideoData?.topicData?["id"] ?? "")"]
+            }
+            PQEventTrackViewModel.baseReportUpload(logType: .st_log_type_pLayaction, businessType: .bt_videoPlayDuration, objectType: nil, pageSource: playVideoData?.pageSource ?? .sp_cmunit_recommend, eventData: ["pageSource": (playVideoData?.pageSource ?? .sp_cmunit_recommend).rawValue, "playDuration": Int64(playDuration * 1000), "playId": playId, "uid": "\(playVideoData?.user?["uid"] ?? "")", "videoId": playVideoData?.id ?? 0], extParams: extParams, remindmsg: "播放时长统计")
+            lastPlaybackTime = player.currentPlaybackTime()
+        }
     }
 
     /// 停止播放
@@ -141,6 +188,20 @@ public class PQSingletoVideoPlayer: NSObject {
             playControllerView = nil
             playVideoData = nil
         }
+        let playDuration = player.currentPlaybackTime() - lastPlaybackTime
+        debugPrint("当前播放时长:\(player.currentPlaybackTime()),lastPlaybackTime:\(lastPlaybackTime),playDuration:\(playDuration)")
+        if playDuration > 0 {
+            var extParams: [String: Any]?
+            if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                extParams = ["topicId": isHomePageAllList ? "all" : "\(playVideoData?.topicData?["id"] ?? "")"]
+            } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                extParams = ["followedUid": isHomePageAllList ? "all" : "\(playVideoData?.user?["uid"] ?? "")"]
+            } else if (playVideoData?.pageSource == .sp_cmunit_newTopicDetail || playVideoData?.pageSource == .sp_cmunit_hotTopicDetail){
+                extParams = ["topicId": "\(playVideoData?.topicData?["id"] ?? "")"]
+            }
+            PQEventTrackViewModel.baseReportUpload(logType: .st_log_type_pLayaction, businessType: .bt_videoPlayDuration, objectType: nil, pageSource: playVideoData?.pageSource ?? .sp_cmunit_recommend, eventData: ["pageSource": (playVideoData?.pageSource ?? .sp_cmunit_recommend).rawValue, "playDuration": Int64(playDuration * 1000), "playId": playId, "uid": "\(playVideoData?.user?["uid"] ?? "")", "videoId": playVideoData?.id ?? 0], extParams: extParams, remindmsg: "播放时长统计")
+            lastPlaybackTime = player.currentPlaybackTime()
+        }
     }
 
     /// seek
@@ -152,23 +213,20 @@ public class PQSingletoVideoPlayer: NSObject {
     override private init() {
         super.init()
 
-        NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: nil) { notice in
+        NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: nil) { _ in
             if self.isPlaying {
                 self.pausePlayer()
                 self.shouldResumePlayWhenEnterForeground = true
             }
         }
-        NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: nil) { notice in
-            
-            if self.autoResumePlayWhenEnterForeground && self.shouldResumePlayWhenEnterForeground {
+        NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: nil) { _ in
 
+            if self.autoResumePlayWhenEnterForeground, self.shouldResumePlayWhenEnterForeground {
                 self.shouldResumePlayWhenEnterForeground = false
 
                 self.resumePlayer()
-
             }
         }
-
     }
 
     override public func copy() -> Any {
@@ -203,7 +261,15 @@ extension PQSingletoVideoPlayer: TXVodPlayListener {
                 if !isSemiRealPlay, playVideoData != nil {
                     isSemiRealPlay = true
                     // 播放上报
-                    PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoSemiRealPlay, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+                    var extParams: [String: Any]?
+                    if isHomePageAllList {
+                        if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                            extParams = ["topicId": "all"]
+                        } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                            extParams = ["followedUid": "all"]
+                        }
+                    }
+                    PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoSemiRealPlay, objectType: nil, extParams: extParams, shareId: nil, videoIds: nil, playId: playId)
                 }
             }
             if player.currentPlaybackTime() >= 20.0 || ((playProgress / duration) >= 0.3) {
@@ -211,7 +277,15 @@ extension PQSingletoVideoPlayer: TXVodPlayListener {
                 if !isRealPlay, playVideoData != nil {
                     isRealPlay = true
                     // 播放上报
-                    PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_realPlay, videoData: playVideoData, pageSource: nil, businessType: .bt_videoRealPlay, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+                    var extParams: [String: Any]?
+                    if isHomePageAllList {
+                        if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                            extParams = ["topicId": "all"]
+                        } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                            extParams = ["followedUid": "all"]
+                        }
+                    }
+                    PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_realPlay, videoData: playVideoData, pageSource: nil, businessType: .bt_videoRealPlay, objectType: nil, extParams: extParams, shareId: nil, videoIds: nil, playId: playId)
                 }
             }
             playVideoData?.playProgress = Float64(playProgress)
@@ -223,7 +297,15 @@ extension PQSingletoVideoPlayer: TXVodPlayListener {
             if !isPlayBegin, playVideoData != nil {
                 isPlayBegin = true
                 // 播放上报
-                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlaySuccess, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+                var extParams: [String: Any]?
+                if isHomePageAllList {
+                    if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                        extParams = ["topicId": "all"]
+                    } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                        extParams = ["followedUid": "all"]
+                    }
+                }
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlaySuccess, objectType: nil, extParams: extParams, shareId: nil, videoIds: nil, playId: playId)
             }
 
         case PLAY_EVT_PLAY_LOADING.rawValue: // 视频播放loading
@@ -238,11 +320,25 @@ extension PQSingletoVideoPlayer: TXVodPlayListener {
             if !isFirstFrame, playVideoData != nil {
                 isFirstFrame = true
                 // 播放上报
-                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_play, videoData: playVideoData, pageSource: nil, businessType: nil, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+                var extParams: [String: Any]?
+                if isHomePageAllList {
+                    if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                        extParams = ["topicId": "all"]
+                    } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                        extParams = ["followedUid": "all"]
+                    }
+                }
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_play, videoData: playVideoData, pageSource: nil, businessType: nil, objectType: nil, extParams: extParams, shareId: nil, videoIds: nil, playId: playId)
                 let duration = Int((Date().timeIntervalSince1970 * 1000) - loadingTime)
                 BFLog(message: "加载时长:\(duration)")
                 // 加载时间上报
-                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Frontend, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlaySuccessTime, objectType: nil, extParams: ["duration": duration, "proxyEnable": "0", "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0"], shareId: nil, videoIds: nil, playId: playId)
+                var timeExtParams: [String: Any] = ["duration": duration, "proxyEnable": "0", "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0"]
+                if extParams != nil {
+                    timeExtParams.merge(extParams!) { keyValue, _ in
+                        keyValue
+                    }
+                }
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Frontend, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlaySuccessTime, objectType: nil, extParams: timeExtParams, shareId: nil, videoIds: nil, playId: playId)
             }
             BFLog(message: "首帧加载完成")
         case PLAY_EVT_PLAY_END.rawValue: // 播放结束
@@ -254,7 +350,29 @@ extension PQSingletoVideoPlayer: TXVodPlayListener {
             if !isPlayEnd, playVideoData != nil {
                 isPlayEnd = true
                 // 播放结束上报
-                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayEnd, objectType: nil, extParams: nil, shareId: nil, videoIds: nil, playId: playId)
+                var extParams: [String: Any]?
+                if isHomePageAllList {
+                    if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                        extParams = ["topicId": "all"]
+                    } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                        extParams = ["followedUid": "all"]
+                    }
+                }
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayEnd, objectType: nil, extParams: extParams, shareId: nil, videoIds: nil, playId: playId)
+            }
+            let playDuration = player.currentPlaybackTime() - lastPlaybackTime
+            debugPrint("当前播放时长:\(player.currentPlaybackTime()),lastPlaybackTime:\(lastPlaybackTime),playDuration:\(playDuration)")
+            if playDuration > 0 {
+                var extParams: [String: Any]?
+                if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                    extParams = ["topicId": isHomePageAllList ? "all" : "\(playVideoData?.topicData?["id"] ?? "")"]
+                } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                    extParams = ["followedUid": isHomePageAllList ? "all" : "\(playVideoData?.user?["uid"] ?? "")"]
+                } else if (playVideoData?.pageSource == .sp_cmunit_newTopicDetail || playVideoData?.pageSource == .sp_cmunit_hotTopicDetail) {
+                    extParams = ["topicId": "\(playVideoData?.topicData?["id"] ?? "")"]
+                }
+                PQEventTrackViewModel.baseReportUpload(logType: .st_log_type_pLayaction, businessType: .bt_videoPlayDuration, objectType: nil, pageSource: playVideoData?.pageSource ?? .sp_cmunit_recommend, eventData: ["pageSource": (playVideoData?.pageSource ?? .sp_cmunit_recommend).rawValue, "playDuration": Int64(playDuration * 1000), "playId": playId, "uid": "\(playVideoData?.user?["uid"] ?? "")", "videoId": playVideoData?.id ?? 0], extParams: extParams, remindmsg: "播放时长统计")
+                lastPlaybackTime = player.currentPlaybackTime()
             }
         case PLAY_ERR_NET_DISCONNECT.rawValue, -2301: // 重连失败
             if playStatusBloc != nil {
@@ -263,7 +381,15 @@ extension PQSingletoVideoPlayer: TXVodPlayListener {
             if !isPlayerError, playVideoData != nil {
                 isPlayerError = true
                 // 播放失败
-                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayError, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": true, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event], shareId: nil, videoIds: nil, playId: playId)
+                var extParams: [String: Any] = ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": true, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event]
+                if isHomePageAllList {
+                    if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                        extParams["topicId"] = "all"
+                    } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                        extParams["followedUid"] = "all"
+                    }
+                }
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayError, objectType: nil, extParams: extParams, shareId: nil, videoIds: nil, playId: playId)
             }
         case PLAY_ERR_FILE_NOT_FOUND.rawValue: // 播放文件不存在
             if playStatusBloc != nil {
@@ -272,7 +398,15 @@ extension PQSingletoVideoPlayer: TXVodPlayListener {
             if !isPlayerError, playVideoData != nil {
                 isPlayerError = true
                 // 播放失败
-                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayError, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": false, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event], shareId: nil, videoIds: nil, playId: playId)
+                var extParams: [String: Any] = ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": false, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event]
+                if isHomePageAllList {
+                    if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                        extParams["topicId"] = "all"
+                    } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                        extParams["followedUid"] = "all"
+                    }
+                }
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayError, objectType: nil, extParams: extParams, shareId: nil, videoIds: nil, playId: playId)
             }
         case PLAY_ERR_HEVC_DECODE_FAIL.rawValue, PLAY_ERR_HLS_KEY.rawValue, PLAY_ERR_GET_PLAYINFO_FAIL.rawValue, PLAY_WARNING_VIDEO_DECODE_FAIL.rawValue, PLAY_WARNING_AUDIO_DECODE_FAIL.rawValue: // H265解码失败,HLS解码key获取失败,获取点播文件信息失败,当前视频解码失败,当前音频解码失败
             if playStatusBloc != nil {
@@ -281,17 +415,44 @@ extension PQSingletoVideoPlayer: TXVodPlayListener {
             if !isPlayerError, playVideoData != nil {
                 isPlayerError = true
                 // 播放失败
-                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayError, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": false, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event], shareId: nil, videoIds: nil, playId: playId)
+                var extParams: [String: Any] = ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": false, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event]
+                if isHomePageAllList {
+                    if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                        extParams["topicId"] = "all"
+                    } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                        extParams["followedUid"] = "all"
+                    }
+                }
+                PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayError, objectType: nil, extParams: extParams, shareId: nil, videoIds: nil, playId: playId)
             }
         case PLAY_WARNING_RECONNECT.rawValue: // 断线重连已启动重新连接
             if playStatusBloc != nil {
                 playStatusBloc!(.PQVIDEO_PLAY_STATUS_RECONNECT)
             }
-            PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayException, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": true, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event], shareId: nil, videoIds: nil, playId: playId)
+            var extParams: [String: Any] = ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": true, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event]
+            if isHomePageAllList {
+                if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                    extParams["topicId"] = "all"
+                } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                    extParams["followedUid"] = "all"
+                }
+            }
+            PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayException, objectType: nil, extParams: extParams, shareId: nil, videoIds: nil, playId: playId)
         case PLAY_WARNING_RECV_DATA_LAG.rawValue, PLAY_WARNING_VIDEO_PLAY_LAG.rawValue: // 网络来包不稳:可能是下行带宽不足 | 当前视频播放出现卡顿(用户直观感受)
             // 播放失败
-            PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Frontend, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlaySlow, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event, "position": player.currentPlaybackTime()], shareId: nil, videoIds: nil, playId: playId)
-            PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayException, objectType: nil, extParams: ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": true, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event], shareId: nil, videoIds: nil, playId: playId)
+            var extParams1: [String: Any] = ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event, "position": player.currentPlaybackTime()]
+            var extParams2: [String: Any] = ["pageSource": playVideoData!.pageSource.rawValue, "networkType": networkStatus(), "extra": "0", "hasRetry": true, "url": playVideoData?.videoPath ?? "", "videoId": playVideoData?.uniqueId ?? "0", "what": event]
+            if isHomePageAllList {
+                if playVideoData?.pageSource == .sp_cmunit_joinTopic {
+                    extParams1["topicId"] = "all"
+                    extParams2["topicId"] = "all"
+                } else if playVideoData?.pageSource == .sp_cmunit_follow {
+                    extParams1["followedUid"] = "all"
+                    extParams2["topicId"] = "all"
+                }
+            }
+            PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Frontend, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlaySlow, objectType: nil, extParams: extParams1, shareId: nil, videoIds: nil, playId: playId)
+            PQEventTrackViewModel.videoRelationReportUpload(reportLogType: .reportLogType_Action, videoData: playVideoData, pageSource: nil, businessType: .bt_videoPlayException, objectType: nil, extParams: extParams2, shareId: nil, videoIds: nil, playId: playId)
         default:
             break
         }

+ 19 - 3
BFFramework/Classes/EventTrack/ViewModel/PQEventTrackViewModel.swift

@@ -68,6 +68,13 @@ public class PQEventTrackViewModel: NSObject {
     ///   - headVideoId: <#headVideoId description#>
     public class func videoRelationReportUpload(reportLogType: reportLogType, videoData: BFVideoItemProtocol?, pageSource: PAGESOURCE? = nil, businessType: businessType?, objectType: objectType? = nil, extParams: [String: Any]? = nil, shareId: String? = nil, videoIds: String? = nil, playId: String? = nil, headVideoId: String? = nil) {
         var tempExtParams: [String: Any] = extParams ?? [:]
+        if videoData?.topicData != nil {
+            if (videoData?.pageSource == .sp_cmunit_joinTopic || pageSource == .sp_cmunit_joinTopic) && "\(tempExtParams["topicId"] ?? "")".count <= 0 {
+                tempExtParams["topicId"] = "\(videoData?.topicData?["id"] ?? "")"
+            } else if (videoData?.pageSource == .sp_cmunit_follow || pageSource == .sp_cmunit_follow) && "\(tempExtParams["followedUid"] ?? "")".count <= 0 {
+                tempExtParams["followedUid"] = "\(videoData?.user?["uid"] ?? "")"
+            }
+        }
         if videoData is PQVideoListModel {
             if (videoData as? PQVideoListModel)?.reCreateVideoData != nil {
                 tempExtParams["projectId"] = (videoData as? PQVideoListModel)?.reCreateVideoData?.projectId ?? ""
@@ -86,7 +93,7 @@ public class PQEventTrackViewModel: NSObject {
         if objectType == .ot_reproduce_clickButton || objectType == .ot_reproduce_collectionBar || objectType == .ot_reproduce_collectionClicButton || objectType == .ot_reproduce_sameSourceButton {
             PQEventTrackViewModel.baseReportUpload(businessType: businessType, objectType: objectType, pageSource: pageSource != nil ? pageSource! : (videoData?.pageSource ?? .sp_category), extParams: tempExtParams, remindmsg: "再创作上报")
         } else {
-            PQEventTrackViewModel.reportVideoPlayUpload(reportLogType: reportLogType, videoId: "\(videoData?.id ?? 0)", headVideoId: headVideoId ?? videoData?.headVideoId, videoIds: (videoIds == nil ? "\(videoData?.id ?? 0)" : videoIds), pageSource: pageSource != nil ? pageSource! : (videoData?.pageSource ?? .sp_category), playId: playId ?? "", recommendId: videoData?.recommendId, recommendLogVO: videoData?.recommendLogVO, abInfoData: videoData?.abInfoData, measureType: videoData?.measureType, measureId: videoData?.measureId, businessType: businessType, shareId: shareId ?? "", extParams: tempExtParams, objectType: objectType)
+            PQEventTrackViewModel.reportVideoPlayUpload(reportLogType: reportLogType, videoId: "\(videoData?.id ?? 0)", headVideoId: headVideoId ?? videoData?.headVideoId, videoIds: (videoIds == nil ? "\(videoData?.id ?? 0)" : videoIds), pageSource: pageSource != nil ? pageSource! : (videoData?.pageSource ?? .sp_category), playId: playId ?? "", recommendId: videoData?.recommendId, recommendLogVO: videoData?.recommendLogVO,flowPool:videoData?.flowPool, abInfoData: videoData?.abInfoData, measureType: videoData?.measureType, measureId: videoData?.measureId, businessType: businessType, shareId: shareId ?? "", extParams: tempExtParams, objectType: objectType)
         }
     }
     
@@ -106,7 +113,7 @@ public class PQEventTrackViewModel: NSObject {
     ///   - businessType: 操作类型
     ///   - targetUid: 视频用户ID
     /// - Returns: <#description#>
-    public class func reportVideoPlayUpload(reportLogType: reportLogType, videoId: String, headVideoId: String?, videoIds: String?, pageSource: PAGESOURCE, playId: String, recommendId: String?, recommendLogVO: String?, abInfoData: String?, measureType: Int?, measureId: Int?, businessType: businessType?, targetUid: Int = 0, shareId: String = "", extParams: [String: Any]? = nil, objectType: objectType? = nil) {
+    public class func reportVideoPlayUpload(reportLogType: reportLogType, videoId: String, headVideoId: String?, videoIds: String?, pageSource: PAGESOURCE, playId: String, recommendId: String?, recommendLogVO: String?,flowPool:String?, abInfoData: String?, measureType: Int?, measureId: Int?, businessType: businessType?, targetUid: Int = 0, shareId: String = "", extParams: [String: Any]? = nil, objectType: objectType? = nil) {
         DispatchQueue.global().async {
             var params: [String: Any] = ["videoId": videoId, "pageSource": pageSource.rawValue, "playId": playId, "targetUid": targetUid]
             if measureType != nil {
@@ -121,6 +128,9 @@ public class PQEventTrackViewModel: NSObject {
             if recommendLogVO != nil, !(recommendLogVO?.isEmpty ?? true) {
                 params["recommendLogVO"] = recommendLogVO
             }
+            if flowPool != nil, (flowPool?.count ?? 0) > 0 {
+                params["flowPool"] = flowPool
+            }
             if abInfoData != nil, !(abInfoData?.isEmpty ?? true) {
                 params["abInfoData"] = abInfoData
             }
@@ -204,7 +214,7 @@ public class PQEventTrackViewModel: NSObject {
 //    /   - businessType: <#businessType description#>
 //    /   - targetUid: <#targetUid description#>
 //    /   - shareId: <#shareId description#>
-    public class func shareReportUpload(isShareVideo: Bool = true, screenType: Int = 1, videoId: String, pageSource: PAGESOURCE, recommendId: String?, recommendLogVO: String?, abInfoData: String?, measureType: Int?, measureId: Int?, businessType: businessType?, targetUid: Int?, shareId: String = "") {
+    public class func shareReportUpload(isShareVideo: Bool = true, screenType: Int = 1, videoId: String, pageSource: PAGESOURCE, recommendId: String?, recommendLogVO: String?,flowPool:String?, abInfoData: String?, measureType: Int?, measureId: Int?, businessType: businessType?, targetUid: Int?, shareId: String = "",extParams: [String: Any]? = nil) {
         DispatchQueue.global().async {
             var url: String = PQENVUtil.shared.longvideoapi
             switch screenType {
@@ -218,6 +228,9 @@ public class PQEventTrackViewModel: NSObject {
                 break
             }
             var params: [String: Any] = ["type": isShareVideo ? "1" : "2", "videoId": videoId, "pageSource": pageSource.rawValue, "playId": PQSingletoVideoPlayer.shared.playId, "targetUid": targetUid ?? 0, "shareDepth": "0"]
+            if extParams != nil {
+                params["extParams"] = dictionaryToJsonString(extParams!)
+            }
             if measureType != nil {
                 params["measureType"] = measureType
             }
@@ -248,6 +261,9 @@ public class PQEventTrackViewModel: NSObject {
             if recommendLogVO != nil, !(recommendLogVO?.isEmpty ?? true) {
                 params["recommendLogVO"] = recommendLogVO
             }
+            if flowPool != nil, (flowPool?.count ?? 0) > 0 {
+                params["flowPool"] = flowPool
+            }
             if abInfoData != nil, !(abInfoData?.isEmpty ?? true) {
                 params["abInfoData"] = abInfoData
             }

+ 14 - 2
BFFramework/Classes/PModels/PQVideoListModel.swift

@@ -21,6 +21,7 @@ public protocol BFVideoItemProtocol {
     dynamic var selectedImage: String { get set } // 图片地址
     dynamic var isSelected: Bool { get set }
     dynamic var recommendLogVO: String? { get set } // 推荐日志对象
+    dynamic var flowPool: String? { get set } // 流量池数据 eg:#1#12#5#169182931029
     dynamic var abInfoData: String? { get set } // AB
     dynamic var pageCategoryId: Int { get set } // 页面分类ID
     dynamic var version: String { get set } // 版本号
@@ -116,6 +117,8 @@ public protocol BFVideoItemProtocol {
     var videoFromScene: videoFromScene { get set }
     // extParams: 额外参数-传入发布页 - 主要中秋红包塞活动使用
     var extParams:String { get set }
+    // 话题信息
+    var topicData: [String: Any]? { get set }
 }
 
 open class PQVideoListModel: PQBaseModel, BFVideoItemProtocol {
@@ -164,6 +167,7 @@ open class PQVideoListModel: PQBaseModel, BFVideoItemProtocol {
     public var pwd: String? // 视频密码 ,
     public var recommendId: String? // 推荐链路ID ,
     public var recommendSource: Int = 0 // 0 默认 1 第四范式
+    public var flowPool: String?
     public var recommendStatus: Int = 0 // 推荐状态 ,
     public var rotate: Int = 0 // 旋转角度 ,
     public var sampleJobId: String?
@@ -243,7 +247,9 @@ open class PQVideoListModel: PQBaseModel, BFVideoItemProtocol {
     public var categoryName: String = ""
     // 视频分类图
     public var categoryImage: String?
-    public var topicInfo: [String: Any]?
+    // 话题信息
+    public var topicData: [String: Any]?
+
     override public init(jsonDict: [String: Any]) {
         super.init(jsonDict: jsonDict)
         if jsonDict.keys.contains("id") {
@@ -290,8 +296,11 @@ open class PQVideoListModel: PQBaseModel, BFVideoItemProtocol {
             user = jsonDict["user"] as? [String: Any]
             userInfo = PQUserInfoModel(jsonDict: user!)
         }
+        if jsonDict.keys.contains("topicData") {
+            topicData = jsonDict["topicData"] as? [String: Any]
+        }
         if jsonDict.keys.contains("topicInfo") {
-            topicInfo = jsonDict["topicInfo"] as? [String: Any]
+            topicData = jsonDict["topicInfo"] as? [String: Any]
         }
         if jsonDict.keys.contains("shareCountFriend") {
             shareCountFriend = Int("\(jsonDict["shareCountFriend"] ?? "0")") ?? 0
@@ -344,6 +353,9 @@ open class PQVideoListModel: PQBaseModel, BFVideoItemProtocol {
         if jsonDict.keys.contains("abInfoData") {
             abInfoData = "\(jsonDict["abInfoData"] ?? "")"
         }
+        if jsonDict.keys.contains("flowPool") {
+            flowPool = "\(jsonDict["flowPool"] ?? "")"
+        }
         if jsonDict.keys.contains("totalTime") {
             totalTime = Int("\(jsonDict["totalTime"] ?? "0")") ?? 0
             totalTimeParas = Float64(totalTime).formatDurationToHMS()

+ 3 - 1
BFFramework/Classes/Stuckpoint/Controller/PQStuckPointMaterialController.swift

@@ -53,7 +53,9 @@ public class PQStuckPointMaterialController: PQBaseViewController {
         view.insertSubview(albumController.view, belowSubview: navHeadImageView!)
         albumController.updateViewFrame(frame: CGRect(x: 0, y: navHeadImageView?.frame.maxY ?? cDevice_iPhoneNavBarAndStatusBarHei, width: view.frame.width, height: view.frame.height - (navHeadImageView?.frame.maxY ?? cDevice_iPhoneNavBarAndStatusBarHei)))
         albumController.selectedHandle = { [weak self] seletedData in
-            self?.albumSelectedHandle(seletedData: seletedData)
+            if seletedData != nil {
+                self?.albumSelectedHandle(seletedData: seletedData)
+            }
         }
         return albumController
     }()

+ 1 - 1
BFFramework/Classes/Utils/PQSingletoMemoryUtil.swift

@@ -64,7 +64,7 @@ public class PQSingletoMemoryUtil: NSObject {
     public var isDefaultAtten: Bool = false // 是否默认进入关注
     public var isDefaultMineSingleVideoDetail: Bool = false // 是否默认进入我的单个视频详情
     public var playCount: Int = 0 // 播放次数
-    public var uploadDatas: [PQVideoListModel] = Array<PQVideoListModel>.init() // 正在上传的视频集合
+    public var uploadDatas: [BFVideoItemProtocol] = Array<BFVideoItemProtocol>.init() // 正在上传的视频集合
     public var isShowUpSlideGuide: Bool = false // 是否展示了滑动向上的提示
     public var showUpSlideData: PQVideoListModel? // 是否展示了滑动向上的提示
     public var makeVideoProjectId: String? // 制作视频项目Id

+ 3 - 1
Example/Podfile

@@ -5,6 +5,8 @@ platform :ios, '10.0'
 target 'BFFramework_Example' do
   source 'https://git.yishihui.com/iOS/BFSpecs.git'
   source 'https://github.com/CocoaPods/Specs.git'
-#  pod 'BFCommonKit', :path => '/Users/sanw/Desktop/BytesFlow/Person/Projects/BFCommonKit/'
+  pod 'BFCommonKit', :path => '/Users/sanw/Desktop/BytesFlow/Person/Projects/BFCommonKit/'
+  pod 'BFNetRequestKit', :path => '/Users/sanw/Desktop/BytesFlow/Person/Projects/BFNetRequestKit/'
+  pod 'BFMaterialKit', :path => '/Users/sanw/Desktop/BytesFlow/Person/Projects/BFMaterialKit/'
   pod 'BFFramework', :path => '../'
 end

+ 48 - 43
Example/Podfile.lock

@@ -1,14 +1,14 @@
 PODS:
   - Alamofire (5.4.3)
-  - AliyunOSSiOS (2.10.8)
-  - BFCommonKit (1.1.8):
-    - BFCommonKit/BFBase (= 1.1.8)
-    - BFCommonKit/BFCategorys (= 1.1.8)
-    - BFCommonKit/BFConfig (= 1.1.8)
-    - BFCommonKit/BFDebug (= 1.1.8)
-    - BFCommonKit/BFEnums (= 1.1.8)
-    - BFCommonKit/BFUtility (= 1.1.8)
-  - BFCommonKit/BFBase (1.1.8):
+  - AliyunOSSiOS (2.10.10)
+  - BFCommonKit (1.4.9):
+    - BFCommonKit/BFBase (= 1.4.9)
+    - BFCommonKit/BFCategorys (= 1.4.9)
+    - BFCommonKit/BFConfig (= 1.4.9)
+    - BFCommonKit/BFDebug (= 1.4.9)
+    - BFCommonKit/BFEnums (= 1.4.9)
+    - BFCommonKit/BFUtility (= 1.4.9)
+  - BFCommonKit/BFBase (1.4.9):
     - Alamofire (= 5.4.3)
     - BFCommonKit/BFCategorys
     - BFCommonKit/BFConfig
@@ -16,13 +16,13 @@ PODS:
     - FDFullscreenPopGesture (= 1.1)
     - RealmSwift (= 10.7.6)
     - SnapKit (= 5.0.1)
-  - BFCommonKit/BFCategorys (1.1.8):
+  - BFCommonKit/BFCategorys (1.4.9):
     - KingfisherWebP (= 1.3.0)
-  - BFCommonKit/BFConfig (1.1.8)
-  - BFCommonKit/BFDebug (1.1.8):
+  - BFCommonKit/BFConfig (1.4.9)
+  - BFCommonKit/BFDebug (1.4.9):
     - BFCommonKit/BFCategorys
-  - BFCommonKit/BFEnums (1.1.8)
-  - BFCommonKit/BFUtility (1.1.8):
+  - BFCommonKit/BFEnums (1.4.9)
+  - BFCommonKit/BFUtility (1.4.9):
     - Alamofire (= 5.4.3)
     - BFCommonKit/BFCategorys
     - BFCommonKit/BFConfig
@@ -30,20 +30,20 @@ PODS:
     - Kingfisher (= 6.3.0)
     - KingfisherWebP (= 1.3.0)
     - Toast-Swift (= 5.0.1)
-  - BFFramework (1.0.0):
-    - AliyunOSSiOS (= 2.10.8)
+  - BFFramework (1.0.7):
+    - AliyunOSSiOS (= 2.10.10)
     - BFCommonKit
     - BFMaterialKit
     - BFNetRequestKit
     - Bugly (= 2.5.90)
     - LMJHorizontalScrollText (= 2.0.2)
-    - MJRefresh (= 3.6.1)
+    - MJRefresh (= 3.7.2)
     - ObjectMapper (= 4.2.0)
-    - TXLiteAVSDK_Player (= 8.7.10102)
+    - TXLiteAVSDK_Player (= 9.1.10564)
     - WechatOpenSDK-Swift (= 1.8.7.1)
-  - BFMaterialKit (0.0.6):
+  - BFMaterialKit (0.1.6):
     - BFCommonKit
-  - BFNetRequestKit (0.1.4):
+  - BFNetRequestKit (0.2.3):
     - Alamofire (= 5.4.3)
   - Bugly (2.5.90)
   - FDFullscreenPopGesture (1.1)
@@ -52,17 +52,17 @@ PODS:
   - KingfisherWebP (1.3.0):
     - Kingfisher (~> 6.2)
     - libwebp (>= 1.1.0)
-  - libwebp (1.2.0):
-    - libwebp/demux (= 1.2.0)
-    - libwebp/mux (= 1.2.0)
-    - libwebp/webp (= 1.2.0)
-  - libwebp/demux (1.2.0):
+  - libwebp (1.2.1):
+    - libwebp/demux (= 1.2.1)
+    - libwebp/mux (= 1.2.1)
+    - libwebp/webp (= 1.2.1)
+  - libwebp/demux (1.2.1):
     - libwebp/webp
-  - libwebp/mux (1.2.0):
+  - libwebp/mux (1.2.1):
     - libwebp/demux
-  - libwebp/webp (1.2.0)
+  - libwebp/webp (1.2.1)
   - LMJHorizontalScrollText (2.0.2)
-  - MJRefresh (3.6.1)
+  - MJRefresh (3.7.2)
   - ObjectMapper (4.2.0)
   - Realm (10.7.6):
     - Realm/Headers (= 10.7.6)
@@ -71,17 +71,16 @@ PODS:
     - Realm (= 10.7.6)
   - SnapKit (5.0.1)
   - Toast-Swift (5.0.1)
-  - TXLiteAVSDK_Player (8.7.10102)
+  - TXLiteAVSDK_Player (9.1.10564)
   - WechatOpenSDK-Swift (1.8.7.1)
 
 DEPENDENCIES:
+  - BFCommonKit (from `/Users/sanw/Desktop/BytesFlow/Person/Projects/BFCommonKit/`)
   - BFFramework (from `../`)
+  - BFMaterialKit (from `/Users/sanw/Desktop/BytesFlow/Person/Projects/BFMaterialKit/`)
+  - BFNetRequestKit (from `/Users/sanw/Desktop/BytesFlow/Person/Projects/BFNetRequestKit/`)
 
 SPEC REPOS:
-  https://git.yishihui.com/wenweiwei/BFSpecs.git:
-    - BFCommonKit
-    - BFMaterialKit
-    - BFNetRequestKit
   https://github.com/CocoaPods/Specs.git:
     - Alamofire
     - AliyunOSSiOS
@@ -102,32 +101,38 @@ SPEC REPOS:
     - WechatOpenSDK-Swift
 
 EXTERNAL SOURCES:
+  BFCommonKit:
+    :path: "/Users/sanw/Desktop/BytesFlow/Person/Projects/BFCommonKit/"
   BFFramework:
     :path: "../"
+  BFMaterialKit:
+    :path: "/Users/sanw/Desktop/BytesFlow/Person/Projects/BFMaterialKit/"
+  BFNetRequestKit:
+    :path: "/Users/sanw/Desktop/BytesFlow/Person/Projects/BFNetRequestKit/"
 
 SPEC CHECKSUMS:
   Alamofire: e447a2774a40c996748296fa2c55112fdbbc42f9
-  AliyunOSSiOS: 8db92936545593b9e5c66d680ef2ac0738946651
-  BFCommonKit: d7e5b2b13f34cf578e0f2dc6896618c0970fbae9
-  BFFramework: ec7dc882ecb587d52cdbd78fc0c60f403a84dd14
-  BFMaterialKit: 417988162e65a368b211847c08fba9ed9b4dfa50
-  BFNetRequestKit: bec1d28012c7206cdf775fb31e394139d245d376
+  AliyunOSSiOS: b8f1dfc229cd9abf68c8ee0cb245c2d66e00dd96
+  BFCommonKit: 61380c2c5d74333d4a60fe52a3321c937b2a1f06
+  BFFramework: 8f1f60ab704eeb51a4da6828588f8da24ab85faa
+  BFMaterialKit: 920e502d41b995c9959199e513b64ae780f52ae5
+  BFNetRequestKit: 5743bcafb3f70502137780461b53d71c05b1d01e
   Bugly: 88bc32c0acc6fef7b74d610f0319ee7560d6b9fe
   FDFullscreenPopGesture: a8a620179e3d9c40e8e00256dcee1c1a27c6d0f0
   KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51
   Kingfisher: 6c3df386db71d82c0817a429d2c9421a77396529
   KingfisherWebP: dec17a5eb1af2658791bde1f93ae9a853678f826
-  libwebp: e90b9c01d99205d03b6bb8f2c8c415e5a4ef66f0
+  libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
   LMJHorizontalScrollText: ebc9b908db297f603c5b98c9b4e5f4582f5a14b8
-  MJRefresh: d2c1970d1cf6e77fcfcdfe76c943dfab8dbfa5c1
+  MJRefresh: 30997d30b347c8e9508a4db11e3a690da0c9b85a
   ObjectMapper: 1eb41f610210777375fa806bf161dc39fb832b81
   Realm: ed860452717c8db8f4bf832b6807f7f2ce708839
   RealmSwift: e31c4ddbcc42ac879313d656b86f9ca539f6f4f4
   SnapKit: 97b92857e3df3a0c71833cce143274bf6ef8e5eb
   Toast-Swift: 9b6a70f28b3bf0b96c40d46c0c4b9d6639846711
-  TXLiteAVSDK_Player: 84adacb818b70fa5a43dc268782c8fe54d3f26f6
+  TXLiteAVSDK_Player: b4e91267f601a9cadf265ed4a903816e995ba57a
   WechatOpenSDK-Swift: 18a8f7b12e745c30acc013f72a9f8a25aad6e216
 
-PODFILE CHECKSUM: b2f788cdc3525929fa31592b4ea2730a6ad57e08
+PODFILE CHECKSUM: 0566a3fccd1ba8303834811529466910b942b3bf
 
-COCOAPODS: 1.10.1
+COCOAPODS: 1.10.2