增加换肤功能

This commit is contained in:
启星
2025-08-14 09:40:25 +08:00
parent 8065693d4c
commit 9a6659045d
24 changed files with 446 additions and 79 deletions

View File

@@ -12,7 +12,9 @@
95C29EA62E19166700F2524D /* QXLiveScreen.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 95C29E9D2E19166700F2524D /* QXLiveScreen.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
95C29EAB2E19173300F2524D /* AgoraReplayKitExtension.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95C292A42E18ED0C00F2524D /* AgoraReplayKitExtension.xcframework */; };
95C29EAD2E191D6800F2524D /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95C2925B2E18BBF800F2524D /* ReplayKit.framework */; };
95C304262E4A05E3004B2D82 /* QXLiveScreen.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 95C29E9D2E19166700F2524D /* QXLiveScreen.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
95C327442E4C4068004B2D82 /* AgoraReplayKitExtension.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95C292A42E18ED0C00F2524D /* AgoraReplayKitExtension.xcframework */; };
95C327452E4C4068004B2D82 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95C2925B2E18BBF800F2524D /* ReplayKit.framework */; };
95C327502E4C40AB004B2D82 /* QXLiveScreenDev.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 95C3274A2E4C4068004B2D82 /* QXLiveScreenDev.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
95C3EFEF2E49F44A004B2D82 /* ReplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95C2925B2E18BBF800F2524D /* ReplayKit.framework */; };
95C3EFF02E49F44A004B2D82 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 95F205062DEF0AD20031E710 /* libz.tbd */; };
95C3EFF12E49F44A004B2D82 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95F205042DEF0AC20031E710 /* CoreTelephony.framework */; };
@@ -58,12 +60,12 @@
remoteGlobalIDString = 95C29E9C2E19166700F2524D;
remoteInfo = QXLiveScreen;
};
95C304242E4A05D7004B2D82 /* PBXContainerItemProxy */ = {
95C3274E2E4C4099004B2D82 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 9593D70F2DB9C95C0082CA57 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 95C29E9C2E19166700F2524D;
remoteInfo = QXLiveScreen;
remoteGlobalIDString = 95C327412E4C4068004B2D82;
remoteInfo = QXLiveScreenDev;
};
/* End PBXContainerItemProxy section */
@@ -85,7 +87,7 @@
dstPath = "";
dstSubfolderSpec = 13;
files = (
95C304262E4A05E3004B2D82 /* QXLiveScreen.appex in Embed Foundation Extensions */,
95C327502E4C40AB004B2D82 /* QXLiveScreenDev.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
@@ -106,6 +108,8 @@
95C292AB2E18ED4A00F2524D /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; };
95C292AE2E18ED6300F2524D /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
95C29E9D2E19166700F2524D /* QXLiveScreen.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = QXLiveScreen.appex; sourceTree = BUILT_PRODUCTS_DIR; };
95C3274A2E4C4068004B2D82 /* QXLiveScreenDev.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = QXLiveScreenDev.appex; sourceTree = BUILT_PRODUCTS_DIR; };
95C3274C2E4C4068004B2D82 /* QXLiveScreen copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "QXLiveScreen copy-Info.plist"; path = "/Users/qixing/Desktop/项目/羽声/featherVoice/QXLiveScreen copy-Info.plist"; sourceTree = "<absolute>"; };
95C3F0022E49F44A004B2D82 /* QXLiveDev.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QXLiveDev.app; sourceTree = BUILT_PRODUCTS_DIR; };
95F204FA2DEF0AA10031E710 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
95F204FC2DEF0AAC0031E710 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; };
@@ -136,6 +140,13 @@
);
target = 95C29E9C2E19166700F2524D /* QXLiveScreen */;
};
95C3274B2E4C4068004B2D82 /* Exceptions for "QXLiveScreen" folder in "QXLiveScreenDev" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
target = 95C327412E4C4068004B2D82 /* QXLiveScreenDev */;
};
95C3F0032E49F44A004B2D82 /* Exceptions for "QXLive" folder in "QXLiveDev" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
@@ -179,6 +190,7 @@
exceptions = (
95C29EAA2E19166700F2524D /* Exceptions for "QXLiveScreen" folder in "QXLiveScreen" target */,
95C3F25C2E49F646004B2D82 /* Exceptions for "QXLiveScreen" folder in "QXLiveDev" target */,
95C3274B2E4C4068004B2D82 /* Exceptions for "QXLiveScreen" folder in "QXLiveScreenDev" target */,
);
path = QXLiveScreen;
sourceTree = "<group>";
@@ -227,6 +239,15 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
95C327432E4C4068004B2D82 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
95C327442E4C4068004B2D82 /* AgoraReplayKitExtension.xcframework in Frameworks */,
95C327452E4C4068004B2D82 /* ReplayKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
95C3EFEE2E49F44A004B2D82 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -293,6 +314,7 @@
9593D7182DB9C95C0082CA57 /* Products */,
2B243E5E8CFE9B1EF0A08846 /* Pods */,
4B6F40DB8328A2B2BB1BF79D /* Frameworks */,
95C3274C2E4C4068004B2D82 /* QXLiveScreen copy-Info.plist */,
);
sourceTree = "<group>";
};
@@ -304,6 +326,7 @@
9593D73C2DB9C95E0082CA57 /* QXLiveUITests.xctest */,
95C29E9D2E19166700F2524D /* QXLiveScreen.appex */,
95C3F0022E49F44A004B2D82 /* QXLiveDev.app */,
95C3274A2E4C4068004B2D82 /* QXLiveScreenDev.appex */,
);
name = Products;
sourceTree = "<group>";
@@ -398,6 +421,26 @@
productReference = 95C29E9D2E19166700F2524D /* QXLiveScreen.appex */;
productType = "com.apple.product-type.app-extension";
};
95C327412E4C4068004B2D82 /* QXLiveScreenDev */ = {
isa = PBXNativeTarget;
buildConfigurationList = 95C327472E4C4068004B2D82 /* Build configuration list for PBXNativeTarget "QXLiveScreenDev" */;
buildPhases = (
95C327422E4C4068004B2D82 /* Sources */,
95C327432E4C4068004B2D82 /* Frameworks */,
95C327462E4C4068004B2D82 /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
95C29E9F2E19166700F2524D /* QXLiveScreen */,
);
name = QXLiveScreenDev;
productName = QXLiveScreen;
productReference = 95C3274A2E4C4068004B2D82 /* QXLiveScreenDev.appex */;
productType = "com.apple.product-type.app-extension";
};
95C3EFE92E49F44A004B2D82 /* QXLiveDev */ = {
isa = PBXNativeTarget;
buildConfigurationList = 95C3EFFF2E49F44A004B2D82 /* Build configuration list for PBXNativeTarget "QXLiveDev" */;
@@ -413,7 +456,7 @@
buildRules = (
);
dependencies = (
95C304252E4A05D7004B2D82 /* PBXTargetDependency */,
95C3274F2E4C4099004B2D82 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
9593D7192DB9C95C0082CA57 /* QXLive */,
@@ -470,6 +513,7 @@
9593D73B2DB9C95E0082CA57 /* QXLiveUITests */,
95C29E9C2E19166700F2524D /* QXLiveScreen */,
95C3EFE92E49F44A004B2D82 /* QXLiveDev */,
95C327412E4C4068004B2D82 /* QXLiveScreenDev */,
);
};
/* End PBXProject section */
@@ -503,6 +547,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
95C327462E4C4068004B2D82 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
95C3EFFA2E49F44A004B2D82 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@@ -656,6 +707,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
95C327422E4C4068004B2D82 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
95C3EFED2E49F44A004B2D82 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -681,10 +739,10 @@
target = 95C29E9C2E19166700F2524D /* QXLiveScreen */;
targetProxy = 95C29EA42E19166700F2524D /* PBXContainerItemProxy */;
};
95C304252E4A05D7004B2D82 /* PBXTargetDependency */ = {
95C3274F2E4C4099004B2D82 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 95C29E9C2E19166700F2524D /* QXLiveScreen */;
targetProxy = 95C304242E4A05D7004B2D82 /* PBXContainerItemProxy */;
target = 95C327412E4C4068004B2D82 /* QXLiveScreenDev */;
targetProxy = 95C3274E2E4C4099004B2D82 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@@ -698,7 +756,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = QXLive/QXLive.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = 8798G5VMH9;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -733,7 +791,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.3;
MARKETING_VERSION = 1.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -758,7 +816,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = QXLive/QXLive.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = 8798G5VMH9;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -793,7 +851,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.3;
MARKETING_VERSION = 1.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -1046,6 +1104,58 @@
};
name = Release;
};
95C327482E4C4068004B2D82 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = QXLiveScreen/QXLiveScreen.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 8798G5VMH9;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "QXLiveScreen copy-Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "羽声";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive.test.QXLiveScreen;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
95C327492E4C4068004B2D82 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = QXLiveScreen/QXLiveScreen.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 8798G5VMH9;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "QXLiveScreen copy-Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "羽声";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive.test.QXLiveScreen;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
95C3F0002E49F44A004B2D82 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = F5E37D2ED830731B446A7058 /* Pods-QXLive.debug.xcconfig */;
@@ -1091,7 +1201,7 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive.test;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
@@ -1151,7 +1261,7 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive.test;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
@@ -1213,6 +1323,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
95C327472E4C4068004B2D82 /* Build configuration list for PBXNativeTarget "QXLiveScreenDev" */ = {
isa = XCConfigurationList;
buildConfigurations = (
95C327482E4C4068004B2D82 /* Debug */,
95C327492E4C4068004B2D82 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
95C3EFFF2E49F44A004B2D82 /* Build configuration list for PBXNativeTarget "QXLiveDev" */ = {
isa = XCConfigurationList;
buildConfigurations = (

View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1620"
version = "2.0">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95C327412E4C4068004B2D82"
BuildableName = "QXLiveScreenDev.appex"
BlueprintName = "QXLiveScreenDev"
ReferencedContainer = "container:QXLive.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
launchStyle = "0"
askForAppToLaunch = "Yes"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"
launchAutomaticallySubstyle = "2">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
askForAppToLaunch = "Yes"
launchAutomaticallySubstyle = "2">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95C327412E4C4068004B2D82"
BuildableName = "QXLiveScreenDev.appex"
BlueprintName = "QXLiveScreenDev"
ReferencedContainer = "container:QXLive.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -12,13 +12,18 @@
<key>QXLiveDev.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>64</integer>
<integer>63</integer>
</dict>
<key>QXLiveScreen.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>QXLiveScreenDev.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>64</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>

View File

@@ -208,38 +208,6 @@
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "110736A2-4444-4893-BAF4-09076130DE0E"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "QXLive/Other/AppDelegate+Login.m"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "35"
endingLineNumber = "35"
landmarkName = "-ATAuthSDK"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "2A7AB14C-7765-4265-8902-3218C4F8FD59"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "QXLive/Login(&#x767b;&#x5f55;)/Controlller/QXLoginViewController.m"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "208"
endingLineNumber = "208"
landmarkName = "-startLoginWithModel:complete:"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent

View File

@@ -0,0 +1,16 @@
//
// QXAppStartViewController.h
// QXLive
//
// Created by 启星 on 2025/8/12.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface QXAppStartViewController : UIViewController
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,107 @@
//
// QXAppStartViewController.m
// QXLive
//
// Created by on 2025/8/12.
//
#import "QXAppStartViewController.h"
#import "AppDelegate.h"
@interface QXAppStartViewController ()
@property (nonatomic,strong)UIImageView *bgImaegView;
@end
@implementation QXAppStartViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.bgImaegView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.bgImaegView.image = [UIImage imageNamed:@"启动页"];;
self.bgImaegView.contentMode = UIViewContentModeScaleAspectFill;
[self.view addSubview:self.bgImaegView];
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSuccess) name:noticeUserLogin object:nil];
[self getAppTheme];
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
// [[NSNotificationCenter defaultCenter] removeObserver:self];
}
-(void)getAppTheme{
NSString *themeUrl = [NSString stringWithFormat:@"%@%@",ServerUrl,QXAppTheme];
[[QXRequset shareInstance] getWithUrl:themeUrl parameters:@{} needCache:NO success:^(id responseObject) {
[QXConfig defaultConfig];
QXThemeModel *model = [QXThemeModel yy_modelWithJSON:responseObject[@"data"]];
if (model.theme_color && model.theme_color.length > 0) {
QXConfig.shared.themeColor = [UIColor colorWithHexString:model.theme_color];
}
// QXConfig.shared.themeColor = [UIColor colorWithHexString:@"#ff0000"];
if (model.btn_text_color && model.btn_text_color.length > 0) {
QXConfig.shared.btnTextColor = [UIColor colorWithHexString:model.btn_text_color];
}
if (model.app_bg && model.app_bg.length > 0) {
QXConfig.shared.backgroundImage = model.app_bg;
}
QXTabbarModel *tabbarIndex1 = QXConfig.shared.tabbarArray[0];
QXTabbarModel *tabbarIndex2 = QXConfig.shared.tabbarArray[1];
QXTabbarModel *tabbarIndex3 = QXConfig.shared.tabbarArray[2];
QXTabbarModel *tabbarIndex4 = QXConfig.shared.tabbarArray[3];
if (model.home_nor && model.home_nor.length > 0) {
tabbarIndex1.normalImage = model.home_nor;
}
if (model.home_sel && model.home_sel.length > 0) {
tabbarIndex1.selectedImage = model.home_sel;
}
if (model.find_nor && model.find_nor.length > 0) {
tabbarIndex2.normalImage = model.find_nor;
}
if (model.find_sel && model.find_sel.length > 0) {
tabbarIndex2.selectedImage = model.find_sel;
}
if (model.msg_nor && model.msg_nor.length > 0) {
tabbarIndex3.normalImage = model.msg_nor;
}
if (model.msg_sel && model.msg_sel.length > 0) {
tabbarIndex3.selectedImage = model.msg_sel;
}
if (model.mine_nor && model.mine_nor.length > 0) {
tabbarIndex4.normalImage = model.mine_nor;
}
if (model.mine_sel && model.mine_sel.length > 0) {
tabbarIndex4.selectedImage = model.mine_sel;
}
QXConfig.shared.tabbarArray = @[tabbarIndex1,tabbarIndex2,tabbarIndex3,tabbarIndex4];
AppDelegate *delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
[delegate changeRootViewControllerIsTabbar];
NSLog(@"请求成功");
} fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) {
NSLog(@"请求失败");
[self alertNetworkError];
}];
}
-(void)loginSuccess{
[self getAppTheme];
}
-(void)alertNetworkError{
MJWeakSelf
UIAlertController *al = [UIAlertController alertControllerWithTitle:@"网络错误" message:@"" preferredStyle:(UIAlertControllerStyleAlert)];
[al addAction:[UIAlertAction actionWithTitle:@"重试" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
[weakSelf getAppTheme];
}]];
[self presentViewController:al animated:YES completion:nil];
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end

