From 890a6b7c91e832d2c5a6eb548131b96290ae3404 Mon Sep 17 00:00:00 2001 From: Huge_Black Date: Sun, 15 Dec 2024 00:49:08 +0800 Subject: [PATCH] fix #15 #16 --- LiveContainerSwiftUI/LCSettingsView.swift | 2 +- LiveContainerSwiftUI/LCUtils.h | 2 +- LiveContainerSwiftUI/LCUtils.m | 29 ++++++++++++++++------- TweakLoader/UIKit+GuestHooks.m | 27 +++++++++++++++------ 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/LiveContainerSwiftUI/LCSettingsView.swift b/LiveContainerSwiftUI/LCSettingsView.swift index feae2d8..17adb08 100644 --- a/LiveContainerSwiftUI/LCSettingsView.swift +++ b/LiveContainerSwiftUI/LCSettingsView.swift @@ -402,7 +402,7 @@ struct LCSettingsView: View { return; } isJITLessTestInProgress = true - LCUtils.validateJITLessSetup { success, error in + LCUtils.validateJITLessSetup(with: defaultSigner) { success, error in if success { successInfo = "lc.jitlessSetup.success".loc successShow = true diff --git a/LiveContainerSwiftUI/LCUtils.h b/LiveContainerSwiftUI/LCUtils.h index 392c956..6301f99 100644 --- a/LiveContainerSwiftUI/LCUtils.h +++ b/LiveContainerSwiftUI/LCUtils.h @@ -27,7 +27,7 @@ void LCPatchAltStore(const char *path, struct mach_header_64 *header); @interface LCUtils : NSObject -+ (void)validateJITLessSetupWithCompletionHandler:(void (^)(BOOL success, NSError *error))completionHandler; ++ (void)validateJITLessSetupWithSigner:(Signer)signer completionHandler:(void (^)(BOOL success, NSError *error))completionHandler; + (NSURL *)archiveIPAWithBundleName:(NSString*)newBundleName error:(NSError **)error; + (NSURL *)archiveTweakedAltStoreWithError:(NSError **)error; + (NSData *)certificateData; diff --git a/LiveContainerSwiftUI/LCUtils.m b/LiveContainerSwiftUI/LCUtils.m index b658522..a835150 100644 --- a/LiveContainerSwiftUI/LCUtils.m +++ b/LiveContainerSwiftUI/LCUtils.m @@ -98,7 +98,7 @@ + (void)loadStoreFrameworksWithError:(NSError **)error { NSArray *signerFrameworks; - if([self store] == AltStore) { + if([NSFileManager.defaultManager fileExistsAtPath:[self.storeBundlePath URLByAppendingPathComponent:@"Frameworks/KeychainAccess.framework"].path]) { // AltStore requires 1 more framework than sidestore signerFrameworks = @[@"OpenSSL.framework", @"Roxas.framework", @"KeychainAccess.framework", @"AltStoreCore.framework"]; } else { @@ -326,10 +326,10 @@ + (void)writeStoreIDToSetupExecutableWithError:(NSError **)error { [data writeToURL:execPath options:0 error:error]; } -+ (void)validateJITLessSetupWithCompletionHandler:(void (^)(BOOL success, NSError *error))completionHandler { ++ (void)validateJITLessSetupWithSigner:(Signer)signer completionHandler:(void (^)(BOOL success, NSError *error))completionHandler { // Verify that the certificate is usable // Create a test app bundle - NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"CertificateValidation"]; + NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"CertificateValidation.app"]; [NSFileManager.defaultManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil]; NSString *tmpExecPath = [path stringByAppendingPathComponent:@"LiveContainer.tmp"]; NSString *tmpLibPath = [path stringByAppendingPathComponent:@"TestJITLess.dylib"]; @@ -341,12 +341,23 @@ + (void)validateJITLessSetupWithCompletionHandler:(void (^)(BOOL success, NSErro [info writeToFile:tmpInfoPath atomically:YES]; // Sign the test app bundle - [LCUtils signAppBundle:[NSURL fileURLWithPath:path] - completionHandler:^(BOOL success, NSDate* expirationDate, NSError *_Nullable error) { - dispatch_async(dispatch_get_main_queue(), ^{ - completionHandler(success, error); - }); - }]; + if(signer == AltSign) { + [LCUtils signAppBundle:[NSURL fileURLWithPath:path] + completionHandler:^(BOOL success, NSDate* expirationDate, NSError *_Nullable error) { + dispatch_async(dispatch_get_main_queue(), ^{ + completionHandler(success, error); + }); + }]; + } else { + [LCUtils signAppBundleWithZSign:[NSURL fileURLWithPath:path] + completionHandler:^(BOOL success, NSDate* expirationDate, NSError *_Nullable error) { + dispatch_async(dispatch_get_main_queue(), ^{ + completionHandler(success, error); + }); + }]; + } + + } + (NSURL *)archiveIPAWithBundleName:(NSString*)newBundleName error:(NSError **)error { diff --git a/TweakLoader/UIKit+GuestHooks.m b/TweakLoader/UIKit+GuestHooks.m index 7637be8..a69906d 100644 --- a/TweakLoader/UIKit+GuestHooks.m +++ b/TweakLoader/UIKit+GuestHooks.m @@ -26,6 +26,7 @@ static void UIKitGuestHooksInit() { break; } if(orientationLock != UIInterfaceOrientationUnknown) { + swizzle(UIApplication.class, @selector(_handleDelegateCallbacksWithOptions:isSuspended:restoreState:), @selector(hook__handleDelegateCallbacksWithOptions:isSuspended:restoreState:)); swizzle(FBSSceneParameters.class, @selector(initWithXPCDictionary:), @selector(hook_initWithXPCDictionary:)); swizzle(UIViewController.class, @selector(__supportedInterfaceOrientations), @selector(hook___supportedInterfaceOrientations)); swizzle(UIViewController.class, @selector(shouldAutorotateToInterfaceOrientation:), @selector(hook_shouldAutorotateToInterfaceOrientation:)); @@ -305,15 +306,22 @@ - (void)hook__connectUISceneFromFBSScene:(id)scene transitionContext:(UIApplicat context.payload = nil; context.actions = nil; [self hook__connectUISceneFromFBSScene:scene transitionContext:context]; - if(orientationLock != UIInterfaceOrientationUnknown) { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +} + +-(BOOL)hook__handleDelegateCallbacksWithOptions:(id)arg1 isSuspended:(BOOL)arg2 restoreState:(BOOL)arg3 { + BOOL ans = [self hook__handleDelegateCallbacksWithOptions:arg1 isSuspended:arg2 restoreState:arg3]; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ +// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [[LSApplicationWorkspace defaultWorkspace] openApplicationWithBundleID:@"com.apple.springboard"]; - }); - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[LSApplicationWorkspace defaultWorkspace] openApplicationWithBundleID:NSUserDefaults.lcMainBundle.bundleIdentifier]; }); - } + + }); + + + return ans; } @end @@ -395,7 +403,12 @@ - (instancetype)hook_initWithXPCDictionary:(NSDictionary*)dict { @implementation UIViewController(LiveContainerHook) - (UIInterfaceOrientationMask)hook___supportedInterfaceOrientations { - return (UIInterfaceOrientationMask)(1 << orientationLock); + if(orientationLock == UIInterfaceOrientationLandscapeRight) { + return UIInterfaceOrientationMaskLandscape; + } else { + return UIInterfaceOrientationMaskPortrait; + } + } - (BOOL)hook_shouldAutorotateToInterfaceOrientation:(NSInteger)orientation {