- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
에서 viewDidLoad
아이폰 OS 8의 확장 . NSLog
엑스 코드에 아무것도 출력한다. NSLog
하지만 컨테이너 앱에서는 평소처럼 작동합니다.
확장에서 디버그 메시지의 출력을 얻으려면 어떻게해야합니까?
- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
에서 viewDidLoad
아이폰 OS 8의 확장 . NSLog
엑스 코드에 아무것도 출력한다. NSLog
하지만 컨테이너 앱에서는 평소처럼 작동합니다.
확장에서 디버그 메시지의 출력을 얻으려면 어떻게해야합니까?
답변:
앱 확장을 디버깅하는 단계 :
컨테이너 앱을 실행합니다. 이 단계에서 Xcode는 컨테이너 앱과 앱 확장을 디바이스 또는 시뮬레이터에 업로드합니다.
컨테이너 앱을 중지합니다. 이 단계는 시뮬레이터에서 디버그 할 때 중요합니다. 그렇게하지 않으면 Xcode는 시뮬레이터가 사용 중이라고 알려줍니다.
Xcode에서 Debug-> Attach to Process-> By Process Identifer (PID) 또는 Name ... 메뉴를 누르고, com.abc.ContainerApp.MyExtension과 같은 앱 확장 식별자를 입력하여 디버깅을 시작합니다. 중단 점을 설정하는 것을 잊지 마십시오. (2014 년 8 월 25 일 업데이트 : MyExtension (확장자 이름)을 직접 입력 할 수 있습니다.)
기기 또는 시뮬레이터에서 앱 확장을 엽니 다.
위의 디버깅 단계가 시뮬레이터의 iOS 8 SDK 베타 5가있는 Xcode 6 베타 6에서 제대로 작동하지 않음을 발견했습니다.
해결책:
중단 점이 작동합니다. 그러나 로그가 출력 창에 표시되지 않는 이유를 모르겠습니다.
나도이 문제가 있습니다. Debug-> Open System Log ... 메뉴에서 시뮬레이터로 이동하면 저에게 효과적입니다.
여기에서 iPhone Simulator의 모든 로그 (확장 프로그램의 로그 포함)를 볼 수 있습니다.
NSLog
완벽하게 작동하고 있습니다 .
Xcode 디버거가 확장에 연결되어 있지 않기 때문에 Xcode의 디버그 영역에 무엇이 기록되고 있는지 볼 수 없습니다. 확장은 거의 포함 된 앱 완전히 독립적입니다. 예를 들어, 별도의 번들 식별자가 있으며 OS에서 별도의 프로세스이기도합니다.
Xcode를 확장에 연결하는 데 다양한 성공을 거두었습니다. 자동으로 연결되는 것처럼 보이며 디버그 탐색기에 "Waiting to attach"로 표시되지만 연결되지는 않습니다.
때로는 Xcode에서 확장 대상을 실행할 수 있습니다.
그런 다음 내 확장 프로그램을 실행할 응용 프로그램을 선택할 수 있습니다.이 경우에는 알림 센터 인 "오늘"권장 사항을 선택합니다.
그리고 때때로 디버거를 내 확장에 연결합니다. 이 방법은 물리적 장치에서만 작동합니다.
첨부되지 않으면 @VinceYaun의 답변에서 수동 첨부 방법을 사용할 수 있습니다.
나는 또한 다른 부착 방법을 사용하여 다양한 성공을 거두었습니다. 대부분은 실패했으며 나중에 수정 될 버그 일뿐입니다.
로그 메시지를 보려면 상단 표시 줄의 Window
-> 로 이동 Devices
하여 장치를 선택하십시오. 해당 창 하단에서 장치 로그를 불러올 수 있습니다. 시뮬레이터에서 테스트하는 경우 @BalestraPatrick의 답변을 사용할 수 있습니다. .
일부 버그는 베타 2에서 수정되었으며, 내 생각에는 결국 확장 프로그램을 시작할 때 디버거가 자동으로 연결될 것입니다.
업데이트 : iOS 8 베타 4 릴리스 노트 :
확장
베타 4에서 수정 됨
- Xcode에서 디버깅 할 때 확장이 실행되지 않는 경우가 있습니다.
- UI가있는 확장이 종료되면 다시 시작되고 닫히지 않습니다.
- 때때로 공유 또는 작업 확장 프로그램이 중단 될 수 있습니다.
- 확장을 재배포하면 알림 센터에서 확장이 비활성화 될 수 있습니다.
나도이 문제가 있습니다. Xcode는 내 디버거를 확장에 연결하거나 NSLog 메시지를 표시하지 않습니다. Xcode 디버거를 확장 프로세스에 수동으로 연결하면 최소한 중단 점이 매력처럼 작동합니다.
Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
Xcode 8은 확장 기능을 디버깅 할 수 있습니다.
결과 : 중단 점과 로그는 평소와 같이 작동합니다.
Michael의 제안 과 Apple의 문서를 기반으로 마침내 디버깅 영역에서 로그를 볼 수 있었던 이유 같습니다.
시뮬레이터에서 앱 확장을 빌드 및 실행하고 호스트 앱을 묻는 메시지가 표시되면 확장을 호출 할 특정 앱을 선택합니다 . 제 경우에는 PDF에서 공유 시트를 가져와 Safari에서 Action 확장 프로그램을 시작했습니다.
이전에는 작동하지 않았던 것은 Today를 호스트로 사용하라는 다른 사람들의 제안을 따르고 그 앱을 종료하고 Safari로 이동하여 내 확장 번호를 호출하는 것입니다. 더 이상 확장 프로그램을 실행하기 전에 포함 된 앱을 먼저 실행할 필요도 없습니다.
Apple의 문서에서 :
확장 체계의 실행 단계에서 호스트 앱을 실행 파일로 지정합니다. 지정된 호스트의 UI를 통해 확장에 액세스하면 Xcode 디버거가 확장에 연결됩니다.
실제로 Xcode 6.3에서 로그를 아주 간단하게 실행했습니다. 먼저 포함 된 앱을 빌드하고 실행합니다. 포함 된 앱이 기기에서 실행되면 스키마를 앱 확장으로 변경하여 앱 확장을 빌드하고 실행합니다.
나를 위해 일하는 트릭은 (아주 못생긴 것이지만) UILabel
내 확장의 하단 모서리에 더미를 배치하는 것입니다. 나는 보통 그것을 부른다logLabel
. 그런 다음 기록하려는 로그 문으로이 레이블의 텍스트를 업데이트 할 수 있습니다. 다른 클래스의 인스턴스에서 명령문을 기록해야하는 경우 이러한 접근 방식은 그다지 좋지 않습니다. 그리고 분명히 UI를 복잡하게 만듭니다.
그러나 매우 간단한 위젯이 있고 UI가 약간 어수선 해져도 괜찮다면이 방법을 사용할 수 있습니다. 나는이 토론에 설명 된 다른 모든 솔루션을 시도했지만 슬프게도 그들 중 어느 것도 나를 위해 일하지 않았습니다.
확장에 대한 동일한 문제가 발생합니다. NSLog
및 중단 점 . 나는 여러 날 동안 그것을 싸웠다.
Device log
다음 이미지에서 찾을 수 있습니다. 그것은XCode -> Window -> Devices and Simulators
있습니다.
를 입력하면 Open Console
대화 상자의 오른쪽 상단에 검색 필드가 있습니다. 거기에 필터 규칙을 적용 할 수 있습니다. 예를 들어, 프로세스 이름에 Notification
키워드 가 포함 되거나 프로세스 이름이 확장 대상의 이름과 동일해야합니다 (예 : MyNotificationServiceExtension
프로세스 이름 과 동일) .
컨테이너 앱과 확장은 iOS에서 완전히 두 가지 프로세스이며 LLVM은 한 번에 스레드 만 디버깅하므로 디버깅 할 때 콘솔은 확장을 기록하지 않고 중단 점에서 멈추지 않습니다.
@Vince Yuan의 방법으로 대부분의 문제를 해결할 수 있습니다.
그러나 내 문제는 Xcode 디버거가 iOS 시뮬레이터와 장치 모두에서 내 키보드 확장에 거의 연결되지 않는다는 것입니다. @Vince Yuan의 방법도 가끔 작동합니다.
내 작은 경험은 디버그 체계를 실행할 때 왼쪽 패널의 디버그 세션에 '디버그 세션 없음'이 표시되면 확장을 열고 테스트 할 필요가 없으며 디버거가 연결되지 않고 실행됩니다. 행운을 위해 다시.
그러나 com.xxx.xxx.xxx가 연결 대기 중임을 확인하면 확장 프로그램이 확실히 디버깅 될 수 있습니다.
이것은 iOS 확장, 특히 키보드 확장을 디버깅 할 수없는 사람을위한 작은 트릭입니다.