View File

@@ -54,7 +54,7 @@
if (![imageUrl isExist]) {
return;
}
if ([imageUrl hasPrefix:@"http"]) {
if ([imageUrl hasPrefix:@"http"] || [imageUrl hasPrefix:@"https"]) {
[self.bgImageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:nil];
}else{
self.bgImageView.image = [UIImage imageNamed:imageUrl];
@@ -64,6 +64,7 @@
if (!_bgImageView) {
_bgImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
_bgImageView.contentMode = UIViewContentModeScaleAspectFill;
_bgImageView.clipsToBounds = YES;
}
return _bgImageView;
}

View File

@@ -194,7 +194,7 @@
return;
}
navagationController = (QXBaseNavigationController*)KEYWINDOW.rootViewController;
navagationController.interactivePopGestureRecognizer.enabled = NO;
// navagationController.interactivePopGestureRecognizer.enabled = NO;
if (_miniView) {
[_miniView removeFromSuperview];
_miniView = nil;

View File

@@ -53,7 +53,7 @@
- (void)initializeAgoraEngine {
self.agoraKit = [AgoraRtcEngineKit sharedEngineWithAppId:AgoraAuthId delegate:self];
[self.agoraKit enableAudioVolumeIndication:200 smooth:3 reportVad:NO];
[self.agoraKit getCurrentMonotonicTimeInMs];
[self.agoraKit setAudioProfile:AgoraAudioProfileMusicHighQualityStereo];
[self.agoraKit setAudioScenario:AgoraAudioScenarioChorus];

View File

@@ -53,4 +53,43 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,strong)NSString *title;
@end
@interface QXThemeModel : NSObject
/**
app背景图片 app_bg
首页选中 home_sel
首页正常 home_nor
广场选中 find_sel
广场正常 find_nor
消息选中 msg_sel
消息正常 msg_nor
我的选中 mine_sel
我的正常 mine_nor
主题色 theme_color
按钮文字色 btn_text_color
*/
/// app背景图片
@property (nonatomic,strong)NSString *app_bg;
/// 首页选中
@property (nonatomic,strong)NSString *home_sel;
/// 首页正常
@property (nonatomic,strong)NSString *home_nor;
/// 广场选中
@property (nonatomic,strong)NSString *find_sel;
/// 广场正常
@property (nonatomic,strong)NSString *find_nor;
/// 消息选中
@property (nonatomic,strong)NSString *msg_sel;
/// 消息正常
@property (nonatomic,strong)NSString *msg_nor;
/// 我的选中
@property (nonatomic,strong)NSString *mine_sel;
/// 我的正常
@property (nonatomic,strong)NSString *mine_nor;
/// 主题色
@property (nonatomic,strong)NSString *theme_color;
/// 按钮颜色
@property (nonatomic,strong)NSString *btn_text_color;
@end
NS_ASSUME_NONNULL_END

View File

@@ -105,3 +105,8 @@
@end
@implementation QXThemeModel
@end

View File

@@ -120,7 +120,7 @@ QXRoomUserInfoViewDelegate
}
}
self.navigationController.viewControllers = marr;
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
// self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
@@ -749,7 +749,7 @@ QXRoomUserInfoViewDelegate
-(void)userDidTakeOffWithUserInfo:(QXUserHomeModel *)userInfo{
if ([userInfo.user_id isEqualToString:QXGlobal.shareGlobal.loginModel.user_id]) {
[[QXGlobal shareGlobal] quitRoomWithRoomId:self.roomId];
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
// self.navigationController.interactivePopGestureRecognizer.enabled = YES;
[self.navigationController popViewControllerAnimated:YES];
}
}

