문제

iPhone 앱을 프로그래밍하고 있으며 특정 사용자 작업으로 인해 종료하도록 강요해야합니다. 메모리를 정리 한 후 앱이 할당 된 앱이 할당 된 경우 응용 프로그램을 종료하기 위해 호출하는 적절한 방법은 무엇입니까?

도움이 되었습니까?

해결책

당신은 시도 했습니까? exit(0)?

대안 적으로, [[NSThread mainThread] exit], 나는 그것이 더 적절한 솔루션처럼 보인다는 것을 시도하지는 않았지만.

다른 팁

iPhone에는 앱을 종료하는 개념이 없습니다. 앱이 종료 될 수있는 유일한 조치는 전화기의 홈 버튼을 터치하는 것입니다. 이는 개발자가 액세스 할 수있는 것이 아닙니다.

애플에 따르면, 앱은 자체적으로 종료되어서는 안됩니다. 사용자가 홈 버튼을 누르지 않았으므로 홈 화면으로의 복귀는 사용자에게 앱이 충돌 한 인상을줍니다. 이것은 혼란스럽고 비표준 행동이며 피해야합니다.

종료 (0)는 사용자에게 충돌로 나타나므로 사용자에게 확인 메시지를 표시하십시오. 확인 후 (홈 버튼을 프로그래밍 방식으로 누르면) 애니메이션으로 배경이 진행되는 동안 2 초를 기다린 다음 사용자보기 뒤에서 종료합니다.

-(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);
    }
}

그것은 실제로 프로그램을 그만 둘 수있는 방법이 아니라 사람들이 그만 두도록 강요하는 방법입니다.

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];

여기에서 Q & A를 확인하십시오. https://developer.apple.com/library/content/qa/qa1561/_index.html

Q : iOS 응용 프로그램을 프로그래밍 방식으로 종료하려면 어떻게해야합니까?

iOS 응용 프로그램을 우아하게 종료 할 수있는 API는 없습니다.

iOS에서 사용자는 홈 버튼을 눌러 응용 프로그램을 닫습니다. 응용 프로그램이 의도 된 기능을 제공 할 수없는 조건이있는 경우 권장되는 접근 방식은 사용자가 취할 수있는 문제와 가능한 조치 (WiFi 켜기, 위치 서비스 활성화 등)를 나타내는 사용자에게 경고를 표시하는 것입니다. 사용자가 자신의 재량에 따라 응용 프로그램을 종료하도록 허용합니다.

경고: 전화하지 마십시오 exit 기능. 응용 프로그램 호출 exit 우아한 종료를 수행하고 홈 화면으로 다시 애니메이션을하지 않고 사용자에게 추락 한 것으로 보입니다.

또한 데이터는 저장되지 않을 수 있습니다 -applicationWillTerminate: 그리고 비슷합니다 UIApplicationDelegate 출구에 전화하면 메소드가 호출되지 않습니다.

개발 또는 테스트 중에 응용 프로그램을 종료 해야하는 경우 abort 기능, 또는 assert 매크로가 권장됩니다

정보로 이동하여 "응용 프로그램이 백그라운드에서 실행되지 않는"키를 확인하십시오. 이번에는 사용자가 홈 버튼을 클릭하면 응용 프로그램이 완전히 종료됩니다.

추가하다 UIApplicationExitsOnSuspend 재산 application-info.plist 에게 true.

일부 테스트 후 다음을 말할 수 있습니다.

  • 개인 인터페이스 사용 : [UIApplication sharedApplication] 앱이 충돌 한 것처럼 보이지만 호출합니다. - (void)applicationWillTerminate:(UIApplication *)application 그렇게하기 전에;
  • 사용 exit(0); 또한 응용 프로그램이 종료되지만 "정상"으로 보일 것입니다 (스프링 보드의 아이콘은 예상처럼 보이며 확대 된 효과가 나타납니다). - (void)applicationWillTerminate:(UIApplication *)application 대표 방법.

나의 충고:

  1. 수동으로 전화하십시오 - (void)applicationWillTerminate:(UIApplication *)application 대의원에서.
  2. 부르다 exit(0);.

귀하의 ApplicationDelegate는 사용자의 의도적 종료에 대한 알림을받습니다.

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

이 알림을 받으면 그냥 전화합니다

        exit(0);

모든 작업을 수행합니다. 그리고 가장 좋은 점은 사용자가 그만두려는 의도이기 때문에 이것이 그것을 부르는 데 문제가되지 않아야한다는 것입니다.

내 오디오 앱에서는 음악이 여전히 재생되는 동안 사람들이 장치를 동기화 한 후 앱을 종료해야했습니다. 동기화가 완료 되 자마자 알림을받습니다. 그러나 그 직후 앱을 그만두면 실제로 충돌처럼 보일 것입니다.

대신 다음 배경 작업에서 앱을 실제로 종료하기 위해 깃발을 설정했습니다. 동기화 후 앱을 새로 고치는 것은 괜찮습니다.

내 앱은 최근 BC에서 거부되었습니다. 문서화되지 않은 방법을 사용했습니다. 문자 그대로:

