fix
无故事王国
2024-06-19 8cbad0d70dc473dace9fa95b510a2c119cf7946d
fix
10个文件已修改
11个文件已添加
552 ■■■■■ 已修改文件
DolphinEnglishLearnStudent.xcodeproj/project.pbxproj 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wx.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wx.imageset/share_wx.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wx.imageset/share_wx@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wxFri.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wxFri.imageset/share_wxFri.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wxFri.imageset/share_wxFri@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Config/Config.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Config/WeChatTools.swift 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/DolphinEnglishLearnStudent-Bridging-Header.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/DolphinEnglishLearnStudent.entitlements 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Info.plist 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.swift 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.xib 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Me/MeVC.swift 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Me/View/ShareView.swift 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Me/View/ShareView.xib 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/SceneDelegate.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Podfile 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent.xcodeproj/project.pbxproj
@@ -111,6 +111,9 @@
        13EEB8A82BFF354B002996FC /* HomeListen_item_TCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EEB8A62BFF354B002996FC /* HomeListen_item_TCell.swift */; };
        13EEB8A92BFF354B002996FC /* HomeListen_item_TCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13EEB8A72BFF354B002996FC /* HomeListen_item_TCell.xib */; };
        13EEB8AB2BFF36E0002996FC /* HomeListenSubVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EEB8AA2BFF36E0002996FC /* HomeListenSubVC.swift */; };
        13EFFA762C22D0EA00F072E7 /* ShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EFFA752C22D0EA00F072E7 /* ShareView.swift */; };
        13EFFA792C22D0FC00F072E7 /* ShareView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13EFFA782C22D0FC00F072E7 /* ShareView.xib */; };
        13EFFA7B2C22D6D100F072E7 /* WeChatTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EFFA7A2C22D6D100F072E7 /* WeChatTools.swift */; };
        AABBA9CFF928AFAC4A01F16D /* Pods_DolphinEnglishLearnStudent.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA21DA5F8583B67AC7D13D0A /* Pods_DolphinEnglishLearnStudent.framework */; };