View File

@@ -380,12 +380,12 @@
}
-(void)miniRoom{
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
// self.navigationController.interactivePopGestureRecognizer.enabled = YES;
[self.navigationController popViewControllerAnimated:YES];
}
-(void)leaveRoom{
[[QXGlobal shareGlobal]quitRoomWithRoomId:self.roomId];
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
// self.navigationController.interactivePopGestureRecognizer.enabled = YES;
[self.navigationController popViewControllerAnimated:YES];
}

View File

@@ -397,13 +397,17 @@
-(UIImageView *)noUserImageView{
if (!_noUserImageView) {
_noUserImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_seat_icon"]];
UIImage *image = [UIImage imageNamed:@"room_seat_icon"];
// image = [image imageByTintColor:QXConfig.themeColor];
_noUserImageView = [[UIImageView alloc] initWithImage:image];
}
return _noUserImageView;
}
-(UIImageView *)offlineImageView{
if (!_offlineImageView) {
_offlineImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_user_offline"]];
UIImage *image = [UIImage imageNamed:@"room_user_offline"];
// image = [image imageByTintColor:QXConfig.themeColor];
_offlineImageView = [[UIImageView alloc] initWithImage:image];
_offlineImageView.contentMode = UIViewContentModeScaleToFill;
_offlineImageView.hidden = YES;
}

View File

@@ -275,12 +275,12 @@
}
-(void)miniRoom{
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
// self.navigationController.interactivePopGestureRecognizer.enabled = YES;
[self.navigationController popViewControllerAnimated:YES];
}
-(void)leaveRoom{
[[QXGlobal shareGlobal]quitRoomWithRoomId:self.roomModel.room_info.room_id];
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
// self.navigationController.interactivePopGestureRecognizer.enabled = YES;
[self.navigationController popViewControllerAnimated:YES];
}
@end