"불행히도 개인 API를 사용하고 있기 때문에 App Store에 추가 할 수 없습니다. iPhone 개발자 프로그램 라이센스 계약 섹션 3.3.1에 요약 된 비공개 API를 사용합니다.

"3.3.1 응용 프로그램은 Apple이 규정 한 방식으로 문서화 된 API 만 사용할 수 있으며 개인 API를 사용하거나 전화해서는 안됩니다."

애플리케이션에 포함 된 비 공개 API는 청소과 함께 종료됩니다. "

애플은 말한다 :

"경고 : 출구 기능을 호출하지 마십시오. 출구 호출 응용 프로그램은 우아한 종료를 수행하고 홈 화면으로 다시 애니메이션을하지 않고 사용자에게 추락 한 것으로 나타납니다."

나는 이것이 나쁜 가정이라고 생각합니다. 사용자가 종금 버튼을 누르고 "응용 프로그램이 종료 될 것"이라고 말하는 메시지가 나타나면 추락되지 않은 것으로 보입니다. Apple은 응용 프로그램을 종료하는 유효한 방법을 제공해야합니다 (종료되지 않음 (0)).

이것은 좋은 답변을 얻었지만 약간 확장하기로 결정했습니다.

Apple의 iOS 인간 인터페이스 지침을 잘 읽지 않으면 응용 프로그램을 AppStore에 수락 할 수 없습니다. (그들은 당신을 거부 할 권리를 유지합니다. 아무것 그들에 대해) 섹션은 "프로그래밍 방식으로 그만 두지 마라" http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/uebestpractices/uebestpractices.html이 경우 치료 방법에 대한 정확한 지침입니다.

Apple 플랫폼에 문제가있는 경우 쉽게 솔루션을 찾을 수 없습니다. HIG에 문의하십시오. 애플은 단순히 당신이 그것을 원하지 않는 것일 수 있습니다. 그들은 보통 (나는 애플이 아니기 때문에 항상 보장 할 수는 없습니다) 문서에서 그렇게 말할 수 있습니다.

우리는 앱을 사용하지 않아도됩니다 exit(0), abort() Apple이 이러한 기능의 사용을 강력하게 방해함에 따라 기능. 이 기능을 개발 또는 테스트 목적으로 사용할 수는 있지만.

개발 또는 테스트 중에 응용 프로그램을 종료하거나 중단 기능을 종료하거나 매크로가 권장됩니다.

이 사과를 찾으십시오 Q & A 더 많은 정보를 얻기 위해 스레드.

이 기능을 사용함에 따라 응용 프로그램이 충돌하는 것처럼 인상을 만듭니다. 따라서 특정 기능을 사용할 수 없기 때문에 사용자가 앱을 닫는 것에 대해 사용자를 알기 위해 종료 메시지와 함께 경고를 표시 할 수있는 제안을 받았습니다.

그러나 iOS 인간 인터페이스 가이드 라인 앱 시작 및 중지, 그것을 제안합니다 종료 또는 닫기 버튼을 사용하지 마십시오 응용 프로그램을 종료합니다. 오히려 그들은 상황을 설명하기 위해 적절한 메시지를 표시 할 것을 제안합니다.

iOS 앱은 닫기 또는 종료 옵션을 표시하지 않습니다. 사람들은 다른 앱으로 전환하거나 홈 화면으로 돌아 오거나 장치를 절전 모드에 넣을 때 앱 사용을 중단합니다.

프로그래밍 방식으로 iOS 앱을 그만 두지 마십시오. 사람들은 이것을 충돌로 해석하는 경향이 있습니다. 무언가가 의도 한대로 앱 기능을 방해하지 않으면 사용자에게 상황에 대해 알리고 그들이 할 수있는 일을 설명해야합니다.

위의 것 외에도, 좋은, 답변을 추가하고 싶었습니다. 기억을 청소하는 것에 대해 생각하십시오.

응용 프로그램이 종료되면 iPhone OS는 응용 프로그램이 남은 내용을 자동으로 정리하므로 모든 메모리를 수동으로 자유롭게하면 응용 프로그램이 종료되는 데 걸리는 시간이 증가 할 수 있습니다.

HM, 응용 프로그램에 인터넷 연결이 필요한 경우 응용 프로그램을 종료해야 할 수도 있습니다. 경고를 표시 한 다음 다음과 같은 작업을 수행 할 수 있습니다.

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
- (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);
  }
}

나는 위에서 언급 한 [[nsmutablearray new] addobject : nil] 접근법을 사용하여 앱을 강제로 찍어 (0) 함수 호출을하지 않고 앱을 강제로 찍었습니다 (충돌).

왜요? 내 앱은 모든 네트워크 API 호출에 고정 된 인증서를 사용하여 중간에 사람의 공격을 방지합니다. 여기에는 내 재무 앱이 스타트 업에 대한 초기화가 포함됩니다.