/* End PBXBuildFile section */
@@ -222,6 +225,11 @@
        13EEB8A62BFF354B002996FC /* HomeListen_item_TCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListen_item_TCell.swift; sourceTree = "<group>"; };
        13EEB8A72BFF354B002996FC /* HomeListen_item_TCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeListen_item_TCell.xib; sourceTree = "<group>"; };
        13EEB8AA2BFF36E0002996FC /* HomeListenSubVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenSubVC.swift; sourceTree = "<group>"; };
        13EFFA752C22D0EA00F072E7 /* ShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareView.swift; sourceTree = "<group>"; };
        13EFFA782C22D0FC00F072E7 /* ShareView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ShareView.xib; sourceTree = "<group>"; };
        13EFFA7A2C22D6D100F072E7 /* WeChatTools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeChatTools.swift; sourceTree = "<group>"; };
        13EFFA7C2C22D7C500F072E7 /* DolphinEnglishLearnStudent-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DolphinEnglishLearnStudent-Bridging-Header.h"; sourceTree = "<group>"; };
        13EFFA802C22D86E00F072E7 /* DolphinEnglishLearnStudent.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DolphinEnglishLearnStudent.entitlements; sourceTree = "<group>"; };
        E76DEF4767EBA86DA360D0D8 /* Pods-DolphinEnglishLearnStudent.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DolphinEnglishLearnStudent.debug.xcconfig"; path = "Target Support Files/Pods-DolphinEnglishLearnStudent/Pods-DolphinEnglishLearnStudent.debug.xcconfig"; sourceTree = "<group>"; };
        EA21DA5F8583B67AC7D13D0A /* Pods_DolphinEnglishLearnStudent.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DolphinEnglishLearnStudent.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
@@ -259,6 +267,7 @@
        130278282BFD957100DDCE81 /* DolphinEnglishLearnStudent */ = {
            isa = PBXGroup;
            children = (
                13EFFA802C22D86E00F072E7 /* DolphinEnglishLearnStudent.entitlements */,
                13CD3AC52C08749E007E1065 /* Models */,
                1319B0332C0859D70052F889 /* ViewModel */,
                1319B02E2C08592D0052F889 /* Services */,
@@ -273,6 +282,7 @@
                130278322BFD957300DDCE81 /* Assets.xcassets */,
                130278342BFD957300DDCE81 /* LaunchScreen.storyboard */,
                130278372BFD957300DDCE81 /* Info.plist */,
                13EFFA7C2C22D7C500F072E7 /* DolphinEnglishLearnStudent-Bridging-Header.h */,
            );
            path = DolphinEnglishLearnStudent;
            sourceTree = "<group>";
@@ -293,6 +303,7 @@
        130278402BFD978900DDCE81 /* Config */ = {
            isa = PBXGroup;
            children = (
                13EFFA7A2C22D6D100F072E7 /* WeChatTools.swift */,
                13E99EF92C1FD1A9004F52D4 /* LaunchImageHelper.swift */,
                1302783E2BFD978900DDCE81 /* Config.swift */,
                1302783F2BFD978900DDCE81 /* Enums.swift */,
@@ -372,6 +383,7 @@
        130278692BFD9EA700DDCE81 /* Me */ = {
            isa = PBXGroup;
            children = (
                13EFFA772C22D0F200F072E7 /* View */,
                1302788F2BFD9FA100DDCE81 /* TCell */,
                1302788A2BFD9F2C00DDCE81 /* VC */,
                130278802BFD9F0700DDCE81 /* MeVC.swift */,
@@ -568,6 +580,15 @@
            path = TCell;
            sourceTree = "<group>";
        };
        13EFFA772C22D0F200F072E7 /* View */ = {
            isa = PBXGroup;
            children = (
                13EFFA752C22D0EA00F072E7 /* ShareView.swift */,
                13EFFA782C22D0FC00F072E7 /* ShareView.xib */,
            );
            path = View;
            sourceTree = "<group>";
        };
        3CD7B950C551024F77E6409B /* Pods */ = {
            isa = PBXGroup;
            children = (
@@ -619,6 +640,7 @@
                TargetAttributes = {
                    130278252BFD957100DDCE81 = {
                        CreatedOnToolsVersion = 15.3;
                        LastSwiftMigration = 1530;
                    };
                };
            };
@@ -665,6 +687,7 @@
                1302787A2BFD9ED600DDCE81 /* ExchangeResultVC.xib in Resources */,
                130278362BFD957300DDCE81 /* Base in Resources */,
                13397D972C05EA9D003440F9 /* ListenFight_Game_CCell.xib in Resources */,
                13EFFA792C22D0FC00F072E7 /* ShareView.xib in Resources */,
                1302788E2BFD9F4200DDCE81 /* CoinRecordHistoryVC.xib in Resources */,
                130278312BFD957100DDCE81 /* Base in Resources */,
                1362C7612BFF4BB100BD7F73 /* StudyHandleView.xib in Resources */,
@@ -780,7 +803,9 @@
                13A049FF2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift in Sources */,
                1302785A2BFD985E00DDCE81 /* CommonAlertView.swift in Sources */,
                13CD3AC92C0886E5007E1065 /* RefreshModel.swift in Sources */,
                13EFFA7B2C22D6D100F072E7 /* WeChatTools.swift in Sources */,
                1302782C2BFD957100DDCE81 /* SceneDelegate.swift in Sources */,
                13EFFA762C22D0EA00F072E7 /* ShareView.swift in Sources */,
                1302787D2BFD9ED600DDCE81 /* MarketExchangeVC.swift in Sources */,
                1302789A2BFD9FBF00DDCE81 /* AddressManageTCell.swift in Sources */,
                1319B02C2C081A320052F889 /* SimpleImageCCell.swift in Sources */,
@@ -951,6 +976,8 @@
            buildSettings = {
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
                CLANG_ENABLE_MODULES = YES;
                CODE_SIGN_ENTITLEMENTS = DolphinEnglishLearnStudent/DolphinEnglishLearnStudent.entitlements;
                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
                CODE_SIGN_STYLE = Manual;
                CURRENT_PROJECT_VERSION = 1;
@@ -979,6 +1006,8 @@
                SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
                SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
                SWIFT_EMIT_LOC_STRINGS = YES;
                SWIFT_OBJC_BRIDGING_HEADER = "DolphinEnglishLearnStudent/DolphinEnglishLearnStudent-Bridging-Header.h";
                SWIFT_OPTIMIZATION_LEVEL = "-Onone";
                SWIFT_VERSION = 5.0;
                TARGETED_DEVICE_FAMILY = 2;
            };
@@ -990,6 +1019,8 @@
            buildSettings = {
                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
                ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
                CLANG_ENABLE_MODULES = YES;
                CODE_SIGN_ENTITLEMENTS = DolphinEnglishLearnStudent/DolphinEnglishLearnStudent.entitlements;
                CODE_SIGN_STYLE = Manual;
                CURRENT_PROJECT_VERSION = 1;
                DEVELOPMENT_TEAM = "";
@@ -1015,6 +1046,7 @@
                SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
                SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
                SWIFT_EMIT_LOC_STRINGS = YES;
                SWIFT_OBJC_BRIDGING_HEADER = "DolphinEnglishLearnStudent/DolphinEnglishLearnStudent-Bridging-Header.h";
                SWIFT_VERSION = 5.0;
                TARGETED_DEVICE_FAMILY = 2;
            };
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wx.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "filename" : "share_wx.png",
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "share_wx@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wx.imageset/share_wx.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wx.imageset/share_wx@2x.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wxFri.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "filename" : "share_wxFri.png",
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "share_wxFri@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wxFri.imageset/share_wxFri.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/share_wxFri.imageset/share_wxFri@2x.png
DolphinEnglishLearnStudent/Config/Config.swift
@@ -12,6 +12,10 @@
@_exported import JQTools
let WeChatAPPID = "wx723c6b080f204773"
let WeChatSecrect = "b7904c5721aeccc20fd11fe9afc23f4d"
var sceneDelegate:SceneDelegate? = {
                var uiScreen:UIScene?
                UIApplication.shared.connectedScenes.forEach { scenes in
DolphinEnglishLearnStudent/Config/WeChatTools.swift
New file
@@ -0,0 +1,205 @@
//
//  WeChatTools.swift
//  WanPai
//
//  Created by 无故事王国 on 2023/9/26.
//
import Foundation
import HandyJSON
typealias WeachatClosure = (WechatModel?)->(Void)
typealias WechatUserClosure = (WechatUserInfoModel?)->(Void)
struct WechatModel:HandyJSON{
                var access_token = ""
                var expires_in = 0
                var openid = ""
                var refresh_token = ""
                var scope = ""
                var unionid = ""
}
struct WechatUserInfoModel:HandyJSON{
                var openid = ""
                var nickname = ""
                var sex = 1
                var province = ""
                var city = ""
                var country = ""
                var headimgurl = ""
                var privilege = ""
                var unionid = ""
}
class WeChatTools{
                static func register(appid:String,link:String){
                                WXApi.registerApp(appid, universalLink: link)
                }
                /// 授权登录
                static func sendAuthRequest(){
                                let sendAuthReq = SendAuthReq()
                                sendAuthReq.scope = "snsapi_userinfo"
                                sendAuthReq.state = "dolpinEnglishStudent_iOS"
                                WXApi.send(sendAuthReq)
                }
                /// 完成授权登录,获取token
                static func getAccessToken(_ resp:SendAuthResp, loginInfo:WeachatClosure?){
                                guard resp.code != nil else {
                                                return
                                }
                                let url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=\(WeChatAPPID)&secret=\(WeChatSecrect)&code=\(resp.code!)&grant_type=authorization_code"
                                let Url = URL(string: url)
                                let session = URLSession.shared
                                let task = session.dataTask(with: Url!) { (data, response, error) in
                                                if error != nil{
                                                                return
                                                }
                                                do{
                                                                if let dataAsJSON = try JSONSerialization.jsonObject(with: data!) as? Dictionary<String, Any>{
                                                                                let model = WechatModel.deserialize(from: dataAsJSON)
                                                                                loginInfo?(model)
                                                                }else{
                                                                                loginInfo?(nil)
                                                                }
                                                }catch{
                                                                loginInfo?(nil)
                                                }
                                }
                                task.resume()
                }
                /// 获取用资料
                static func getUserInfo(access_token:String,openId:String,userInfo:WechatUserClosure?){
                                guard !access_token.isEmpty else {
                                                return
                                }
                                guard !openId.isEmpty else {
                                                return
                                }
                                let url = "https://api.weixin.qq.com/sns/userinfo?access_token=\(access_token)&openid=\(openId)"
                                let Url = URL(string: url)
                                let session = URLSession.shared
                                let task = session.dataTask(with: Url!) { (data, response, error) in
                                                if error != nil{
                                                                return
                                                }
                                                do{
                                                                if let dataAsJSON = try JSONSerialization.jsonObject(with: data!) as? Dictionary<String, Any>{
                                                                                let model = WechatUserInfoModel.deserialize(from: dataAsJSON)
                                                                                userInfo?(model)
                                                                }else{
                                                                                userInfo?(nil)
                                                                }
                                                }catch{
                                                                userInfo?(nil)
                                                }
                                }
                                task.resume()
                }
                /// 分享文本
                static func shareText(_ text:String,scene:WXScene = WXSceneSession){
                                let req = SendMessageToWXReq()
                                req.bText = true
                                req.text = text
                                req.scene = Int32(scene.rawValue)
                                WXApi.send(req)
                }
                /// 分享图片
                static func sharePic(_ img:UIImage,thumb:UIImage,scale:CGFloat = 0.6,scene:WXScene = WXSceneTimeline){
                                let imageObject = WXImageObject()
                                imageObject.imageData = img.jpegData(compressionQuality: scale)!
                                let mediaMessage = WXMediaMessage()
                                mediaMessage.thumbData = thumb.jpegData(compressionQuality: scale)
                                mediaMessage.mediaObject = imageObject
                                let req = SendMessageToWXReq()
                                req.bText = false
                                req.message = mediaMessage
                                req.scene = Int32(scene.rawValue)
                                WXApi.send(req)
                }
                /// 分享音乐
                static func shareMusic(_ musicUrl:String,musicLowBandUrl:String,title:String,desc:String,thumb:UIImage,scene:WXScene = WXSceneSession){
                                let musicObject = WXMusicObject()
                                musicObject.musicUrl = musicUrl
                                musicObject.musicLowBandUrl = musicLowBandUrl
                                let mediaMessage  = WXMediaMessage()
                                mediaMessage.title = title
                                mediaMessage.description = desc
                                mediaMessage.setThumbImage(thumb)
                                mediaMessage.mediaObject = musicObject
                                let req = SendMessageToWXReq()
                                req.bText = false
                                req.message = mediaMessage
                                req.scene = Int32(scene.rawValue)
                                WXApi.send(req)
                }
                /// 分享音乐
                static func shareMusic(_ musicData:String,musicLowBandData:String,title:String,desc:String,thumb:UIImage,scene:WXScene = WXSceneSession){
                                let musicObject = WXMusicObject()
                                musicObject.musicDataUrl = musicData
                                musicObject.musicLowBandUrl = musicLowBandData
                                let mediaMessage  = WXMediaMessage()
                                mediaMessage.title = title
                                mediaMessage.description = desc
                                mediaMessage.setThumbImage(thumb)
                                mediaMessage.mediaObject = musicObject
                                let req = SendMessageToWXReq()
                                req.bText = false
                                req.message = mediaMessage
                                req.scene = Int32(scene.rawValue)
                                WXApi.send(req)
                }
                static func shareUrl(_ url:String,title:String,desc:String,thumb:UIImage,scene:WXScene = WXSceneSession){
                                let webpageObject  = WXWebpageObject()
                                webpageObject.webpageUrl = url
                                let mediaMessage  = WXMediaMessage()
                                mediaMessage.title = title
                                mediaMessage.description = desc
                                mediaMessage.setThumbImage(thumb)
                                mediaMessage.mediaObject = webpageObject
                                let req = SendMessageToWXReq()
                                req.bText = false
                                req.message = mediaMessage
                                req.scene = Int32(scene.rawValue)
                                WXApi.send(req)
                }
                static func shareVideo(_ url:String,videoLowBandUrl:String,title:String,desc:String,thumb:UIImage, scene:WXScene = WXSceneSession){
                                let videoObject = WXVideoObject()
                                videoObject.videoUrl = url
                                videoObject.videoLowBandUrl = videoLowBandUrl
                                let mediaMessage  = WXMediaMessage()
                                mediaMessage.title = title
                                mediaMessage.description = desc
                                mediaMessage.setThumbImage(thumb)
                                mediaMessage.mediaObject = videoObject
                                let req = SendMessageToWXReq()
                                req.bText = false
                                req.message = mediaMessage
                                req.scene = Int32(scene.rawValue)
                                WXApi.send(req)
                }
}
DolphinEnglishLearnStudent/DolphinEnglishLearnStudent-Bridging-Header.h
New file
@@ -0,0 +1,5 @@
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "WXApi.h"
DolphinEnglishLearnStudent/DolphinEnglishLearnStudent.entitlements
New file
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.developer.associated-domains</key>
    <array>
        <string>applinks:dollearn/app/</string>
    </array>
</dict>
</plist>
DolphinEnglishLearnStudent/Info.plist
@@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleAllowMixedLocalizations</key>
    <true/>
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
@@ -9,10 +11,18 @@
            <string>Editor</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>dolpinEnglish</string>
                <string>wx723c6b080f204773</string>
            </array>
        </dict>
    </array>
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>weixin</string>
        <string>weixinAPI</string>
        <string>weixinURLParamsAPI</string>
    </array>
    <key>Localization native development region</key>
    <string>China</string>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.swift
@@ -6,6 +6,7 @@
//
import UIKit
import Lantern
class ListenFight_Game_CCell: UICollectionViewCell {
@@ -52,6 +53,36 @@
                                img_cover.sd_setImage(with: URL(string: m.img))
                }
                @IBAction func fullScreenAction(_ sender: UIButton) {
                                let lantern = Lantern()
                                lantern.numberOfItems = { () in
                                                return 1
                                }
                                lantern.cellClassAtIndex = { _ in
                                                LanternImageCell.self
                                }
                                lantern.transitionAnimator = LanternZoomAnimator(previousView: { [weak self] index -> UIView? in
                                                return self?.img_cover
                                })
                                // UIPageIndicator样式的页码指示器
                                lantern.pageIndicator = LanternDefaultPageIndicator()
                                lantern.pageIndex = 0
                                lantern.reloadCellAtIndex = { context in
                                                let lanternCell = context.cell as? LanternImageCell
                                                lanternCell?.imageView.image = self.img_cover.image
                                }
                                //不要使用push
                                lantern.show()
                }
                override func layoutSubviews() {
                                super.layoutSubviews()
                                view_top.jq_addCorners(corner: [.topLeft,.topRight], radius: 8)
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.xib
@@ -34,6 +34,9 @@
                                <rect key="frame" x="121" y="166" width="34" height="34"/>
                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                <state key="normal" image="icon_fullScreen"/>
                                <connections>
                                    <action selector="fullScreenAction:" destination="gTV-IL-0wX" eventType="touchUpInside" id="lBy-hW-25q"/>
                                </connections>
                            </button>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_success" translatesAutoresizingMaskIntoConstraints="NO" id="dMD-2P-QwE">
                                <rect key="frame" x="49.5" y="74" width="56" height="56"/>
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift
@@ -6,6 +6,7 @@
//
import UIKit
import Lantern
class HomeListenFight_lesson_3_VC: BaseVC {
@@ -264,7 +265,41 @@
                }
                @objc private func fullscreenAction(btn:UIButton){
                                print("全屏:\(btn.tag)")
                                var answerView:Lesson_3_AnswerView!
                                for (_,v) in (stackView.arrangedSubviews as! [Lesson_3_AnswerView]).enumerated(){
                                                if v.btn_fullscreen.tag == btn.tag{
                                                                answerView = v;break
                                                }
                                }
                                let lantern = Lantern()
                                lantern.numberOfItems = { () in
                                                return 1
                                }
                                lantern.cellClassAtIndex = { _ in
                                                LanternImageCell.self
                                }
                                lantern.transitionAnimator = LanternZoomAnimator(previousView: { index -> UIView? in
                                                return answerView.img_cover
                                })
                                // UIPageIndicator样式的页码指示器
                                lantern.pageIndicator = LanternDefaultPageIndicator()
                                lantern.pageIndex = 0
                                lantern.reloadCellAtIndex = { context in
                                                let lanternCell = context.cell as? LanternImageCell
                                                lanternCell?.imageView.image = answerView.img_cover.image
                                }
                                //不要使用push
                                lantern.show()
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift
@@ -303,9 +303,6 @@
                                                self.label_hint.text = "准备请听下一题"
                                                DispatchQueue.main.asyncAfter(deadline: .now()+3) {
                                                                self.times = self.listen1Model?.data?.time ?? 10
#if DEBUG
                                                                self.times = 60
#endif
                                                                self.totalCount += 1
                                                                self.rootViewModel.correctNum += 1
                                                                self.label_class.text = "\(self.totalCount)"
DolphinEnglishLearnStudent/Moudle/Me/MeVC.swift
@@ -83,7 +83,19 @@
                }
                @IBAction func shareAction(_ sender: QMUIButton) {
                                if WXApi.isWXAppSupportStateAPI(){
                                                ShareView.show()
                                }else{
                                                let urlStr = "https://dollearn.com/"
                                                if let url = URL(string: urlStr) {
                                                                let activityVC = UIActivityViewController(activityItems: [url], applicationActivities: nil)
                                                                activityVC.popoverPresentationController?.sourceView = self.view
                                                                let senderCenter = sender.convert(sender.bounds, to: self.view)
                                                                activityVC.popoverPresentationController?.sourceRect = CGRect(origin:senderCenter.center, size: CGSize(width: 1, height: 1))
                                                                present(activityVC, animated: true, completion: nil)
                                                }
                                }
                }
                @IBAction func quitAction(_ sender: UIButton) {
DolphinEnglishLearnStudent/Moudle/Me/View/ShareView.swift
New file
@@ -0,0 +1,52 @@
//
//  ShareView.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/6/19.
//
import UIKit
import JQTools
import QMUIKit
class ShareView: UIView,JQNibView{
                @IBOutlet weak var view_content: UIView!
                @IBOutlet weak var cons_bottom: NSLayoutConstraint!
                @IBOutlet weak var btn_wx: QMUIButton!
                @IBOutlet weak var btn_wxFri: QMUIButton!
                override func awakeFromNib() {
                                super.awakeFromNib()
                                btn_wx.imagePosition = .top
                                btn_wxFri.imagePosition = .top
                                btn_wx.spacingBetweenImageAndTitle = 8
                                btn_wxFri.spacingBetweenImageAndTitle = 8
                                cons_bottom.constant = -JQ_ScreenW
                                alpha = 0
                                layoutIfNeeded()
                }
                static func show(){
                                let shareView = ShareView.jq_loadNibView()
                                shareView.frame = sceneDelegate?.window?.frame ?? .zero
                                sceneDelegate?.window?.addSubview(shareView)
                                shareView.cons_bottom.constant = 0
                                UIView.animate(withDuration: 0.4) {
                                                shareView.layoutIfNeeded()
                                                shareView.alpha = 1
                                }
                }
                @IBAction func closeAction(_ sender: UIButton) {
                                cons_bottom.constant = -JQ_ScreenW
                                UIView.animate(withDuration: 0.4) {
                                                self.alpha = 0
                                                self.layoutIfNeeded()
                                }completion: { _ in
                                                self.removeFromSuperview()
                                }
                }
}
DolphinEnglishLearnStudent/Moudle/Me/View/ShareView.xib
New file
@@ -0,0 +1,97 @@
<?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">
    <device id="ipad10_9rounded" orientation="landscape" 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"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <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"/>
        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="ShareView" customModule="DolphinEnglishLearnStudent" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="1180" height="820"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FYo-U3-DCE">
                    <rect key="frame" x="0.0" y="587.5" width="1180" height="232.5"/>
                    <subviews>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="分享方式" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UvO-uQ-x4L">
                            <rect key="frame" x="553.5" y="16" width="73.5" height="21.5"/>
                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                            <nil key="highlightedColor"/>
                        </label>
                        <stackView opaque="NO" contentMode="scaleToFill" spacing="195" translatesAutoresizingMaskIntoConstraints="NO" id="QCL-dY-yrF">
                            <rect key="frame" x="398.5" y="97.5" width="383" height="51"/>
                            <subviews>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yhD-N5-Thb" customClass="QMUIButton">
                                    <rect key="frame" x="0.0" y="0.0" width="100" height="51"/>
                                    <fontDescription key="fontDescription" type="system" pointSize="12"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="微信好友" image="share_wx">
                                        <color key="titleColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                    </state>
                                </button>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pdf-iF-s8i" customClass="QMUIButton">
                                    <rect key="frame" x="295" y="0.0" width="88" height="51"/>
                                    <fontDescription key="fontDescription" type="system" pointSize="12"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="朋友圈" image="share_wxFri">
                                        <color key="titleColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                                    </state>
                                </button>
                            </subviews>
                        </stackView>
                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="iGl-Qk-fif">
                            <rect key="frame" x="1080" y="10" width="35" height="35"/>
                            <constraints>
                                <constraint firstAttribute="width" constant="35" id="BOm-0S-4Zg"/>
                                <constraint firstAttribute="height" constant="35" id="D1J-Ox-ykE"/>
                            </constraints>
                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                            <state key="normal" image="btn_close_circle"/>
                            <connections>
                                <action selector="closeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="a7e-6x-k9c"/>
                            </connections>
                        </button>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <constraints>
                        <constraint firstItem="QCL-dY-yrF" firstAttribute="top" secondItem="UvO-uQ-x4L" secondAttribute="bottom" constant="60" id="Eer-Jq-yeA"/>
                        <constraint firstItem="iGl-Qk-fif" firstAttribute="top" secondItem="FYo-U3-DCE" secondAttribute="top" constant="10" id="Kak-W0-6L7"/>
                        <constraint firstItem="UvO-uQ-x4L" firstAttribute="top" secondItem="FYo-U3-DCE" secondAttribute="top" constant="16" id="UOu-Ae-ETf"/>
                        <constraint firstAttribute="trailing" secondItem="iGl-Qk-fif" secondAttribute="trailing" constant="65" id="V9H-dk-3ZE"/>
                        <constraint firstItem="QCL-dY-yrF" firstAttribute="centerX" secondItem="FYo-U3-DCE" secondAttribute="centerX" id="Xej-yC-6gP"/>
                        <constraint firstItem="UvO-uQ-x4L" firstAttribute="centerX" secondItem="FYo-U3-DCE" secondAttribute="centerX" id="g4N-ZC-j5u"/>
                        <constraint firstAttribute="width" secondItem="FYo-U3-DCE" secondAttribute="height" multiplier="1:0.1972" id="hji-FF-fZU"/>
                    </constraints>
                </view>
            </subviews>
            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/>
            <constraints>
                <constraint firstItem="FYo-U3-DCE" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="Fy2-3W-zW7"/>
                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="FYo-U3-DCE" secondAttribute="trailing" id="cpO-Bd-3jx"/>
                <constraint firstAttribute="bottom" secondItem="FYo-U3-DCE" secondAttribute="bottom" id="tjg-FW-AJg"/>
            </constraints>
            <connections>
                <outlet property="btn_wx" destination="yhD-N5-Thb" id="Ifz-R6-fvq"/>
                <outlet property="btn_wxFri" destination="pdf-iF-s8i" id="JMT-Tz-Qey"/>
                <outlet property="cons_bottom" destination="tjg-FW-AJg" id="DkR-pm-WBb"/>
                <outlet property="view_content" destination="FYo-U3-DCE" id="TtL-FL-nv8"/>
            </connections>
            <point key="canvasLocation" x="56.949152542372886" y="19.756097560975608"/>
        </view>
    </objects>
    <resources>
        <image name="btn_close_circle" width="26" height="26"/>
        <image name="share_wx" width="50" height="50"/>
        <image name="share_wxFri" width="51" height="51"/>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
DolphinEnglishLearnStudent/SceneDelegate.swift
@@ -30,6 +30,10 @@
                                                return
                                }
                                loginSuccess()
                                if WXApi.isWXAppInstalled(){
                                                WeChatTools.sendAuthRequest()
                                }
                }
                func sceneDidDisconnect(_ scene: UIScene) {
Podfile
@@ -15,5 +15,6 @@
  pod 'CryptoSwift' # 常用加密算法
    pod 'Alamofire' # 网络请求框架
    pod 'Lantern' # 图片浏览器
    pod 'WechatOpenSDK-XCFramework' # 微信开放平台组件
end