Proper way to exit iPhone application?

前端 未结 25 2689
难免孤独
难免孤独 2020-11-22 01:54

I am programming an iPhone app, and I need to force it to exit due to certain user actions. After cleaning up memory the app allocated, what\'s the appropriate method to ca

相关标签:
25条回答
  • 2020-11-22 02:41

    We can not quit app using exit(0), abort() functions, as Apple strongly discourage the use of these functions. Though you can use this functions for development or testing purpose.

    If during development or testing it is necessary to terminate your application, the abort function, or assert macro is recommended

    Please find this Apple Q&A thread to get more information.

    As use of this function create impression like application is crashing. So i got some suggestion like we can display Alert with termination message to aware user about closing the app, due to unavailability of certain functionality.

    But iOS Human Interface Guideline for Starting And Stopping App, suggesting that Never use Quit or Close button to terminate Application. Rather then that they are suggesting to display proper message to explain situation.

    An iOS app never displays a Close or Quit option. People stop using an app when they switch to another app, return to the Home screen, or put their devices in sleep mode.

    Never quit an iOS app programmatically. People tend to interpret this as a crash. If something prevents your app from functioning as intended, you need to tell users about the situation and explain what they can do about it.

    0 讨论(0)
  • 2020-11-22 02:45

    After some tests, I can say the following:

    • using the private interface : [UIApplication sharedApplication] will cause the app looking like it crashed, BUT it will call - (void)applicationWillTerminate:(UIApplication *)application before doing so;
    • using exit(0); will also terminate the application, but it will look "normal" (the springboard's icons appears like expected, with the zoom out effect), BUT it won't call the - (void)applicationWillTerminate:(UIApplication *)application delegate method.

    My advice:

    1. Manually call the - (void)applicationWillTerminate:(UIApplication *)application on the delegate.
    2. Call exit(0);.
    0 讨论(0)
  • 2020-11-22 02:46

    exit(0) appears to a user as crashes, so show a confirmation message to user. After confirmation suspend(home button press programmatically) and wait 2 seconds while app is going background with animation then exit behind user's view

    -(IBAction)doExit
    {
        //show confirmation message to user
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation"
                                                     message:@"Do you want to exit?"
                                                    delegate:self
                                           cancelButtonTitle:@"Cancel"
                                           otherButtonTitles:@"OK", nil];
        [alert show];
    }
    
    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        if (buttonIndex != 0)  // 0 == the cancel button
        {
            //home button press programmatically
            UIApplication *app = [UIApplication sharedApplication];
            [app performSelector:@selector(suspend)];
    
            //wait 2 seconds while app is going background
            [NSThread sleepForTimeInterval:2.0];
    
            //exit app when app is in background
            exit(0);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 02:47
    - (IBAction)logOutButton:(id)sender
    {
       //show confirmation message to user
       CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want  to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
       alert.style = AlertStyleWhite;
       [alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
       [alert show];
    }
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
    
       if (buttonIndex != 0)  // 0 == the cancel button
       {
          //home button press programmatically
          UIApplication *app = [UIApplication sharedApplication];
          [app performSelector:@selector(suspend)];
          //wait 2 seconds while app is going background
          [NSThread sleepForTimeInterval:2.0];
          //exit app when app is in background
          NSLog(@"exit(0)");
          exit(0);
      }
    }
    
    0 讨论(0)
  • 2020-11-22 02:48

    Hm, you may 'have to' quit the application if, say, your application requires an internet connection. You could display an alert and then do something like this:

    if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
        [[UIApplication sharedApplication] performSelector:@selector(terminate)];
    } else {
        kill(getpid(), SIGINT); 
    }
    
    0 讨论(0)
  • 2020-11-22 02:48

    Exit an app other way

    I did this helper, though, that use no private stuff:

    Exit(0);

    0 讨论(0)
提交回复
热议问题