인증서 인증이 실패하면 모든 초기화가 오류를 호출하고 앱을 불확실한 상태로 남겨 둡니다. 앱이 OS에 의해 정화되지 않는 한 여전히 초기화되지 않고 신뢰할 수 없기 때문에 사용자가 집으로 돌아간 다음 앱으로 돌아 오는 것은 도움이되지 않습니다.

따라서이 경우, 우리는 사용자에게 앱이 불안한 환경에서 작동한다는 사실을 알리는 경고를 팝업 한 다음 "Close"에 부딪히면 앞서 언급 한 방법을 사용하여 앱을 종료하는 것이 가장 좋습니다.

[[UIApplication sharedApplication] terminateWithSuccess];

잘 작동하고 자동으로 전화를 걸었습니다

- (void)applicationWillTerminateUIApplication *)application delegate.

컴파일 시간을 제거하려면 경고이 코드를 추가하십시오

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 

사용자는 앱이 종료시기를 결정해야합니다. 앱이 끊을 때 좋은 사용자 상호 작용이라고 생각하지 않습니다. 따라서 멋진 API가 없으며 홈 버튼 만 있습니다.

오류가있는 경우 : 더 잘 구현하거나 사용자에게 알립니다. 다시 시작 해야하는 경우 : 사용자에게 알리는 것이 더 잘 구현됩니다.

멍청하게 들리지만 사용자가 결정하고 알리지 않고 앱을 종료하는 것은 나쁜 관행입니다. Apple은 사용자 상호 작용을위한 홈 버튼이 있으므로 동일한 기능 (앱 종료)에 대해 2 가지가 없어야합니다.

홈 버튼이 아닌 다른 방법으로 앱을 종료합니다. 정말 비오스 스키 접근하다.

그러나 나는 개인적인 것들을 사용하지 않는이 도우미를했다.

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

그러나 여전히 제 경우에는 생산을위한 것이 아닙니다. 충돌보고를 테스트하거나 핵심 데이터 재설정 후 빠르게 다시 시작하는 것입니다. 프로덕션 코드에 함수가 남은 경우 거부되지 않도록 안전하게 만들었습니다.

Swift 4.2 (이상)

도서관이 호출되었습니다 Darvin 사용할 수 있습니다.

import Darwin

exit(0) // Here you go

NB : 이것은 iOS 응용 프로그램에서는 권장되지 않습니다.

이렇게하면 충돌 로그를 얻을 수 있습니다.

기능을 직접 호출해서는 안됩니다 exit(0) 응용 프로그램이 즉시 종료되면 앱이 충돌하는 것처럼 보입니다. 따라서 사용자에게 확인 경고를 보여주고 스스로 수행하도록하는 것이 좋습니다.

스위프트 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)
}

용법:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}

다른 방법으로 앱을 종료하십시오

그러나 나는 개인적인 것들을 사용하지 않는이 도우미를했다.

출구 (0);

배경에서 실행되는 오랜 살아있는 앱인 경우 (예 : 위치 업데이트를 사용하는) 앱을 종료하는 것이 적절할 수 있습니다. 위치 업데이트 이를위한 배경 기능).

예를 들어, 사용자가 위치 기반 앱에서 로그 아웃하고 홈 버튼을 사용하여 앱을 배경으로 푸시한다고 가정 해 보겠습니다. 이 경우 앱이 계속 실행될 수 있지만 완전히 종료하는 것이 합리적 일 수 있습니다. 사용자에게 유용 할 것입니다 (사용하지 않아도되는 메모리 및 기타 리소스를 출시 함), 앱 안정성에 적합합니다 (즉, 가능한 경우 앱이 주기적으로 다시 시작되도록 메모리 누출 및 기타 낮은 메모리에 대한 안전망이 있습니다. 문제).

이것은 (아마도 아래를 참조해서는 안되지만 :-) 다음과 같은 것을 달성 할 수 있습니다.

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

앱이 종료되기 때문에 배경에서 사용자에게 잘못 보이지 않으며 충돌과 비슷하지 않으므로 다음에 앱을 실행할 때 사용자 인터페이스를 제공합니다. 다시 말해, 사용자에게는 앱이 백그라운드에있을 때 앱이 종료 된 시스템과 다르지 않을 것입니다.

그럼에도 불구하고, 더 표준적인 접근 방식을 사용하여 시스템에 앱을 종료 할 수 있음을 알리는 것이 바람직합니다. 예를 들어,이 경우, 위치 업데이트를 중지하여 GPS가 사용되지 않도록하여 위치 업데이트를 끄는 것을 포함하여 위치 업데이트를 끄는 것을 포함하여 위치 업데이트를 끄는 것을 포함하여 GPS가 사용되지 않도록함으로써 존재합니다. 그렇게하면 시스템이 앱을 몇 분만 종료해야합니다 (즉 [[UIApplication sharedApplication] backgroundTimeRemaining]) 앱이 배경으로 들어간 후. 이것은 앱을 종료하기 위해 코드를 사용하지 않고도 동일한 이점을 얻을 수 있습니다.

- (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.
    }
}

물론 사용합니다 exit(0) 다른 답변에 따라 전경에서 실행되는 평균 생산 앱에 적합하지 않을 것입니다. http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top