diff --git a/dimensionhub/Core/API.swift b/dimensionhub/Core/API.swift index 78a266f..8427d9f 100644 --- a/dimensionhub/Core/API.swift +++ b/dimensionhub/Core/API.swift @@ -37,6 +37,53 @@ struct API { // 服务器地址 static let baseUrl = "https://dimensionhub.s5s8.com" + // 发送设备的token到服务 + static func appInit(userId: String, as: T.Type) async -> APIResponse { + // Create the request + var request = URLRequest(url: URL(string: baseUrl + "/api/appInit")!) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + + // Convert parameters to JSON data + + let device = await UIDevice.current + let system = "\(await device.systemName):\(await device.systemVersion)" + let parameters: [String:Any] = [ + "user_id": userId, + "system": system, + "lang": NSLocale.preferredLanguages.first ?? "", + "vendorId": await UIDevice.current.identifierForVendor?.uuidString ?? "" + ] + let jsonData = try! JSONSerialization.data(withJSONObject: parameters, options: []) + request.httpBody = jsonData + + let str = String(data: jsonData, encoding: .utf8)! + print("json is: \(str)") + + return await doRequest(request: request, as: T.self) + } + + static func userEvent(userId: String, event: String, as: T.Type) async -> APIResponse { + // Create the request + var request = URLRequest(url: URL(string: baseUrl + "/api/appInit")!) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + + // Convert parameters to JSON data + + let parameters: [String:Any] = [ + "user_id": userId, + "event": event + ] + let jsonData = try! JSONSerialization.data(withJSONObject: parameters, options: []) + request.httpBody = jsonData + + let str = String(data: jsonData, encoding: .utf8)! + print("json is: \(str)") + + return await doRequest(request: request, as: T.self) + } + // 发送设备的token到服务 static func sendDeviceTokenToServer(userId: String, token: String, as: T.Type) async -> APIResponse { // Create the request diff --git a/dimensionhub/Views/Detail/DetailView.swift b/dimensionhub/Views/Detail/DetailView.swift index fc067ef..b9fe74a 100644 --- a/dimensionhub/Views/Detail/DetailView.swift +++ b/dimensionhub/Views/Detail/DetailView.swift @@ -64,6 +64,7 @@ struct DetailView: View { FollowButtonView(dramaStatus: status) { followStatus in Task.detached { await self.clickFollowButton(followStatus: followStatus) + _ = await API.userEvent(userId: self.userId, event: "click_follow_button", as: String.self) } } } @@ -120,6 +121,7 @@ struct DetailView: View { } .task { await detailModel.loadData(userId: self.userId, id: self.id, channelName: self.channelName) + _ = await API.userEvent(userId: self.userId, event: "view_detail:\(self.id)", as: String.self) } } diff --git a/dimensionhub/Views/FollowList/FollowListView.swift b/dimensionhub/Views/FollowList/FollowListView.swift index 8df83dc..b995bbb 100644 --- a/dimensionhub/Views/FollowList/FollowListView.swift +++ b/dimensionhub/Views/FollowList/FollowListView.swift @@ -41,6 +41,7 @@ struct FollowListView: View { .frame(width: 370) .task { self.num = await self.followModel.loadData(userId: self.userId) + _ = await API.userEvent(userId: self.userId, event: "view_follow_list", as: String.self) } } } diff --git a/dimensionhub/Views/Index/IndexMainView.swift b/dimensionhub/Views/Index/IndexMainView.swift index e63eb44..8e471a2 100644 --- a/dimensionhub/Views/Index/IndexMainView.swift +++ b/dimensionhub/Views/Index/IndexMainView.swift @@ -57,6 +57,9 @@ struct IndexMainView: View { .highPriorityGesture( TapGesture().onEnded { appNavigation.append(dest: .followList(num: Int(indexModel.follow_num) ?? 0)) + Task { + _ = await API.userEvent(userId: self.userId, event: "click_follow_list", as: String.self) + } } ) .zIndex(1) @@ -136,6 +139,8 @@ struct IndexMainView: View { let loadNum = await self.indexModel.loadPrevUpdateDramasTask(userId: self.userId) self.hasMoreNewest = loadNum > 3 + + _ = await API.userEvent(userId: self.userId, event: "load_prev", as: String.self) } } .onChange(of: scrollID) { _, newValue in @@ -188,8 +193,13 @@ struct IndexMainView: View { let num = await indexModel.loadMoreUpdateDramasTask(userId: self.userId) self.hasMoreOldest = num > 3 + + _ = await API.userEvent(userId: self.userId, event: "load_more", as: String.self) } } + .task { + _ = await API.userEvent(userId: self.userId, event: "view_index", as: String.self) + } .onAppear { Task { @MainActor in await self.indexModel.loadData(userId: self.userId) @@ -234,6 +244,7 @@ extension IndexMainView { struct MixGroupLabelView: View { @EnvironmentObject var appNav: AppNavigation + @Environment(\.userId) private var userId let fixedDramaGroup: IndexModel.UpdateDramaGroup? let onTap: () -> Void @@ -242,6 +253,9 @@ extension IndexMainView { HStack(alignment: .center) { Button(action: { appNav.append(dest: .search) + Task { + _ = await API.userEvent(userId: self.userId, event: "click_search_button", as: String.self) + } }) { Image(systemName: "magnifyingglass") .font(.system(size: 20)) diff --git a/dimensionhub/Views/List/ListView.swift b/dimensionhub/Views/List/ListView.swift index 0e36900..9929b91 100644 --- a/dimensionhub/Views/List/ListView.swift +++ b/dimensionhub/Views/List/ListView.swift @@ -51,6 +51,7 @@ struct ListView: View { .navigationTitle(detailModel.name) .task { await detailModel.loadData(userId: self.userId, id: self.id, selectedChannelIdx: self.selectedChannelIdx) + _ = await API.userEvent(userId: self.userId, event: "view_list:\(self.id)", as: String.self) } } diff --git a/dimensionhub/Views/Search/SearchView.swift b/dimensionhub/Views/Search/SearchView.swift index b30aa76..07ec6e7 100644 --- a/dimensionhub/Views/Search/SearchView.swift +++ b/dimensionhub/Views/Search/SearchView.swift @@ -65,6 +65,9 @@ struct SearchView: View { ToolbarItem(placement: .principal) { SearchBar(isFirstResponder: $isFocused, searchText: $searchText) { doSearch() + Task { + _ = await API.userEvent(userId: self.userId, event: "search:\(self.searchText)", as: String.self) + } } .frame(width: UIScreen.main.bounds.width * 0.8) .id(toolbarID) diff --git a/dimensionhub/dimensionhubApp.swift b/dimensionhub/dimensionhubApp.swift index 8c2a8d0..3efeb95 100644 --- a/dimensionhub/dimensionhubApp.swift +++ b/dimensionhub/dimensionhubApp.swift @@ -79,12 +79,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD self.handleAppRefresh(task: task) } + let userId = KeychainHelper.getPersistentUserId() + + self.appInit(userId: userId) + Task.detached { await self.registerForPushNotifications() // 更新未读消息数 let unreadDramaIds = await self.getSystemUnreadDramaIds() - let userId = KeychainHelper.getPersistentUserId() let response = await API.resetUserUnreadNum(userId: userId, dramaIds: unreadDramaIds, as: String.self) switch response { case .result(let result): @@ -102,9 +105,22 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD } } } + return true } + private func appInit(userId: String) { + Task { + let response = await API.appInit(userId: userId, as: String.self) + switch response { + case .result(let result): + NSLog("reset user unread num result is: \(result)") + case .error(let errorCode, let message): + NSLog("reset user unread error_code: \(errorCode), message: \(message)") + } + } + } + private func handleAppRefresh(task: BGTask) { self.scheduleAppRefresh()