문제

내 앱은 Nstimer를 사용하며 iPhone이 대기 모드로 들어갈 때 (하드웨어 버튼을 누르거나 유휴 타이머로) Nstimer가 발사되지 않는 것으로 보입니다.

iPhone을 다시 활성화하면 내 앱이 여전히 전경에 있습니다. iPhone이 대기 모드 인 경우 타사 앱은 어떻게됩니까?

도움이 되었습니까?

해결책

여기서는 분명하지 않지만 원래 포스터가 스레드를 시작하여 그의 질문에 대한 답을 찾았다 고 생각합니다 (여기에서 사용할 수 있습니다) iPhone 개발자 포럼에서 (정보가 여기에서 공유되지 않았기 때문에 결국 나 자신을 찾아야했습니다).

다른 사람이 같은 질문을하고 앞으로 페이지를 찾는 경우 Apple 포럼에 "Eskimo1"이라는 누군가가 게시 한 유용한 응답이 있습니다 (문맥이 없으면 읽기가 더 쉬워서 약간 편집했습니다. 전체 원본 스레드에서 제공) :

  • iPhone 앱 상태 용어와 관련하여 "Active"는 "Awake"를 의미하지 않으며 "GUI에 첨부 된"을 의미합니다. Mac OS X에서 "최전"과 유사하다고 생각합니다. 장치를 잠그면 앱이 비활성화되지만 장치가 잠들지 않을 수도 있고 그렇지 않을 수도 있습니다.
  • 장치가 주 전원 (즉, USB를 통해)에 연결되어 있으면 iPhone OS는 거의 잠들지 않습니다. 그러나 배터리에서 작동하면 잠을 잘 수 있습니다.
  • 화면이 잠긴 후 짧은 시간 (Oliver Drobnik에 따르면 20 초) 장치는 잠을 자고 있습니다. 이것은 노트북의 뚜껑을 닫는 것과 같습니다. 주요 CPU의 모든 활동은 정지됩니다.
  • 장치가 올바른 오디오 세션에서 오디오를 재생하는 경우에는 발생하지 않습니다. 보다 DTS Q & A QA1626 "오디오 세션 - 화면이 잠겨있을 때 오디오 재생이 계속됩니다" 자세한 내용은.
  • IdletimerDisabled 속성 (앱이 실행되는 동안 화면이 꺼지지 않도록 켜질 수 있음)은 사용자 비 활동 후 화면을 잠그는 것입니다. 그것은 시스템 수면과 직접 관련이 없습니다 (시스템이 잠긴 직후 시스템이 잠들 수 있다는 점에서 간접적으로 관련이 있습니다).

다른 팁

보다 응용 프로그램 중단 에서 iPhone OS 프로그래밍 안내서, 특히 applicationWillResignActive 그리고 applicationDidBecomeActive 이벤트. (전체 가이드는 확실히 읽을 가치가 있습니다.) 이벤트를 무시할 때, 타이머는 잠시 동안 진행되는 것처럼 보이고 멈 춥니 다. 논리적으로 들리면 응용 프로그램은 계속 작동하면 배터리를 쉽게 배수 할 수 있습니다. 그리고 정확히 응용 프로그램은 어떻게됩니까? 나는 단순히 CPU 시간을 얻지 못한다고 생각합니다. 기계를“켜기”로 돌릴 때만 얼어 붙어 해동됩니다.

내 첫 번째 조언은 유휴 타이머를 비활성화하지 않는다는 것입니다. 즉, 해킹 일뿐입니다. UI 이벤트 중에 타이머를 살아있게 유지하려면 NScommonModes를 사용하여 현재 실행 루프의 타이머를 실행하십시오.

// create timer and add it to the current run loop using common modes

self.timer = [NSTimer timerWithTimeInterval:.1 target:self selector:@selector(handleTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

나는이 게시물의 정보를 내가 만들고 있던 작은 샘플에 사용했습니다. 이것은 오디오가 중지되지 않도록 재생을 시작했을 때 사용한 코드입니다.

AudioSession.Category = AudioSessionCategory.MediaPlayback;

그리고 응용 프로그램이 재생으로 완료되면 원래 값으로 재설정됩니다.

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

전체 샘플은 여기에 있습니다.

http://github.com/migueldeicaza/monotouch-samples/tree/master/streamingaudio/

나는 최근에 여러 타이머를 사용하고 몇 가지 오디오 프롬프트를 연주하고 비교적 간단한 두 가지 변경을 수행하는 앱 에서이 문제에 직면했습니다.

  1. 에서 AppDelegate 다음 방법을 구현했으며 화면이 잠겨있을 때 앱이 계속 될 수 있습니다.

    // this receives the notification when the device is locked
    - (void)applicationWillResignActive:(UIApplication *)application
    { 
    }
    
    // this receives the notification that the application is about to become active again
    - (void)applicationWillBecomeActive:(NSNotification *)aNotification
    {
    }
    

    참조 : UIAPPLICATIONDELEGATE 프로토콜 참조 & nsapplication 클래스 참조 API DOC에서 (Xcode를 통해 액세스 할 수 있습니다. applicationWillBecomeActive).

  2. 메인을 만들었습니다 viewcontroller 클래스 An AVAudioPlayerDelegate 그리고 Apple의 "AddMusic"샘플 에서이 코드를 사용하여 오디오 알림을 만들어 앱이 iPod 오디오 등에 잘 혼합 된 믹스를 알립니다 ...

    방금이 코드를 ViewDidload 중에 호출되는 메소드로 삭제했습니다. 이것이 당신에게 관심이 있다면, 당신은 이것에 대한 "이 문서를 읽어야하는 사람"범주에 속합니다. 오디오 세션 프로그래밍 안내서

    // Registers this class as the delegate of the audio session.
    [[AVAudioSession sharedInstance] setDelegate: self];
    
    // The AmbientSound category allows application audio to mix with Media Player
    // audio. The category also indicates that application audio should stop playing 
    // if the Ring/Siilent switch is set to "silent" or the screen locks.
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
    
    // Activates the audio session.
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];
    

나는 당신의 응용 프로그램이 정상적으로 중단 될 때 정상적으로 실행되어야한다고 생각합니다. (판도라 라디오를 생각하십시오)

시야가 숨겨져 있거나 다른 이벤트가 발생하여 타이머가 처리 중인지 확인하십시오.

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