View File

@@ -410,7 +410,7 @@
</objects>
<resources>
<image name="Plus Circle" width="24" height="24"/>
<image name="app_bg" width="375" height="465"/>
<image name="app_bg" width="375" height="812"/>
<image name="login_sex_boy_nor" width="160" height="77"/>
<image name="login_sex_boy_sel" width="160" height="77"/>
<image name="login_sex_girl_nor" width="160" height="77"/>

View File

@@ -45,7 +45,8 @@
}];
self.bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, self.systemView.bottom, SCREEN_WIDTH, 8)];
self.bottomView.backgroundColor = RGB16(0xececec);
// self.bottomView.backgroundColor = RGB16(0xececec);
self.bottomView.backgroundColor = [UIColor clearColor];
[self addSubview:self.bottomView];
}
-(void)setModel:(QXMessageModel *)model{

View File

@@ -14,6 +14,7 @@
#import <AlipaySDK/AlipaySDK.h>
#import <TIMPush/TIMPushManager.h>
#import <SDWebImageWebPCoder/SDWebImageWebPCoder.h>
#import "QXAppStartViewController.h"
#if DEBUG
#import <LLDebugTool.h>
#endif
@@ -29,15 +30,8 @@
[QXConfig defaultConfig];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
if ([QXGlobal shareGlobal].isLogin && [[QXGlobal shareGlobal].loginModel.sex isEqualToString:@"0"]) {
QXFillUserInfoViewController *vc = [[QXFillUserInfoViewController alloc] init];
self.window.rootViewController = vc;
}else{
self.tabbarVC = [[QXTabbarController alloc] init];
QXBaseNavigationController *na = [[QXBaseNavigationController alloc] initWithRootViewController:self.tabbarVC];
na.navigationBarHidden = YES;
self.window.rootViewController = na;
}
QXAppStartViewController *startVC = [[QXAppStartViewController alloc] init];
self.window.rootViewController = startVC;
[Bugly startWithAppId:@"38d154fc5f"];
SDImageWebPCoder *webPCoder = [SDImageWebPCoder sharedCoder];
[[SDImageCodersManager sharedManager] addCoder:webPCoder];
@@ -61,11 +55,16 @@
[AvoidCrash becomeEffective];
}
-(void)changeRootViewControllerIsTabbar{
if ([QXGlobal shareGlobal].isLogin && [[QXGlobal shareGlobal].loginModel.sex isEqualToString:@"0"]) {
QXFillUserInfoViewController *vc = [[QXFillUserInfoViewController alloc] init];
self.window.rootViewController = vc;
}else{
self.tabbarVC = [[QXTabbarController alloc] init];
QXBaseNavigationController *na = [[QXBaseNavigationController alloc] initWithRootViewController:self.tabbarVC];
na.navigationBarHidden = YES;
self.window.rootViewController = na;
}
}

