1

다른 사람들이 iOS 앱 상태 변경 사항을 자동으로 감지 (및 대응)하도록 진화 한 깔끔한 기술로 다른 사람들이 혜택을 누릴 수 있도록이 질문을 게시하고 있습니다. 블로그 토론이 여기에 있습니다. My BlogiPhone 앱 상태 변경을 감지하는 방법은 무엇입니까?

+0

내가 강력하게 추천 다시 같이 분석 진정한 질문으로 이것을 다음 답변을 게시보다는 스팸 –

+0

미첼에 노력하고, 당신은 내 원래의 게시물에 물음표를 포함하는 것을 잊었다 정확합니다. 결정된. –

+0

그리고 당신은 너무 빨리 대답하여 제가 답변을 게시 할 시간이 없었습니다. 아직 스팸 게시물이라고 생각하지 않기를 바랍니다. :) –

답변

10

앱 상태 변경에 대한 응답으로 코드를 실행하는 방법에 대한 정보가있는 경우 코드에 대한 호출을 앱 대리인에 추가하는 코드 예제가 있습니다. 응용 프로그램이 FinishedLaunchingWithOptions 또는 didBecomeActive 또는 WillEnterBackground를 수행 할 때마다 호출됩니다.

하지만 코드를 다시 사용하는 다른 앱에서 작업을 시작한다고 가정 해 보겠습니다. 앱 위임 메소드를 다시 배선 할 필요없이 일부 파일을 복사하여 모든 기능을 사용할 수 있다면 좋지 않겠습니까?

요약하면 프로젝트에 참여하는 것만으로 추가 작업이나 배선 작업 없이도 작업을 수행 할 수있는 드롭 인 모듈이 필요합니다. 이 시점에서 당신은 "나는 또한 유니콘과 엘프에게 피자를 가져 오라고"라고 말할 것입니다. 나를 참아주십시오.

내가 문서를 읽을 때 이것을 놓친 것이 확실치 않지만, iOS 응용 프로그램이 상태를 바꿀 때, 단지 그것에 대해 알고있는 응용 프로그램 대리인이 아닙니다. NSNotifications는 모든 주 변경 사항에 대해 게시됩니다.

[applicationDidBecomeActive]를 호출 한 후 응용 프로그램은 관심있는 객체에 전환에 응답 할 수있는 기회를 제공하기 위해 UIApplicationDidBecomeActiveNotification 알림을 게시합니다.

마찬가지로 UIApplicationDidFinishLaunchingNotification은 응용 프로그램 실행이 끝난 후 즉시 게시되고 배경 입력 또는 포 그라운드로 들어가는 다른 알림이 표시됩니다.

그래서 이것이 우리의 코드를 단순화하는 대신 applicationDidBecomeActive의 응용 프로그램 대리인의 구현에

[RobustWebService handleAppBecomingActive] 

를 호출 할 필요없이, 우리는 단지 RobustWebService이 UIApplicationDidFinishLaunchingNotification에 응답해야합니다.

이제 RWS 클래스가 알림을 처리하기 위해서는 관찰자로 등록해야한다는 것을 알게 될 것입니다. 그 전화는 다음과 같습니다.

[[NSNotificationCenter defaultCenter] addObserver:self 
Selector:@selector(handleAppBecomeActive) 
name:UIApplicationDidFinishLaunchingNotification 
object :nil] 

어디에서 얻을 수 있습니까? 앱 델리게이트를 만지기를 원하지 않는다는 것은 자체 포함 된 드롭 인 모듈을 갖는 의도를 무효화 할 수 있기 때문입니다. addObserver 함수 호출이 자동으로 클래스에 대해 수행되도록하는 방법이 있다면. 단지 ...

이 시점에서 우리는 "코코아"에서 벗어나 Objective-C의 기본 기술을 파헤 쳐야합니다. 물론, 클래스 정의에있는 경우 클래스가 처음로드 될 때 자동으로 호출되는 "load"라는 클래스 메소드가 있습니다. 코드에서 다시 생각해 봅시다. 어떤 클래스 .m 파일에이 함수를 작성하면

+ (void) load 
    { 
       // stuff 
    } 

iOS에서 클래스를로드 할 때 실행됩니다. 흥미롭게도, 앱의 main() 루틴이 호출되기 전에 실행되므로 수행하려고하는 것에 대해 매우주의해야합니다! 이 시점에서 대부분의 앱이 실제로 실행되지는 않지만 클래스 링크가 적용되는 모든 프레임 워크가 먼저로드됩니다.같은 NSNotificationCenter 같은 프레임 워크, 당신은 당신의 class.m이 포함 된 경우

는 는 는
 + (void) load 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
       Selector:@selector(handleAppBecomeActive) 
       name:UIApplicationDidFinishLaunchingNotification 
       object :nil]; 
    } 
는 는 는

는 그런 다음 handleAppBecomeActive 방법 앱이 활성화 될 때 당신이 아닌 다른 아무것도 할 필요없이 전화를받을 것은 class.h 및 클래스를 포함 있도록 .m 프로젝트에서.

그리고 당신은 당신의 class.m 파일에이 코드를 포함하는 경우

+ (void) load; 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(handleAppLaunched) 
    name:UIApplicationDidFinishLaunchingNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self   selector:@selector(handleAppResigningActive) name:UIApplicationWillResignActiveNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppBecomingActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringBackground) name:UIApplicationDidEnterBackgroundNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringForeground) name:UIApplicationWillEnterForegroundNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppClosing) name:UIApplicationWillTerminateNotification object:nil]; 
} 

클래스가 필요없이 다른 작업과 모든 응용 프로그램 상태 변경 알림을 받게됩니다. 이것은 여전히 ​​차가워서 여전히 내 마음을 호흡하게 만듭니다. 즐겨!

테리

+0

와우, 갑자기 iOS 개발이 조금 더 좋아졌습니다. 고마워. –