maneira correta de sair aplicativo para iPhone?

votos
253

Estou programando um aplicativo para iPhone, e eu preciso forçá-lo a sair devido a determinadas ações do usuário. Depois de limpar a memória do aplicativo alocado, o que é o método adequado para chamar para encerrar o aplicativo?

Publicado 10/12/2008 em 06:42
fonte usuário
Em outras línguas...                            


24 respostas

votos
261

No iPhone não existe o conceito de parar um aplicativo. A única ação que deve causar um aplicativo para parar está tocando o botão Home no telefone, e isso não é algo que os desenvolvedores têm acesso.

Segundo a Apple, o aplicativo não deve terminar por conta própria. Desde que o usuário não apertar o botão Início, qualquer retorno à tela inicial dá ao usuário a impressão de que seu aplicativo caiu. Isto é confuso comportamento, não-padrão e deve ser evitado.

Respondeu 10/12/2008 em 15:54
fonte usuário

votos
206

Já experimentou exit(0)?

Alternativamente, [[NSThread mainThread] exit], embora eu não tentei que ele parece ser a solução mais adequada.

Respondeu 10/12/2008 em 06:49
fonte usuário

votos
45

saída (0) aparece para um utilizador como falhas, por isso mostrar uma mensagem de confirmação ao utilizador. Após a confirmação de suspensão (pressione o botão casa programaticamente) e aguarde 2 segundos enquanto aplicativo vai fundo com animação em seguida, sair atrás de vista do usuário

-(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);
    }
}
Respondeu 23/07/2013 em 06:54
fonte usuário

votos
38

Não é realmente uma maneira de sair do programa, mas uma maneira de forçar as pessoas a parar de fumar.

UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert show];
Respondeu 04/08/2009 em 01:59
fonte usuário

votos
37

Vá para o seu info.plist e verifique o "aplicativo não é executado em segundo plano" chave. Desta vez, quando o usuário clica no botão home, a aplicação sai completamente.

Respondeu 01/06/2011 em 05:47
fonte usuário

votos
36

Verifique o Q & A aqui: https://developer.apple.com/library/content/qa/qa1561/_index.html

Q: Como faço para programaticamente parar meu aplicativo iOS?

Não há nenhuma API prevista graciosamente encerra um aplicativo iOS.

No iOS, o usuário pressiona o botão Início para fechar aplicações. Se seu aplicativo tem condições em que não podem fornecer sua função pretendida, a abordagem recomendada é para exibir um alerta para o usuário que indica a natureza do problema e as possíveis ações que o usuário pode tomar - ligar Wi-Fi, permitindo que serviços de localização, etc. permitir que o usuário encerrar o aplicativo a seu próprio critério.

ATENÇÃO: Não chame a exitfunção. Aplicações chamada exitaparecerão para o usuário ter deixado de funcionar, em vez de executar uma terminação graciosa e animação de volta para a tela inicial.

Além disso, os dados não podem ser salvos, porque -applicationWillTerminate:e semelhantes UIApplicationDelegatemétodos não será invocada se você chamar saída.

Se durante o desenvolvimento ou teste é necessário encerrar a sua aplicação, a abortfunção ou assertmacro é recomendado

Respondeu 05/06/2010 em 15:31
fonte usuário

votos
15

adicionar UIApplicationExitsOnSuspend propriedade no aplicativo-info.plist para true

Respondeu 07/07/2011 em 09:14
fonte usuário

votos
13

Depois de alguns testes, posso dizer o seguinte:

  • usando a interface privada: [UIApplication sharedApplication]fará com que o aplicativo olhando como ele caiu, mas ele vai chamar - (void)applicationWillTerminate:(UIApplication *)applicationantes de fazer isso;
  • utilizando exit(0);também vai encerrar o aplicativo, mas ele vai olhar "normal" (ícones do trampolim aparece como esperado, com o zoom out efeito), mas não vai chamar o - (void)applicationWillTerminate:(UIApplication *)applicationmétodo delegado.

Meu conselho:

  1. Manualmente chamar o - (void)applicationWillTerminate:(UIApplication *)applicationno delegado.
  2. Chame exit(0);.
Respondeu 17/05/2009 em 18:00
fonte usuário

votos
7

Seu ApplicationDelegate é notificado de parar intencional pelo usuário:

