2016-09-11 7 views
1

업데이트 10/9/2016 : 다음과 같은 결함으로 인해 2011 년 9 월 22 일에 Apple과 레이더 # 28425770을 열었습니다. duplicate (레이더 # 28327056)이므로 iOS10에서 알려진 버그 인 것으로 보입니다.MusicSequenceFileLoad는 iOS10 (AudioToolbox/MusicPlayer)에서 -1을 반환합니다.


나는 iOS10 아이 패드 프로 (무선 랜에 음악 순서로 AudioToolbox/MusicPlayer의 API 방법 "MusicSequenceFileLoad()"(지정된 URL에서) MIDI 파일의 내용을로드를 호출 오류가 발생했습니다 모델)이 문제를 디버깅 할 때 커뮤니티의 도움을 크게 주시면 감사하겠습니다.

  • 이 코드는 iOS7에, 8 일에 생산에 문제없이 작업하고 있으며, 9 2+ 년 동안도에서 문제없이 실행 :

    연구/관측은 내가 지금까지 할 수있었습니다 iOS 10 시뮬레이터를 사용하지만 iOS 10.0.1 iPad Pro Wifi 모델에서만 오류를 반환합니다.

  • 다른 장치에서 재생성 할 수 없었으며 일부 친구에게도 시도해달라고 요청했습니다. 문제없이 테스트 된 기기 : iPhone 6+, iPad Mini 4th Gen, iPad Pro Cellular.

  • 이 MIDI 파일을 사용하는 VC가 처음 표시 될 때 모든 처리가 아무 문제없이 실행됩니다. 앱이 충돌하는 곳에서 VC가로드되는 것은 두 번째 (또는 때로는 세 번째)입니다. 문제는 100 % 일관되게 재현 될 수 있습니다.

  • OSStatus 결과 코드를 검사하여이 함수를 호출하면 단순히 -1 값이 반환되고 오류의 원인은 표시되지 않습니다.

  • Xcode에서 디버깅 할 때 오류 보고서가 없으면 예외 정보 또는 호출 스택을 사용할 수 있습니다.

  • 메모리 관리 문제 (할당, 누수, 좀비)에 대한 프로파일 링에 크래시와 관련된 정보가 표시되지 않았습니다. 좀비 오브젝트 옵션을 켜면 좀비 오브젝트가 표시되지 않습니다.

  • 응용 프로그램을 분석해도 메모리가 해제되지 않은 영역이 표시되지 않았습니다.

  • 정적 인 개체를 변경해도 영향이 없으므로 메모리와 관련이없는 것처럼 보입니다.

누구든지이 문제를 디버깅 할 수있는 다른 방법에 대한 제안 사항이 있으면 크게 환영 할 것입니다. 원래 메모리 관리와 관련이있을 수 있다고 생각했지만, 메모리를 적절하게 처리하고 (응용 프로그램에 대해 ARC를 사용하고 필요에 따라 C-API 개체를 릴리스하는 것으로 나타났습니다) 프로파일 링을 통해 볼 수있는 문제는 밝혀지지 않았습니다.

코드 샘플 :

@property (readwrite, nonatomic) MusicPlayer midiMusicPlayer; 
@property (readwrite, atomic) MusicSequence masterMidiMusicSequence; 

- (void)initializeMusicPlayerAndMasterSequenceWithFile:(NSString *)midiFilename 
{ 
    CheckError(NewMusicPlayer(&_midiMusicPlayer), "NewMusicPlayer: _midiMusicPlayer"); 
    CheckError(NewMusicSequence(&_masterMidiMusicSequence), "NewMusicSequence: _masterMidiMusicSequence"); 

    NSString *midiFilePath = [NSBundle pathForResource:midiFilename 
               ofType:@"mid" 
           checkDocumentsDirectory:YES]; 
    NSURL *midiFileURL = [NSURL fileURLWithPath:midiFilePath]; 

    // Crash is encountered on the following line: 
    CheckError(MusicSequenceFileLoad(self.masterMidiMusicSequence, (__bridge CFURLRef)midiFileURL, 0, 0), "MusicSequenceFileLoad"); 
} 

답변

1

Apple 엔지니어가 Core Audio Mailing List을 통해 안내를 받았으며 iOS10에서이 문제에 대한 제안 된 해결 방법을 성공적으로 구현했습니다.

호출이 실패한 후 "errno"값을 0으로 업데이트하면 이후에 'MusicSequenceFileLoad'를 호출하면 성공적인 응답이 생성됩니다. CheckError() 함수는 단순히 알려진 OSStatus 코드에 대한 OSStatus 반환 값을 확인하고 (원래 Chris Adamson from his blog post/presentation "Core Audio Cranks It Up"에 의해 생성) this one on GitHub 유사하다

OSStatus statusOfInitialAttempt = CheckError(MusicSequenceFileLoad(self.masterMidiMusicSequence, (__bridge CFURLRef)midiFileURL, 0, 0), "MusicSequenceFileLoad"); 
if (statusOfInitialAttempt == -1) { 
    errno = 0; 

    OSStatus statusOfSecondAttempt = CheckErrorAndReturnOnFailure(MusicSequenceFileLoad(self.masterMidiMusicSequence, (__bridge CFURLRef)midiFileURL, 0, 0), "MusicSequenceFileLoad"); 

    if (statusOfSecondAttempt == -1) { 
     // Handle error case 
    } 
} 

을 ... 다음과 같이 따라서, 나는 내 코드를 수정했습니다.

본인은 Core Audio Mailing List에 게시 된 내용에 따라 향후 iOS 업데이트에서이 문제가 해결 될 것으로 예상됩니다.

+0

'Core Audio Mailing List'를 읽었지만이 'errno'가 무엇인지 이해할 수 없습니다. 그것을 어디에서 선언합니까? – pteofil

+0

@pteofil 이미 존재하므로 Core Audio에서 사용하므로 선언 할 필요가 없습니다. 단순히 "errno"를 입력하면 를 이미 가져 왔다고 가정하면 액세스 할 수 있습니다. 희망이 도움이됩니다. –

+0

이 해결 방법은 여전히 ​​iOS 11에서 사용할 수 있습니까? 나는 최신 베타 버전을 사용하고 있지만 EXCEPTION (-54) : "Open : Permission denied"가 표시됩니다. 'errno = 0; '을 설정해도 문제가 해결되지 않았습니다. – Nikolozi

0

당신이 당신의 Info.plistNSAppleMusicUsageDescription를 추가하려고 했습니까?

iOS 10부터는 Info.plist 파일에 각 항목에 대한 권한 경고에 표시 할 목적 문자열이 포함되어야합니다.해당 용도 문자열을 제공하지 않고 앱이 보호 된 항목에 액세스하려고 시도하면 앱이 종료됩니다.

자세한 내용은 App Programming Guide for iOS을 참조하십시오.

+0

이 제안에 감사드립니다! 나는이 변화를 인식하지 못했고이 기회를 포기했다. 나는 사용자의 음악 라이브러리에 접근하고 있지 않지만 다른 사람들도 파일의 간단한 재생으로이 문제를 겪었던 것으로 보인다. 불행히도, 이것은 나를 위해 문제를 해결하지 못했습니다. –