2014-07-04 14 views
6

Używam wtyczki Phonegap 3 i Media. Wciąż otrzymuję tych błędów podczas testowania mojej aplikacji na iOS:Phonegap "['Media'] Plugin powinien używać wątku tła."

THREAD WARNING: ['Media'] took '205.391846' ms. Plugin should use a background thread. 

Widziałem to z dokumentacji PhoneGap (http://docs.phonegap.com/en/edge/guide_platforms_ios_plugin.md.html):

- (void)myPluginMethod:(CDVInvokedUrlCommand*)command 
{ 
    // Check command.arguments here. 
    [self.commandDelegate runInBackground:^{ 
     NSString* payload = nil; 
     // Some blocking logic... 
     CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload]; 
     // The sendPluginResult method is thread-safe. 
     [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; 
    }]; 
} 

Czy to iść do mojej aplikacji, jak to jest, czy Czy muszę go edytować dla każdej wtyczki? Gdzie to umieściłem?

Widziałem kilka postów online na ten temat, ale żaden z wyraźną odpowiedzią na to, jak używać powyższego kodu.

Odpowiedz

10

Osobiście nie korzystałem jeszcze z wtyczki Media, ale aby obsłużyć wątki w tle, należy sprawdzić, które wywołanie wywołuje .

Na przykład jeśli to ostrzeżenie rzuca gdy tworzysz media obiektu:

var my_media = new Media(src, onSuccess, onError); 

Następnie można sprawdzić wtyczek .js plik (który jest Media.js). Sprawdzić funkcję Media i spojrzeć na rodzimym rozmowy, który jest w tym przypadku:

exec(null, this.errorCallback, "Media", "create", [this.id, this.src]); 

Od tego wiedzieć, że jest to wywołanie create metodę klasa za Media.
Więc idź i otwartą Media.m (lub CDVSound.m dokładnie w tej sprawie) i poszukać sposobu create (należy go znaleźć w cordova/plugins/org.apache.cordova.media/src/ios), koniec upakować całą metodę z:

[self.commandDelegate runInBackground:^{ 
    // the create method goes here 
}]; 

Stworzy to wątek tła do "natywnego" tworzenia Mediów. Powinno to wyglądać następująco:

- (void)create:(CDVInvokedUrlCommand*)command 
{ 
    [self.commandDelegate runInBackground:^{ 
     NSString* mediaId = [command.arguments objectAtIndex:0]; 
     NSString* resourcePath = [command.arguments objectAtIndex:1]; 

     CDVAudioFile* audioFile = [self audioFileForResource:resourcePath withId:mediaId doValidation:NO forRecording:NO]; 

     if (audioFile == nil) { 
      NSString* errorMessage = [NSString stringWithFormat:@"Failed to initialize Media file with path %@", resourcePath]; 
      NSString* jsString = [NSString stringWithFormat:@"%@(\"%@\",%d,%@);", @"cordova.require('org.apache.cordova.media.Media').onStatus", mediaId, MEDIA_ERROR, [self createMediaErrorWithCode:MEDIA_ERR_ABORTED message:errorMessage]]; 
      [self.commandDelegate evalJs:jsString]; 
     } else { 
      CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; 
      [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; 
     } 
    }]; 
} 
+2

Dziękuję za tę bardzo jasną, szczegółową odpowiedź! Ale pytanie ... Czy to jest konieczne *** do tego? Xcode dostarcza to ostrzeżenie dla każdego wywołania wtyczki, które trwa dłużej niż 10 ms, co nie jest zbyt długie (nie sądzę, aby użytkownicy zauważyli opóźnienie <100ms). Czy mogę bezpiecznie zignorować to ostrzeżenie, czy też to ostrzeżenie spowoduje, że Apple odrzuci moją aplikację? – mattstuehler

+0

W końcu ktoś podał kroki, jak znaleźć główną przyczynę. –

+1

@mattstuehler może to być konieczne, gdy kod trwa dłużej niż oczekiwano lub po prostu zawiesza twój interfejs użytkownika. –

-4

1.Otwórz swój projekt xCode.

2. Kliknij zakładkę ustawień 2 "Możliwości".

3.Włączyć "Tryby tła".

4. Wybierz "Audio i Airplay".

Gotowe. Teraz możesz odtwarzać muzykę w tle.

PS: Używam xCode 6 i Cordova 3.6.3

Powiązane problemy