- (void)applicationWillResignActive:(UIApplication *)application {

Quando eu chegar esta notificação Eu só chamá

        exit(0);

Que faz todo o trabalho. E a melhor coisa é, é a intenção useres parar de fumar, que é por que isso não deve ser um problema chamando-o de lá.

No meu Audio-App foi necessário para sair do aplicativo depois pessoas foram sincronizar seu dispositivo enquanto a música ainda estava tocando. Assim que a sincronização está completa eu recebo uma notificação. Mas parar o aplicativo certo depois que realmente parecido com um acidente.

Então, ao invés eu definir um sinalizador para sair REALMENTE o aplicativo na próxima ação backgrounding. Que é bom para atualizar o aplicativo depois de uma sincronização.

Respondeu 12/08/2010 em 11:41
fonte usuário

votos
6

A Apple diz:

"Aviso: Não chame a função de saída Applications chamando saída aparecerá para o usuário ter deixado de funcionar, em vez de executar uma terminação graciosa e animação de volta para a tela inicial.".

Penso que esta é uma má suposição. Se o usuário tocar em um botão sair e aparece uma mensagem que diz algo como: "A aplicação agora vai sair", não parecem estar caiu. Apple deve fornecer uma forma válida para sair de uma aplicação (não sair (0)).

Respondeu 23/05/2013 em 13:01
fonte usuário

votos
6

My App foi rejeitada recentemente bc eu usei um método não documentado. Literalmente:

"Infelizmente ele não pode ser adicionado à App Store porque ele está usando uma API privada uso de APIs não-públicas, que conforme descrito no iPhone Developer Program seção Contrato de Licença 3.3.1 é proibida.:

"3.3.1 As candidaturas só podem usar APIs documentadas na forma prescrita pela Apple e não devem utilizar ou ligar para qualquer APIs privadas."

A API não-pública que está incluído na sua aplicação é terminateWithSuccess"

Respondeu 02/12/2009 em 18:44
fonte usuário

votos
4

Este tem obtido uma boa resposta, mas decidiu expandir um pouco:

Você não pode obter o seu pedido aceite a AppStore sem ler Human Interface Guidelines da Apple iOS também. (eles mantêm o direito de rejeitá-lo para fazer qualquer coisa contra eles) A seção "Do not Quit programaticamente" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices. html é uma orientação exata em como você deve tratar neste caso.

Se você tiver um problema com plataforma Apple você não pode facilmente encontrar uma solução para, consulte HIG. É possível a Apple simplesmente não quero que você faça isso e eles normalmente (não estou a Apple para que eu possa não garante sempre) me dizê-lo em sua documentação.

Respondeu 03/02/2011 em 16:23
fonte usuário

votos
3

Não podemos deixar de aplicativo usando exit(0), abort()funções, como a Apple fortemente desencorajar o uso dessas funções. Embora você pode usar esta função para o desenvolvimento ou o propósito de testes.

Se durante o desenvolvimento ou teste é necessário encerrar a sua aplicação, a função abort, ou afirmar macro é recomendado

Por favor, encontrar este a Apple Q & A thread para obter mais informações.

Como o uso desta função criar a impressão como a aplicação está falhando. Então, eu tenho alguma sugestão como se pode exibir alerta com a mensagem de término para o usuário ciente sobre fechar o aplicativo, devido à indisponibilidade de determinadas funcionalidades.

Mas interface iOS Humano Orientação para iniciar e parar App , sugerindo que Nunca use Sair ou Fechar botão de cessar a aplicação. Em vez de que eles estão sugerindo para exibir mensagem adequada para explicar situação.

Um aplicativo iOS não exibe uma opção Fechar ou Sair. As pessoas parar de usar um aplicativo quando alternar para outro aplicativo, retornar à tela inicial, ou colocar seus dispositivos no modo de suspensão.

Nunca desistir de um aplicativo iOS programaticamente. As pessoas tendem a interpretar isso como um acidente. Se algo impede que o aplicativo de funcionar como pretendido, é necessário informar aos usuários sobre a situação e explicar o que eles podem fazer sobre ele.

Respondeu 28/04/2016 em 13:21
fonte usuário

votos
2

Eu usei o [[NSMutableArray nova addObject]: nil] abordagem mencionada acima para forçar a saída (falhar) o aplicativo sem fazer uma saída diga-conto (0) chamada de função.

Por quê? Porque meu aplicativo usa pinagem certificado em todas as API da rede chama para impedir ataques man-in-the-middle. Estes incluem a inicialização chama meu aplicativo financeira faz na inicialização.

Se a autenticação do certificado falhar, todas as minhas chamadas de inicialização erro fora e deixar meu aplicativo em um estado indeterminado. Permitindo que o usuário ir para casa e, em seguida, de volta para o aplicativo não ajuda, como a menos que o aplicativo foi purgado pelo sistema operacional ainda é inicializado e não confiável.

Assim, neste um caso, consideramos que é melhor para estourar um alerta informando ao usuário que o aplicativo está operando em um ambiente inseguro e, em seguida, quando batem "Close", forçar o encerramento do aplicativo usando o método acima mencionado.

Respondeu 24/11/2015 em 23:44
fonte usuário

votos
2
- (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);
  }
}
Respondeu 17/09/2013 em 12:56
fonte usuário

votos
2

Hm, você pode 'tem que' sair do aplicativo se, digamos, a sua aplicação requer uma conexão com a internet. Você pode exibir um alerta e, em seguida, fazer algo como isto:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
Respondeu 11/12/2008 em 02:55
fonte usuário

votos
2

Além do acima, bom, resposta que eu só queria acrescentar, pense sobre a limpeza de sua memória.

