强制iphone应用程序以编程方式重新启动

man*_*pro 44 iphone objective-c application-restart ios4

当我按下Logout按钮时,我试图让我的iPhone应用程序以编程方式重新启动.

有没有人有代码样本分享?我已经读过可以通过修改main.m文件但找不到与此相关的任何代码.

任何帮助,将不胜感激.

jha*_*ott 65

注意:

尽管这已被回答为"不可能",但我认为这对于新的iOS开发人员来说是一个有效的问题,他们可以做些什么,这可能是他们想要的.

有一种方法可以从用户的角度"重新启动"您的应用程序,这在技术上不会重新启动或退出iOS应用程序.正如其他答案所指出的,iOS应用程序永远不会明确退出,因为iOS上不允许这样做.

我的答案:

如果你希望你的应用程序回到启动时的状态,这不是100%可能的,但我会解释一种方法,以获得足够的所有有效目的的大部分方式.

首先要做的是重新创建根视图控制器.我建议从app委托中的方法执行此操作,如下所示:

- (void)resetAppToFirstController
{
    self.window.rootViewController = [[MyMainViewController alloc] initWithNibName:nil bundle:nil];
}
Run Code Online (Sandbox Code Playgroud)

在许多情况下,这已经足够了,但是您应该在此方法中重置您拥有的任何应用程序状态.例如,注销用户,重置任何非持久状态,并取消(释放)您可以使用的所有对象.此方法还可用于初始创建第一个视图控制器application:didFinishLaunchingWithOptions.

框架类和单身人士:

您将无法完全重置任何框架单例或每个应用程序实例的状态,例如:

[UIApplication sharedApplication];
[NSNotificationCenter defaultCenter];
[NSUserDefaults standardUserDefaults];
[UIScreen screens];
// etc...
Run Code Online (Sandbox Code Playgroud)

这可能很好,因为你不应该在这些中存储任何非持久状态(除了NSNotificationCenter,但是当释放对象时应该删除所有已注册的观察者).如果您确实要初始化或重置任何框架状态,可以使用相同的resetAppToFirstController方法执行此操作.无论如何,应该没有必要重新创建这些或window对象.

如果你有自己的单身,你可以通过将它们存储在一个单例持有者类(它本身就是一个真正的单例)中来重新创建它们.从概念上讲,这是一个简单的单例类,其中包含每个其他单例的属性和areset取消并释放它们的方法.您的其他单身人士应该使用此类(而不是静态或全局变量)来存储单例实例.如果您使用任何第三方库,请小心,因为他们也可能使用单例,您需要确保这些库也使用您的单件持有人,以便您可以根据需要重置它们.我认为这种技术无论如何都是很好的做法,因为在某些情况下(例如单元测试)你确实需要通常是单身的物体消失并重新初始化为原始状态.但是,您不希望将单例实现与单例持有者耦合,因此实现此目的的一种好方法是使用NSMutableDictionary作为关联对象的[UIApplication sharedApplication]将单例类名称作为键.但是,我有点偏离主题,因为这是一个超出这个问题范围的更先进的技术.


就用户而言,上述内容应足以"重置"您的应用程序.如果您想要作为第一个视图控制器,甚至可以再次显示启动画面.


sud*_*-rf 18

首先,虽然有可能强行杀死你的应用程序,Apple不允许这样做,但会被拒绝.即使它没有被拒绝,也无法在应用程序被杀后重新启动它.您只需要通过代码找到一些方法来重置您的应用程序,Jason Coco如上所述.这可能是更多的工作,但值得不被Apple拒绝.

  • 进一步上述评论过早被切断:"永远不要以编程方式退出iOS应用程序,因为人们倾向于将其解释为崩溃.但是,如果外部环境阻止您的应用程序按预期运行,您需要告诉用户有关情况并解释他们可以做些什么." 因此,不要意外退出您的用户,但如果这是用户启动的操作,并有解释,那么Apple没有问题.我们在4个已批准的应用中使用exit(0). (25认同)

rob*_*tti 15

试试这个,它对我有用.

-(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];
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我知道,我的想法是将应用程序设置为尽可能接近"初始"状态......如果您的应用程序基于导航控制器,这个技巧很有效,但这个想法很容易适用于其他的情况. (2认同)

Esq*_*uth 9

Objective-C的:

exit(0);
Run Code Online (Sandbox Code Playgroud)

迅速:

exit(0)
Run Code Online (Sandbox Code Playgroud)

我有2个实时应用程序,他们没有被拒绝.我的一个应用程序甚至将这行代码作为我的应用程序主页中的一项功能.它位于右上角,Twitter上有推文按钮.所以不要担心苹果拒绝,除非它看起来像意外的崩溃.

在此输入图像描述

  • 它没有重启,它是退出 (2认同)

小智 5

以下是使用私有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);
Run Code Online (Sandbox Code Playgroud)

这也适用于具有适当权利的越狱应用程序.

对于其他应用程序,可以使用简单的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);
Run Code Online (Sandbox Code Playgroud)

不幸的是,在这种情况下需要互联网连接.