View File

@@ -17,7 +17,7 @@
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="启动页" translatesAutoresizingMaskIntoConstraints="NO" id="ydi-6i-HE8">
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="启动页" translatesAutoresizingMaskIntoConstraints="NO" id="ydi-6i-HE8">
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
</imageView>
</subviews>

View File

@@ -27,6 +27,10 @@ static NSInteger const AddressOfMQTTPort = 1883;
static NSInteger const AppPushId = 46164;
static NSString *const AgoraAuthId = @"05b406b4541e413887d8d2bf9be8642c";
//一键登录AuthSDKInfo
static NSString *const AuthSDKKey = @"Q8xhyn+MAyHw8FQLjKOWU8ZrZMXsuflPGSxDvwKu8ULvm8eZBPNLfezCsyuKzISPIGbMK5oR6fX/TyIdFwBjfL2lUteddxG+fu8aBuyScR066oDRhj66x97xM+9n6lnog9MOdMvGryx6PkZa1/un0IoX46SfrjpitnzYZvfFlavVDOq50iO4piAU/idOWnyY+1bQAnBQsfr8ZKHTAbpR2aUn4C6R37MvtXHnmD+o3Qjx0SbCxpsvs9h91/VBQ2+XEIynDIPDM+0=";
#else
static NSString *const WechatAppId = @"wxc7681513be9f926b";
@@ -47,7 +51,11 @@ static NSInteger const AddressOfMQTTPort = 1883;
static NSInteger const AppPushId = 46163;
///声网
static NSString *const AgoraAuthId = @"4a521d6f1c6343998b1c8fd425dea02a";
//一键登录AuthSDKInfo
static NSString *const AuthSDKKey = @"hKYFcoI6vIdz9/yOCs3XJ/fUQ0u3DHGa5UPONdSJfSccjVtn3sHBRecwepn5iNIgOYWq8xgUc4LtWqSjpveHIYzJx0YcQm/j5IXdVKe74RI+4vT00UwP8oQSZ2w0a18Sbbd8uKgFys8CUyQZWfMZXHIVuHmNBHRHZ1xoX2sCCCl56U3vQ11ZSpJdeZW4wvQ8qeQ56Q4wyW5hyo/yFU1sxohn1ApS6FbbXXwroWV57aK1R9+zaBOqn41NCKlvKsSD";
#endif
/// 声网
@@ -74,8 +82,7 @@ static NSString *const CHAT_IMG_FILE_BASE_PATH = @"emchat/image/ios/";
static NSString *const CHAT_VIDEO_FILE_BASE_PATH = @"emchat/videos/ios";
static NSString *const CHAT_AUDIO_FILE_BASE_PATH = @"emchat/audio/ios/";
//一键登录AuthSDKInfo
static NSString *const AuthSDKKey = @"hKYFcoI6vIdz9/yOCs3XJ/fUQ0u3DHGa5UPONdSJfSccjVtn3sHBRecwepn5iNIgOYWq8xgUc4LtWqSjpveHIYzJx0YcQm/j5IXdVKe74RI+4vT00UwP8oQSZ2w0a18Sbbd8uKgFys8CUyQZWfMZXHIVuHmNBHRHZ1xoX2sCCCl56U3vQ11ZSpJdeZW4wvQ8qeQ56Q4wyW5hyo/yFU1sxohn1ApS6FbbXXwroWV57aK1R9+zaBOqn41NCKlvKsSD";
/// 本地存储