Depois que seus sai do aplicativo, o iPhone OS será automaticamente limpar qualquer coisa que seu aplicativo deixado para trás, de modo liberando toda a memória manualmente pode apenas aumentar a quantidade de tempo que leva o seu pedido para sair.

Respondeu 10/12/2008 em 15:04
fonte usuário

votos
1

Sair de um aplicativo outra maneira do que o botão home é realmente não iOS-esque abordagem.

Eu fiz isso ajudante, porém, que não usam coisas particulares:

void crash()
{ [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }

Mas ainda assim não significou para a produção no meu caso. É para testar reportagens acidente, ou reinício rápido após um reset Core Data. Apenas fez segura para não ser rejeitado se a função deixado no código de produção.

Respondeu 27/01/2014 em 15:57
fonte usuário

votos
0

Você não deve chamar diretamente a função de exit(0)como ele vai sair da aplicação imediatamente e será parecido com o seu aplicativo é deixado de funcionar. Então é melhor para mostrar aos usuários um alerta de confirmação e deixá-los fazer isso eles mesmos.

Swift 4.2

func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
    let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(true)
    }))
    alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(false)
    }))
    self.present(alert, animated: true, completion: nil)
}

/// Will quit the application with animation
func quit() {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    /// Sleep for a while to let the app goes in background
    sleep(2)
    exit(0)
}

Uso:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}
Respondeu 18/06/2019 em 13:07
fonte usuário

votos
0

Swift 4.2 (ou mais)

Biblioteca chamada Darvinpode ser usado.

import Darwin

exit(0) // Here you go

NB: Esta não é recomanded em aplicações iOS.

Fazendo isso você vai chegar log acidente.

Respondeu 28/02/2019 em 09:51
fonte usuário

votos
0

Pode ser apropriado para sair de um aplicativo se ele é um aplicativo de longa vida, que também executa em segundo plano, por exemplo, para obter atualizações de localização (usando a localização atualizações capacidade de fundo para isso).

Por exemplo, digamos que o usuário fizer fora do seu aplicativo baseados em localização, e empurra o aplicativo para o fundo usando o botão home. Neste caso, seu aplicativo pode continuar correndo, mas poderia fazer sentido para sair completamente. Seria bom para o usuário (memória lançamentos e outros recursos que não precisam de ser usado), e bom para a estabilidade aplicativo (ou seja, certificando-se de que o aplicativo é periodicamente reiniciado quando possível é uma rede de segurança contra vazamentos de memória e outros de pouca memória problemas).

Isso poderia (embora provavelmente não deveria, veja abaixo :-) ser alcançado com algo como:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
        exit(0);
    } else {
       // normal handling.
    }
}

Desde o aplicativo, então, sair para fora do fundo ele não vai olhar errado para o usuário, e não se assemelham a um acidente, proporcionando a interface do usuário é restaurado na próxima vez que executar o aplicativo. Em outras palavras, para o usuário não ficaria diferente a uma cessação sistema iniciado do aplicativo quando o aplicativo está em segundo plano.

Ainda assim, seria preferível usar uma abordagem mais padrão para que o sistema sabe que o aplicativo pode ser encerrado. Por exemplo, neste caso, por ter certeza que o GPS não estiver em uso, parando solicitando atualizações de localização, incluindo desligar show de localização atual em um ver o mapa se estiver presente. Dessa forma, o sistema vai cuidar de que encerra o aplicativo de alguns minutos (ou seja [[UIApplication sharedApplication] backgroundTimeRemaining]) após o aplicativo entra no fundo. Isso iria receber todos os mesmos benefícios sem ter que usar o código para terminar a aplicação.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
       // stop requesting location updates if not already done so
       // tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
    } else {
       // normal handling.
    }
}

E, claro, usando exit(0)nunca seria apropriado para o aplicativo produção média que é executado em primeiro plano, como por outras respostas que fazem referência http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

Respondeu 12/10/2015 em 16:55
fonte usuário

votos
0

Sair de um aplicativo outra maneira

Eu fiz isso ajudante, porém, que não usam coisas particulares:

Exit (0);

Respondeu 07/02/2014 em 14:11
fonte usuário

votos
0

O usuário deve decidir quando um aplicativo sai. Eu não acho que é uma boa interação com o usuário quando um aplicativo é encerrado. Portanto, não há agradável API para ele, apenas o botão home tem um.

Se há um erro: Implementar-lo melhor ou notificar o usuário. Se tem de haver um reinício: Implementar melhor de notificação do usuário.

Parece bobo, mas é má prática para sair do aplicativo sem deixar o usuário decidir e não notificando-o. E uma vez que existe um botão de casa para a interação do usuário, estados da Apple, não deve haver 2 coisas para a mesma função (sair de um app).

Respondeu 30/09/2013 em 10:53
fonte usuário

votos
-1
[[UIApplication sharedApplication] terminateWithSuccess];

Funcionou muito bem e chama automaticamente

- (void)applicationWillTerminateUIApplication *)application delegate.

para remover aviso tempo de compilação adicionar este código

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 
Respondeu 05/11/2009 em 16:01
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more