[error-handling] iOS9 스토리 보드 처리되지 않은 작업 (handleNonLaunchSpecificActions)이란 무엇입니까?

스토리 보드를 사용할 때 iOS 9에서 내 앱을 실행할 때 콘솔에 다음 오류가 표시되는 것을 확인했습니다. xCode7을 사용하고 있습니다. 이것이 제가 걱정할 필요가있는 것입니까?

-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action -> <FBSSceneSnapshotAction: 0x176bfb20> {
    handler = remote;
    info = <BSSettings: 0x176a5d90> {
        (1) = 5;
    };
}



답변

코드에 문제가 없습니다. 이것은 Apple 내부의 로깅 메시지이며 이에 대한 레이더를 제출해야합니다.

이것이 아마도 Apple의 코드 임을 보여주는 두 가지 힌트가 있습니다.

  1. 메서드 이름 앞의 밑줄 _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion은 메서드가 선언 된 클래스에 대해 비공개 / 내부임을 나타내는 규칙입니다. ( 이 주석 참조 )

  2. FBSSceneSnapshotActionRene Ritchie에 따르면 ” iOS 9 위시리스트 : 게스트 모드”의 Rene Ritchie는 앱 실행과 관련된 전체 소프트웨어 제품군의 일부인 FrontBoard 의 두 글자 접두사 가 속기 라고 추측하는 것이 합리적 입니다.

iOS 8을 통해 Apple은 시스템 관리자 인 SpringBoard를 더 작고 집중된 여러 구성 요소로 리팩토링했습니다. 백그라운드 작업을 처리하기 위해 이미 분리 된 BackBoard 외에도 전경 작업을 위해 Frontboard를 추가했습니다. 또한 안전하고 암호화 된 조건에서 잠금 화면을 처리하기 위해 PreBoard를 추가했습니다. […]

BS접두사가 무엇인지 BSSettings모르겠지만

BS는의 약어이며이 BackBoard Settings로그 메시지를 분석하면 사용자가 수행 한 작업이 아님을 나타내므로 로깅 메시지를 재현하는 단계와 함께 레이더를 제출해야합니다.

스택 추적을 시도하고 싶다면 여기에 링크 된 카테고리를 구현할 수 있습니다 . 일부는 비공개 API를 재정의하는 것이 좋지 않다고 주장하지만이 경우 스택 추적을 가져 오기위한 임시 주입은 너무 해로울 수 없습니다.

편집하다:

그러나 우리는 여전히이 행동이 무엇인지 알고 싶습니다. 그래서 중단 점을 설정 -[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]하고 레지스터 값을 인쇄하기 시작했고 FBSceneImpl내 응용 프로그램에 대한 전체 정보가 포함 된 클래스를 찾았습니다 .

장면

다음에 어떤 private 메서드가 호출되는지 알 수 있습니다 ( 프로그램 카운터, 명령 포인터, 레지스터 15에 저장 됨).

프로그램 카운터

나는 FBSceneSnapshotAction로그에서 언급 된 처리되지 않은 것을 찾으려고 했지만 주사위는 없었다. 그런 다음 UIApplication을 서브 클래 싱하고 _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. 이제 나는 직접 행동을 취할 수 있었지만 여전히 그것이 무엇인지 모릅니다.

그런 다음 FBSceneSnapshotAction을 다시 살펴 보았습니다. 라는 수퍼 클래스가 BSAction있습니다.

그런 다음 RuntimeBrowser 와 유사한 도구작성 하고 BSAction의 모든 하위 클래스를 검색했습니다. 꽤 많은 목록이 있음이 밝혀졌습니다.

액션 목록

우리가 가지고있는 두 가지 메서드 이름 (하나는 로그에서, 하나는 장치의 프로그램 카운터에서)은 이러한 작업이 시스템 전체에 작업을 전달하기 위해 내부적으로 사용된다는 것을 나타냅니다.

일부 작업은 앱 델리게이트의 콜백으로 전송되는 반면 다른 작업은 내부적으로 처리됩니다.

여기서 일어나는 일은 올바르게 처리되지 않은 작업이 있고 시스템이이를 인식하고 있다는 것입니다. 분명히 우리는 그것을 볼 수 없었습니다.


답변

AFAIK, 위의 정보는 화면 스냅 샷 중 iOS와 관련이 있습니다 (더블 클릭 홈 멀티 태스킹 관련 동작을 가정 함). 내 애플리케이션을 깊이 조사한 결과 부수적 동작이 발생하지 않는 것 같습니다. 지금은 무시해도됩니다.

다음 요점 간단한 범주 를 사용 하여 위 함수에 대한 호출에 대해 자신을 테스트 할 수 있습니다 .


답변

나는 그것을 알아 냈다. .h 또는 .m 파일에 IBAction 메서드를 선언했지만 컨트롤에 바인딩하지 않았을 때 발생합니다.

.m 예 :

- (IBAction)click:(id)sender{
}

하지만이 메서드는 스토리 보드의 컨트롤에 할당되지 않았습니다.


답변

내 앱에서 왜 발생하는지 알지 못했지만 로그 창에 표시되지 않도록하려면 최소한 예외를 포착 할 수 있습니다. 해결책은 아니지만 캐치에서 전달되는 인수를 검사하여 왜 이것이 실패하는지 더 많은 통찰력을 줄 수 있습니다.

신속한 2 버전 :

import UIKit

extension UIApplication {
    func _handleNonLaunchSpecificActions(arg1: AnyObject, forScene arg2: AnyObject, withTransitionContext arg3: AnyObject, completion completionHandler: () -> Void) {
        //whatever you want to do in this catch
        print("handleNonLaunchSpecificActions catched")
    }
}


답변