View File

@@ -21,6 +21,8 @@ static NSString * QXGuidePage = @"api/banner/get_banner_qidonglist";
static NSString * QXAppVersion = @"api/Version/get_app_version";
/// 协议
static NSString * QXAppProtocol = @"api/Page/page_show";
/// 获取主题配置
static NSString * QXAppTheme = @"api/Theme/get_theme_data";
#pragma mark - 登录
/// 验证码登录获取账号列表

View File

@@ -96,9 +96,17 @@
/// @param title
- (void)setTabBarImageUrl:(NSString *)imageUrl selectedImg:(nonnull NSString *)imageName title:(nonnull NSString *)title {
self.titleLbl.text = title;
if ([imageUrl hasPrefix:@"http"] || [imageUrl hasPrefix:@"https"]) {
[self.iconBtn sd_setBackgroundImageWithURL:[NSURL URLWithString:imageUrl] forState:UIControlStateNormal placeholderImage:nil];
}else{
[self.iconBtn setBackgroundImage:[UIImage imageNamed:imageUrl] forState:UIControlStateNormal];
}
if ([imageName hasPrefix:@"http"] || [imageName hasPrefix:@"https"]) {
[self.iconBtn sd_setBackgroundImageWithURL:[NSURL URLWithString:imageName] forState:UIControlStateSelected placeholderImage:nil];
}else{
[self.iconBtn setBackgroundImage:[UIImage imageNamed:imageName] forState:UIControlStateSelected];
}
}
- (void)heartAnimationWithView:(UIView*)view{
CABasicAnimation *anima = [CABasicAnimation animation];

View File

@@ -0,0 +1,15 @@
<?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>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.broadcast-services-upload</string>
<key>NSExtensionPrincipalClass</key>
<string>SampleHandler</string>
<key>RPBroadcastProcessMode</key>
<string>RPBroadcastProcessModeSampleBuffer</string>
</dict>
</dict>
</plist>