diff --git a/QXLive.xcodeproj/project.pbxproj b/QXLive.xcodeproj/project.pbxproj index 8772869..2f3b6f6 100644 --- a/QXLive.xcodeproj/project.pbxproj +++ b/QXLive.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 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, ); }; }; 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 */; }; @@ -57,6 +58,13 @@ remoteGlobalIDString = 95C29E9C2E19166700F2524D; remoteInfo = QXLiveScreen; }; + 95C304242E4A05D7004B2D82 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9593D70F2DB9C95C0082CA57 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 95C29E9C2E19166700F2524D; + remoteInfo = QXLiveScreen; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -77,6 +85,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( + 95C304262E4A05E3004B2D82 /* QXLiveScreen.appex in Embed Foundation Extensions */, ); name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -404,6 +413,7 @@ buildRules = ( ); dependencies = ( + 95C304252E4A05D7004B2D82 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( 9593D7192DB9C95C0082CA57 /* QXLive */, @@ -671,6 +681,11 @@ target = 95C29E9C2E19166700F2524D /* QXLiveScreen */; targetProxy = 95C29EA42E19166700F2524D /* PBXContainerItemProxy */; }; + 95C304252E4A05D7004B2D82 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 95C29E9C2E19166700F2524D /* QXLiveScreen */; + targetProxy = 95C304242E4A05D7004B2D82 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -683,7 +698,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = QXLive/QXLive.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = 8798G5VMH9; ENABLE_USER_SCRIPT_SANDBOXING = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -703,7 +718,7 @@ ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = QXLive/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "羽声"; + INFOPLIST_KEY_CFBundleDisplayName = "羽声语音"; INFOPLIST_KEY_NSCameraUsageDescription = "访问您的相机,允许可以开启直播和录制视频"; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "访问您的位置,系统将获取您附近的用户进行推荐展示"; INFOPLIST_KEY_NSMicrophoneUsageDescription = "访问您的麦克风,允许可以录制声音以便在聊天室进行语音聊天"; @@ -718,7 +733,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.2; + MARKETING_VERSION = 1.0.3; PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -743,7 +758,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = QXLive/QXLive.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = 8798G5VMH9; ENABLE_USER_SCRIPT_SANDBOXING = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -763,7 +778,7 @@ ); GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = QXLive/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "羽声"; + INFOPLIST_KEY_CFBundleDisplayName = "羽声语音"; INFOPLIST_KEY_NSCameraUsageDescription = "访问您的相机,允许可以开启直播和录制视频"; INFOPLIST_KEY_NSLocationWhenInUseUsageDescription = "访问您的位置,系统将获取您附近的用户进行推荐展示"; INFOPLIST_KEY_NSMicrophoneUsageDescription = "访问您的麦克风,允许可以录制声音以便在聊天室进行语音聊天"; @@ -778,7 +793,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.2; + MARKETING_VERSION = 1.0.3; PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -1076,7 +1091,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.2; - PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive.test; + PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -1136,7 +1151,7 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0.2; - PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive.test; + PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; diff --git a/QXLive.xcodeproj/xcshareddata/xcschemes/QXLiveScreen.xcscheme b/QXLive.xcodeproj/xcshareddata/xcschemes/QXLiveScreen.xcscheme index 05dd2b8..35da550 100644 --- a/QXLive.xcodeproj/xcshareddata/xcschemes/QXLiveScreen.xcscheme +++ b/QXLive.xcodeproj/xcshareddata/xcschemes/QXLiveScreen.xcscheme @@ -43,8 +43,8 @@ buildForAnalyzing = "YES"> @@ -74,8 +74,8 @@ runnableDebuggingMode = "0"> @@ -93,8 +93,8 @@ runnableDebuggingMode = "0"> diff --git a/QXLive.xcworkspace/xcuserdata/qixing.xcuserdatad/UserInterfaceState.xcuserstate b/QXLive.xcworkspace/xcuserdata/qixing.xcuserdatad/UserInterfaceState.xcuserstate index 556b935..4751670 100644 Binary files a/QXLive.xcworkspace/xcuserdata/qixing.xcuserdatad/UserInterfaceState.xcuserstate and b/QXLive.xcworkspace/xcuserdata/qixing.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/QXLive.xcworkspace/xcuserdata/qixing.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/QXLive.xcworkspace/xcuserdata/qixing.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 2247d38..1549c06 100644 --- a/QXLive.xcworkspace/xcuserdata/qixing.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/QXLive.xcworkspace/xcuserdata/qixing.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -16,38 +16,6 @@ stopOnStyle = "0"> - - - - - - - - + + + + + + + + + + + + diff --git a/QXLive/Base/NSURLSession+QX.h b/QXLive/Base/NSURLSession+QX.h new file mode 100644 index 0000000..f65adba --- /dev/null +++ b/QXLive/Base/NSURLSession+QX.h @@ -0,0 +1,17 @@ +// +// NSURLSession+BJX.h +// BJXGame +// +// Created by apple on 2022/11/7. +// Copyright © 2022 鑫创. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSURLSession (QX) + +@end + +NS_ASSUME_NONNULL_END diff --git a/QXLive/Base/NSURLSession+QX.m b/QXLive/Base/NSURLSession+QX.m new file mode 100644 index 0000000..a105247 --- /dev/null +++ b/QXLive/Base/NSURLSession+QX.m @@ -0,0 +1,37 @@ +// +// NSURLSession+BJX.m +// BJXGame +// +// Created by apple on 2022/11/7. +// Copyright © 2022 鑫创. All rights reserved. +// + +#import "NSURLSession+QX.h" +#import + +@implementation NSURLSession (QX) ++ (void)load{ + Method method1 = class_getClassMethod([NSURLSession class],@selector(sessionWithConfiguration:)); + Method method2 = class_getClassMethod([NSURLSession class],@selector(px_sessionWithConfiguration:)); + method_exchangeImplementations(method1, method2); + + Method method3 =class_getClassMethod([NSURLSession class],@selector(sessionWithConfiguration:delegate:delegateQueue:)); + Method method4 =class_getClassMethod([NSURLSession class],@selector(px_sessionWithConfiguration:delegate:delegateQueue:)); + method_exchangeImplementations(method3, method4); +} + + + ++ (NSURLSession*)px_sessionWithConfiguration:(NSURLSessionConfiguration*)configuration delegate:(nullable id)delegate delegateQueue:(nullable NSOperationQueue*)queue{ + if(configuration) configuration.connectionProxyDictionary=@{}; + return [self px_sessionWithConfiguration:configuration delegate:delegate delegateQueue:queue]; +} + + + ++ (NSURLSession*)px_sessionWithConfiguration:(NSURLSessionConfiguration*)configuration{ + if(configuration) configuration.connectionProxyDictionary=@{}; + return [self px_sessionWithConfiguration:configuration]; +} + +@end diff --git a/QXLive/Base/QXGlobal.m b/QXLive/Base/QXGlobal.m index d81e1aa..9faf888 100644 --- a/QXLive/Base/QXGlobal.m +++ b/QXLive/Base/QXGlobal.m @@ -19,6 +19,7 @@ #import "QXRoomMessageManager.h" #import "QXTimer.h" #import +#import "QXManagerMqtt.h" @interface QXGlobal() @property (nonatomic,assign)BOOL isLogin; @@ -52,7 +53,9 @@ [self removeLocalData]; [self removeMemory]; AppDelegate *appdelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; + /// 移除推送监听 [TIMPushManager removePushListener:appdelegate]; + /// 移除会话监听 [[V2TIMManager sharedInstance] removeConversationListener:appdelegate]; [TIMPushManager unRegisterPush:^{ //success @@ -68,6 +71,8 @@ na.modalPresentationStyle = UIModalPresentationFullScreen; [self.getKeyWindow.rootViewController presentViewController:na animated:YES completion:nil]; self.isShowLoginVC = YES; + /// 断开mqtt连接 + [[QXManagerMqtt sharedInstance] disconnect]; } -(void)saveLoginData:(NSString *)userInfoJson{ @@ -114,7 +119,7 @@ [[NSUserDefaults standardUserDefaults] synchronize]; } -(void)removeMemory{ - self.loginModel = nil; + QXGlobal.shareGlobal.loginModel = nil; } -(void)showView:(UIView *)view popType:(PopViewType)popType tapDismiss:(BOOL)tapDismiss finishBlock:(showFinishBlock)finishBlock{ self.alertViewController = [[QXAlertViewController alloc] init]; diff --git a/QXLive/Base/WKWebView+QX.h b/QXLive/Base/WKWebView+QX.h new file mode 100644 index 0000000..89c5e35 --- /dev/null +++ b/QXLive/Base/WKWebView+QX.h @@ -0,0 +1,17 @@ +// +// WKWebView+QX.h +// YBLive +// +// Created by 启星 on 2025/4/16. +// Copyright © 2025 cat. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface WKWebView (QX) + +@end + +NS_ASSUME_NONNULL_END diff --git a/QXLive/Base/WKWebView+QX.m b/QXLive/Base/WKWebView+QX.m new file mode 100644 index 0000000..4843ebf --- /dev/null +++ b/QXLive/Base/WKWebView+QX.m @@ -0,0 +1,50 @@ +// +// WKWebView+QX.m +// YBLive +// +// Created by 启星 on 2025/4/16. +// Copyright © 2025 cat. All rights reserved. +// + +#import "WKWebView+QX.h" + +@implementation WKWebView (QX) ++ (void)load{ + Method method1 = class_getInstanceMethod([self class],@selector(loadRequest:)); + Method method2 = class_getInstanceMethod([self class],@selector(qx_loadRequest:)); + method_exchangeImplementations(method1, method2); + +} +-(void)qx_loadRequest:(NSURLRequest*)request{ + if ([self isProxyEnabled]) { + [self qx_loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https:www.baidu.com"]]]; + }else{ + [self qx_loadRequest:request]; + } +} + + + + +-(BOOL)isProxyEnabled{ + NSArray *criticalDomains = @[ + H5ServerUrl, + ServerUrl, + ]; + NSDictionary *proxySettings = (__bridge NSDictionary *)CFNetworkCopySystemProxySettings(); + for (NSString *domain in criticalDomains) { + NSArray *proxies = (__bridge NSArray *)CFNetworkCopyProxiesForURL( + (__bridge CFURLRef)[NSURL URLWithString:domain], + (__bridge CFDictionaryRef)proxySettings + ); + // 检查每个域名的代理情况... + for (NSDictionary *proxy in proxies) { + NSString *proxyType = proxy[(NSString *)kCFProxyTypeKey]; + if (![proxyType isEqualToString:(NSString *)kCFProxyTypeNone]) { + return YES; // 存在代理或 VPN + } + } + } + return NO; +} +@end diff --git a/QXLive/Config/QXManagerMqtt.m b/QXLive/Config/QXManagerMqtt.m index 214ec15..e1b94a1 100755 --- a/QXLive/Config/QXManagerMqtt.m +++ b/QXLive/Config/QXManagerMqtt.m @@ -201,8 +201,8 @@ QXLOG(@"断开连接 error = %@",[error description]); }]; [self.mySessionManager setDelegate:nil]; - self.mySessionManager = nil; [self.subedDict removeAllObjects]; + _mySessionManager = nil; } - (void)reConnect { if (self.mySessionManager && self.mySessionManager.port) { diff --git a/QXLive/HomePage(声播)/View/房间/QXAppstoreHomeView.m b/QXLive/HomePage(声播)/View/房间/QXAppstoreHomeView.m index 6e37293..a88d2a3 100644 --- a/QXLive/HomePage(声播)/View/房间/QXAppstoreHomeView.m +++ b/QXLive/HomePage(声播)/View/房间/QXAppstoreHomeView.m @@ -9,6 +9,7 @@ #import "QXHomeRoomCell.h" #import #import "QXBanner.h" +#import "QXTimer.h" #import "QXHomePageNetwork.h" @@ -24,6 +25,7 @@ @property (nonatomic,assign)NSInteger currentIndex; @property (nonatomic,strong)NSMutableArray *dataArray; @property (nonatomic,strong)NSMutableArray *topArray; +@property (nonatomic,strong)QXTimer *timer; @end @implementation QXAppstoreHomeView @@ -71,9 +73,9 @@ [self getTopRoomList]; [self getAllRoomList]; } --(void)startAnimate{ - [self performSelector:@selector(startOptimizedInfiniteFlip) afterDelay:3]; -} +//-(void)startAnimate{ +// [self performSelector:@selector(startOptimizedInfiniteFlip) afterDelay:3]; +//} //-(void)setDataArray:(NSArray *)dataArray{ // _dataArray = dataArray; @@ -104,7 +106,7 @@ weakSelf.roomModel = list.firstObject; weakSelf.rommView.roomModel = weakSelf.roomModel; [weakSelf.topArray addObjectsFromArray:list]; - [weakSelf startAnimate]; + [weakSelf startTimer]; } [self.scrollView.mj_header endRefreshing]; } failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) { @@ -126,6 +128,20 @@ [self.scrollView.mj_header endRefreshing]; }]; } +-(void)startTimer{ + MJWeakSelf + [self stopTimer]; + _timer = [QXTimer scheduledTimerWithTimeInterval:5 repeats:YES queue:dispatch_get_main_queue() block:^{ + QXLOG(@"动画3s执行"); + [weakSelf startOptimizedInfiniteFlip]; + }]; +// CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; +// scaleAnim.duration = 1.5/2; +// scaleAnim.autoreverses = YES; +// scaleAnim.fromValue = @1.0; +// scaleAnim.toValue = @1.1; +// [self.rommView.layer addAnimation:scaleAnim forKey:@"scaleAnimation"]; +} - (void)startOptimizedInfiniteFlip { self.currentIndex++; if (self.currentIndex > self.topArray.count-1) { @@ -149,18 +165,19 @@ // self.isFront = !self.isFront; // 添加延迟后继续动画 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self startOptimizedInfiniteFlip]; - }); +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// [self startOptimizedInfiniteFlip]; +// }); }]; // 添加辅助动画(轻微弹跳效果) - CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; - scaleAnim.duration = flipDuration/2; - scaleAnim.autoreverses = YES; - scaleAnim.fromValue = @1.0; - scaleAnim.toValue = @1.1; - [self.rommView.layer addAnimation:scaleAnim forKey:@"scaleAnimation"]; + +} +-(void)stopTimer{ + if (_timer) { + [_timer invalidate]; + _timer = nil; + } } #pragma mark - UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ diff --git a/QXLive/Network/QXRequest.m b/QXLive/Network/QXRequest.m index 8eabdcc..8b42ef3 100644 --- a/QXLive/Network/QXRequest.m +++ b/QXLive/Network/QXRequest.m @@ -261,6 +261,8 @@ static NSInteger HTTP_ERROR_CODE = 0; [manager.requestSerializer setValue:appVersion forHTTPHeaderField:@"App-Version"]; if ([QXGlobal shareGlobal].isLogin) { [manager.requestSerializer setValue:[QXGlobal shareGlobal].loginModel.token forHTTPHeaderField:@"token"]; + }else{ + [manager.requestSerializer setValue:@"" forHTTPHeaderField:@"token"]; } switch (type) { case GET: { diff --git a/QXLive/Other/AppDelegate+Login.m b/QXLive/Other/AppDelegate+Login.m index 6da024e..9460b7e 100644 --- a/QXLive/Other/AppDelegate+Login.m +++ b/QXLive/Other/AppDelegate+Login.m @@ -14,7 +14,8 @@ #import "QXLoginNetwork.h" #import "QXMineNetwork.h" #import "QXMessageServices.h" - +#import "QXManagerMqtt.h" +#import "OpenUDID.h" @implementation AppDelegate (Login) -(void)configThirdPartLogin{ @@ -67,6 +68,8 @@ [[QXLocationManager shareManager] startLoction]; [QXLocationManager shareManager].delegate = self; [self getUserInfo]; + NSString *clientId = [OpenUDID value]; + [[QXManagerMqtt sharedInstance] bindWithUserName:@"public" password:@"" cliendId:clientId isSSL:NO]; } -(void)onKickedOffline{ diff --git a/QXLive/Other/AppDelegate.m b/QXLive/Other/AppDelegate.m index 088803d..e513a73 100644 --- a/QXLive/Other/AppDelegate.m +++ b/QXLive/Other/AppDelegate.m @@ -14,8 +14,6 @@ #import #import #import -#import "QXManagerMqtt.h" -#import "OpenUDID.h" #if DEBUG #import #endif @@ -44,8 +42,6 @@ SDImageWebPCoder *webPCoder = [SDImageWebPCoder sharedCoder]; [[SDImageCodersManager sharedManager] addCoder:webPCoder]; [self configThirdPartLogin]; - NSString *clientId = [OpenUDID value]; - [[QXManagerMqtt sharedInstance] bindWithUserName:@"public" password:@"" cliendId:clientId isSSL:NO]; #if DEBUG [[LLDebugTool sharedTool] startWorking]; #endif diff --git a/QXLive/Other/Assets.xcassets/启动页.imageset/Contents.json b/QXLive/Other/Assets.xcassets/启动页.imageset/Contents.json new file mode 100644 index 0000000..111ee58 --- /dev/null +++ b/QXLive/Other/Assets.xcassets/启动页.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "启动页.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/QXLive/Other/Assets.xcassets/启动页.imageset/启动页.png b/QXLive/Other/Assets.xcassets/启动页.imageset/启动页.png new file mode 100644 index 0000000..8969d58 Binary files /dev/null and b/QXLive/Other/Assets.xcassets/启动页.imageset/启动页.png differ diff --git a/QXLive/Other/Base.lproj/LaunchScreen.storyboard b/QXLive/Other/Base.lproj/LaunchScreen.storyboard index 865e932..e764de5 100644 --- a/QXLive/Other/Base.lproj/LaunchScreen.storyboard +++ b/QXLive/Other/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,11 @@ - - + + + - + + + @@ -11,15 +14,32 @@ - + - + + + + + + + + + + + + - + + + + + + + diff --git a/QXLive/QXLiveDev.plist b/QXLive/QXLiveDev.plist index 5cd9c09..50c3c65 100644 --- a/QXLive/QXLiveDev.plist +++ b/QXLive/QXLiveDev.plist @@ -13,7 +13,7 @@ Editor CFBundleURLSchemes - qxlive + qxlivetest