DolphinEnglishLearnStudent/Base/BaseTabBarVC.swift
@@ -14,5 +14,8 @@ tabBar.backgroundColor = .white tabBar.tintColor = Config.ThemeColor if #available(iOS 17.0, *) { traitOverrides.horizontalSizeClass = .compact } } } DolphinEnglishLearnStudent/Login/LoginVC.swift
@@ -77,6 +77,12 @@ @IBAction func loginAction(_ sender: UIButton) { // DispatchQueue.global().async { // Task{ // await InPurchaseManager.testrefundRequest(for: 2000000680173869) // } // } guard authInputPhone() else {return} guard authInputCode() else {return} DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_1_CCell.xib
@@ -1,16 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> <device id="ipad10_9rounded" orientation="portrait" layout="fullscreen" appearance="light"/> <dependencies> <deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <objects> <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="_ListenFight_lesson_1_CCell" id="gTV-IL-0wX" customClass="ListenFight_lesson_1_CCell" customModule="DolphinEnglishLearnStudent" customModuleProvider="target"> <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="" id="gTV-IL-0wX" customClass="ListenFight_lesson_1_CCell" customModule="DolphinEnglishLearnStudent" customModuleProvider="target"> <rect key="frame" x="0.0" y="0.0" width="445" height="379"/> <autoresizingMask key="autoresizingMask"/> <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> @@ -41,7 +40,7 @@ <rect key="frame" x="5" y="45" width="435" height="329"/> </imageView> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="kkd-SI-bwq"> <rect key="frame" x="172.5" y="141.5" width="100" height="100"/> <rect key="frame" x="172.5" y="139.5" width="100" height="100"/> <constraints> <constraint firstAttribute="width" constant="100" id="LTx-TZ-bFM"/> <constraint firstAttribute="height" constant="100" id="yDa-rf-HIO"/> @@ -49,15 +48,14 @@ </imageView> </subviews> </view> <viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <constraints> <constraint firstItem="bdL-d4-7NQ" firstAttribute="top" secondItem="JdK-rh-KJI" secondAttribute="bottom" id="4oo-KH-5Tx"/> <constraint firstItem="kkd-SI-bwq" firstAttribute="centerY" secondItem="ZTg-uK-7eu" secondAttribute="centerY" id="78d-bY-KVe"/> <constraint firstItem="kkd-SI-bwq" firstAttribute="centerY" secondItem="gTV-IL-0wX" secondAttribute="centerY" id="78d-bY-KVe"/> <constraint firstAttribute="trailing" secondItem="bdL-d4-7NQ" secondAttribute="trailing" constant="5" id="CTn-Yp-I4m"/> <constraint firstItem="JdK-rh-KJI" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="5" id="H2K-rm-Njk"/> <constraint firstAttribute="trailing" secondItem="JdK-rh-KJI" secondAttribute="trailing" constant="5" id="HaX-d6-Ou6"/> <constraint firstItem="kkd-SI-bwq" firstAttribute="centerX" secondItem="ZTg-uK-7eu" secondAttribute="centerX" id="NVR-Eo-GGe"/> <constraint firstItem="kkd-SI-bwq" firstAttribute="centerX" secondItem="gTV-IL-0wX" secondAttribute="centerX" id="NVR-Eo-GGe"/> <constraint firstAttribute="bottom" secondItem="bdL-d4-7NQ" secondAttribute="bottom" constant="5" id="d7u-Rd-bRk"/> <constraint firstItem="JdK-rh-KJI" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" constant="5" id="g3Z-CO-Any"/> <constraint firstItem="bdL-d4-7NQ" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="5" id="yCf-NO-CuB"/> DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift
@@ -20,6 +20,7 @@ private var playedIndex = Set<Int>() //已经播放过的view private var voicePlayer = VoicePlayer.share() private var isAnsterModel = Set<Listen1SubModel>() private var isOpen:Bool = false //是否展示标题文本 private lazy var stackView:UIStackView = { let stackView = UIStackView() @@ -55,6 +56,12 @@ override func viewDidLoad() { super.viewDidLoad() navigationItem.titleView = UIView() Services.getIsOpen().subscribe(onNext: {data in self.isOpen = data.data ?? false self.collectionView.reloadData() }).disposed(by: disposeBag) //回传记录,始终保持答题进度 if let team = teamScheduleModel{ @@ -310,11 +317,12 @@ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: indexPath) as! ListenFight_lesson_1_CCell cell.jq_addShadows(shadowColor: .black.withAlphaComponent(0.31), corner: 5, radius: 5, offset: CGSize(width: 0, height: 1), opacity: 1) cell.backgroundColor = .white if viewModel.selectIndex.value?.row == indexPath.row{ cell.label_title.isHidden = false }else{ cell.label_title.isHidden = true } if viewModel.selectIndex.value?.row == indexPath.row && isOpen{ cell.label_title.isHidden = false }else{ cell.label_title.isHidden = true } cell.setListen1SubModel(listenNewModel.subjectList[page][indexPath.row]) cell.label_title.text = listenNewModel.subjectList[page][indexPath.row].name @@ -324,6 +332,10 @@ func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return listenNewModel.subjectList[page].count } func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } } extension HomeListenFight_lesson_2_VC:VoicePlayerDelegate{ @@ -368,7 +380,7 @@ sub.btn_choose.isEnabled = false } DispatchQueue.main.asyncAfter(deadline: .now()+3) { DispatchQueue.main.asyncAfter(deadline: .now()+2) { self.resetStackView() DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift
@@ -304,11 +304,11 @@ tempSubV?.img_state.alpha = 1 }completion: { _ in UIView.animate(withDuration: 0.4, delay: 3.0) { UIView.animate(withDuration: 0.4, delay: 2.0) { tempSubV?.img_state.alpha = 0 } DispatchQueue.main.asyncAfter(deadline: .now()+3.2) { DispatchQueue.main.asyncAfter(deadline: .now()+2) { self.setAnswerStackView() self.view.isUserInteractionEnabled = true } DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift
@@ -113,7 +113,7 @@ self.currentAnswer = self.answerSet.randomElement() //随机 if self.timer == nil{self.startTimer()} }else{ DispatchQueue.main.asyncAfter(deadline: .now()+3) { DispatchQueue.main.asyncAfter(deadline: .now()+2) { self.currentAnswer = self.answerSet.randomElement() //随机 if self.timer == nil{self.startTimer()} } DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_1_VC.swift
@@ -173,7 +173,7 @@ UIView.animate(withDuration: 0.5) { handleView.btn_state.alpha = 1 } DispatchQueue.main.asyncAfter(deadline:.now()+3) { DispatchQueue.main.asyncAfter(deadline:.now()+2) { UIView.animate(withDuration: 0.5) { handleView.btn_state.alpha = 0 handleView.btn_choose.isSelected = false DolphinEnglishLearnStudent/Moudle/Me/VC/VIPCenterVC.swift
@@ -75,52 +75,60 @@ } @objc func becomeVIPAction(){ #if DEBUG toPay() #else ParentVerifiyView.show {[unowned self] in guard let userId = UserViewModel.getUserInfo()?.user?.id.string else {alert(msg: "请先登录");return} guard let product = products.first else {alert(msg: "获取内购失败");return} Services.orderStudent(count: 12, price: product.price.doubleValue).subscribe(onNext: {[unowned self] data in if let m = data.data{ showHUD("正在购买") InPurchaseManager.purchaseProduct(ID: ProductMemberID, applicationUsername: userId) {[unowned self] model in let transactionIdentifier = model.receipt?.in_app.first?.original_transaction_id ?? "" hiddenHUD() Services.pay(orderId: m.orderId, transactionIdentifier: transactionIdentifier).subscribe(onNext: {[unowned self] data in var count = 0 showHUD("正在查询支付结果") let t = Timer(timeInterval: 2.0, repeats: true) {[unowned self] timer in Services.queryOrderState(orderId: m.orderId).subscribe(onNext: {[unowned self]status in if status.data == true{ alertSuccess(msg: "购买成功") DispatchQueue.main.asyncAfter(deadline: .now()+1) {[unowned self] in navigationController?.popViewController() NotificationCenter.default.post(name: MeUserInfoUpdate_Noti, object: nil) } timer.invalidate() return } count += 1 if count >= 15{ hiddenHUD() print("循环结束") showHUD("查询结果失败,请联系客服") timer.invalidate() } },onError: {error in timer.invalidate() }).disposed(by: disposeBag) } t.fire() RunLoop.current.add(t, forMode: .common) }).disposed(by: disposeBag) } errorClouse: { error in hiddenHUD() alert(msg: error.localizedDescription) } } }).disposed(by: disposeBag) self.toPay() } #endif } private func toPay(){ guard let userId = UserViewModel.getUserInfo()?.user?.id.string else {alert(msg: "请先登录");return} guard let product = products.first else {alert(msg: "获取内购失败");return} Services.orderStudent(count: 12, price: product.price.doubleValue).subscribe(onNext: {[unowned self] data in if let m = data.data{ showHUD("正在购买") InPurchaseManager.purchaseProduct(ID: ProductMemberID, applicationUsername: userId) {[unowned self] model in let transactionIdentifier = model.receipt?.in_app.first?.original_transaction_id ?? "" hiddenHUD() Services.pay(orderId: m.orderId, transactionIdentifier: transactionIdentifier).subscribe(onNext: {[unowned self] data in var count = 0 showHUD("正在查询支付结果") let t = Timer(timeInterval: 2.0, repeats: true) {[unowned self] timer in Services.queryOrderState(orderId: m.orderId).subscribe(onNext: {[unowned self]status in if status.data == true{ alertSuccess(msg: "购买成功") DispatchQueue.main.asyncAfter(deadline: .now()+1) {[unowned self] in navigationController?.popViewController() NotificationCenter.default.post(name: MeUserInfoUpdate_Noti, object: nil) } timer.invalidate() return } count += 1 if count >= 15{ hiddenHUD() print("循环结束") showHUD("查询结果失败,请联系客服") timer.invalidate() } },onError: {error in timer.invalidate() }).disposed(by: disposeBag) } t.fire() RunLoop.current.add(t, forMode: .common) }).disposed(by: disposeBag) } errorClouse: { error in hiddenHUD() alert(msg: error.localizedDescription) } } }).disposed(by: disposeBag) } } DolphinEnglishLearnStudent/Other/UIView/VoiceHandleView.swift
@@ -10,19 +10,19 @@ class VoiceHandleView: UIView { private lazy var img_hint:UIImageView = { let img = UIImageView(image: UIImage(named: "icon_play_1")) let img = UIImageView(image: UIImage(named: "icon_play_1")?.themeGreen) return img }() private lazy var img_hint_playing:UIImageView = { let img = UIImageView(image: UIImage(named: "icon_playing")) let img = UIImageView(image: UIImage(named: "icon_playing")?.themeGreen) img.isHidden = true return img }() private lazy var btn_play:UIButton = { let btn = UIButton(type: .custom) btn.setImage(UIImage(named: "icon_play"), for: .normal) btn.setImage(UIImage(named: "icon_play")?.themeGreen, for: .normal) return btn }() @@ -42,7 +42,8 @@ } private func setUI(){ backgroundColor = UIColor(hexString: "#41A2EB") // backgroundColor = UIColor(hexString: "#41A2EB") backgroundColor = UIColor.white jq_cornerRadius = 8 addSubview(img_hint_playing) addSubview(img_hint) DolphinEnglishLearnStudent/Services/InPurchaseManager.swift
@@ -110,27 +110,28 @@ } } // func getIPAPrice(_ price:Int,clouse:@escaping (SKProduct)->Void){ // var ipaId = "" // switch price { // case 98: ipaId = "com.jkfitness.a.price.1" // case 298:ipaId = "com.jkfitness.a.price.2" // case 488:ipaId = "com.jkfitness.a.price.3" // case 698:ipaId = "com.jkfitness.a.price.4" // case 998:ipaId = "com.jkfitness.a.price.5" // default:break // } // // var productIds = Set<String>() // productIds.insert(ipaId) // // InPurchaseManager.instance().setProductList(productIds) {products in // if let product = products.first{ // clouse(product) // } // } // } static func testrefundRequest(for transactionID:UInt64) async{ do{ if #available(iOS 15.0, *) { let windowScene = await UIApplication.shared.connectedScenes.first let result = try await StoreKit.Transaction.beginRefundRequest(for: transactionID, in: windowScene as! UIWindowScene) switch result { case .success: alert(msg: "退款申请发起成功") case .userCancelled:break @unknown default:break } } else { // Fallback on earlier versions } }catch{ error print(error) } } func dismiss(){ InPurchaseManager._sharedInstance = nil DolphinEnglishLearnStudent/Services/Services.swift
@@ -13,9 +13,9 @@ #if DEBUG //let All_Url = "http://192.168.110.237:9000" let All_Url = "http://1.95.15.237:9000" let All_Url = "https://dollearn.com/api" #else let All_Url = "http://1.95.15.237:9000" let All_Url = "https://dollearn.com/api" #endif class Services: NSObject { @@ -433,6 +433,12 @@ return NetworkRequest.request(params: params, method: .post, progress: false) } class func getIsOpen()->Observable<BaseResponse<Bool>>{ let params = ParamsAppender.build(url: All_Url) params.interface(url: "/management/tSysSet/getIsOpen") return NetworkRequest.request(params: params, method: .get, progress: false) } } extension Services{