强制iphone应用程序以编程方式重启
我试图让我的iPhone应用程序按下注销button时以编程方式重新启动。
有没有人有代码示例分享? 我读过,可以通过修改main.m文件,但找不到任何与此相关的代码。
任何帮助,将不胜感激。
首先,虽然有可能强行杀死你的应用程序,但这是苹果不允许的,将被拒绝。 即使它没有被拒绝,一旦它被杀死,也没有办法重新启动你的应用程序。 正如Jason Coco
所说,你只需要通过你的代码find一些重置你的应用的方法。 这可能是更多的工作,但它是值得的不被苹果拒绝。
注意:
虽然这被认为是“不可能的”,但我认为对于一个新的iOS开发人员来说这是一个有效的问题,而且他们可以做的事情也许是他们想要的。
有一种方法可以从用户的angular度“重新启动”您的应用程序,这在技术上不是重新启动或退出iOS应用程序。 正如其他答案指出的iOS应用程序不应该显式退出,因为这是不允许在iOS上。
我的答案:
如果你希望你的应用程序回到启动时的状态,这不是100%的可能,但我会解释一种方法来获得大部分有效的方式。
首先要做的是重新创build你的根视图控制器。 我build议从应用程序委托中的一个方法这样做:
- (void)resetAppToFirstController { self.window.rootViewController = [[MyMainViewController alloc] initWithNibName:nil bundle:nil]; }
在很多情况下,这样做已经足够了,但是您所拥有的任何应用程序状态也应该在此方法中重置。 例如,注销一个用户,重置任何非持久状态,然后使所有可以的对象无效(释放)。 此方法也可用于从application:didFinishLaunchingWithOptions
最初创build您的第一个视图控制器。
框架类和单身人士:
您将无法完全重置任何框架单例或每个应用程序实例的状态,例如:
[UIApplication sharedApplication]; [NSNotificationCenter defaultCenter]; [NSUserDefaults standardUserDefaults]; [UIScreen screens]; // etc...
这可能是好的,因为你不应该在这些存储任何非持久化状态( NSNotificationCenter
除外,但所有注册的观察员应该已经被删除,当对象被释放)。 如果你想初始化或重置任何框架状态,你可以在同一个resetAppToFirstController
方法中完成。 无论如何,应该不需要重新创build这些或window
对象。
如果你有任何你自己的单身人士,你可以通过将他们存储在一个单身持有人类(这本身就是一个真正的单身人士)中重新创build这些单身人士。 从概念上讲,这是一个简单的单例类,其中包含每个其他单例的属性,以及一个reset
方法来取消并释放它们。 你的其他单身人士应该使用这个类(而不是一个静态或全局variables)来存储单例实例。 如果您使用任何第三方库,请小心,因为它们也可能使用单身人士,您将需要确保这些也使用您的单身人士,以便您可以根据需要重置它们。 无论如何,我认为这个技巧是很好的做法,因为在某些情况下(比如unit testing),你需要通常是单例的对象消失并重新初始化为原始状态。 然而,你不希望将singleton实现与singleton持有者耦合,所以实现这一点的一个好方法是在[UIApplication sharedApplication]
上使用一个NSMutableDictionary
作为关联对象,并使用单例类名作为关键字。 不过,我会谈论这个话题,因为这是超出这个问题范围的更先进的技术。
就用户而言,以上应该足以“重置”您的应用程序。 如果你想作为你的第一个视图控制器,你甚至可以再次显示启animation面。
试试这个,它适用于我。
-(void)restart { MyAppDelegate *appDelegate = (MyAppDelegate *)([UIApplication sharedApplication].delegate); [appDelegate.navigationController popToRootViewControllerAnimated:NO]; UIViewController *topViewController = appDelegate.navigationController.topViewController; Class class = [topViewController class]; NSString *nibName = topViewController.nibName; UIViewController *rootViewcontroller = (UIViewController *)([[class alloc] initWithNibName:nibName bundle:nil]); [appDelegate.navigationController.view removeFromSuperview]; appDelegate.navigationController.viewControllers = [NSArray arrayWithObject:rootViewcontroller]; [appDelegate.window addSubview:appDelegate.navigationController.view]; [appDelegate.window makeKeyAndVisible]; }
Objective-C的:
exit(0);
迅速:
exit(0)
我有这2个实时应用程序,他们没有被拒绝。 我的一个应用程序甚至将这行代码作为我应用程序主页中的一个function。 它位于右上angular,推特button在Twitter上。 所以不要担心苹果拒绝,除非它看起来像一个意想不到的崩溃。
这里是你如何使用私人API在模拟器上做到这一点:
NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@", scheme, endpointString]]; Class pClass = NSClassFromString(@"BKSSystemService"); id service = [[pClass alloc] init]; SEL pSelector = NSSelectorFromString(@"openURL:application:options:clientPort:withResult:"); NSMethodSignature *signature = [service methodSignatureForSelector:pSelector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.target = service; NSString *app = @"com.apple.mobilesafari"; [invocation setSelector:pSelector]; [invocation setArgument:&URL atIndex:2]; [invocation setArgument:&app atIndex:3]; unsigned int i = [service performSelector:NSSelectorFromString(@"createClientPort")]; [invocation setArgument:&i atIndex:5]; [invocation invoke]; exit(0);
这也应该适用于具有适当权利的越狱应用程序。
对于其他应用程序,可以使用简单的html页面:
NSString *format = @"https://dl.dropboxusercontent.com/s/rawt1ov4nbqh4yd/launchApp.html?scheme=%@&URL=%@"; NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:format, scheme, endpointString]]; [[UIApplication sharedApplication] openURL:URL]; exit(0);
不幸的是,在这种情况下需要互联网连接。
我在-applicationWillResignActive期间退出:如果应用程序在开始屏幕上,苹果已经接受了多年。 对用户来说,它不会看起来像一个崩溃。 下次用户从图标启动应用程序。 如果今天启动,那么不退出应用程序的附加检查对于某些情况下的用户体验可能是有用的。
- (void)applicationWillResignActive:(UIApplication *)application { // called if phone-call comes in! if([gameController isGameFinished]) exit(0); }