2014-07-04 11 views
6

Ich verwende Phonegap 3 und das Media-Plugin. Ich halte diese Fehler bekommen, wenn auf iOS meine App testen:Phonegap "['Media'] Plugin sollte einen Hintergrund-Thread verwenden."

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

Ich habe dies aus der phonegap Dokumentation gesehen (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]; 
    }]; 
} 

dies in meiner app gehen Ist, wie es ist, oder tun Ich muss es für jedes Plugin bearbeiten? Wo soll ich es hinstellen?

Ich habe ein paar Beiträge online darüber gesehen, aber keine mit einer klaren Antwort, wie man den obigen Code verwendet.

Antwort

10

Persönlich habe ich noch nicht das Media Plugin verwendet, aber um Hintergrund-Threads zu behandeln, müssen Sie überprüfen, welcher Anruf die warning verursacht.

Zum Beispiel, wenn diese Warnung auslöst, wenn Sie ein media Objekt erstellen:

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

Dann können Sie die Plugins .js Datei überprüfen (die Media.js ist). Achten Sie auf die Funktion Media und suchen Sie nach dem nativen Anruf, der in diesem Fall:

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

Daraus Sie wissen, dass dieser Aufruf ist die Mediacreate-Methode der Klasse.
So gehen und offen Media.m (oder CDVSound.m in genau diesem Fall) und suchen Sie nach dem create Methode (Sie es in cordova/plugins/org.apache.cordova.media/src/ios finden sollte), Ende das gesamte Verfahren mit kapseln:

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

Dieses eine Hintergrund-Thread wird erstellen für "native" Medienerstellung. Es sollte wie folgt aussehen:

- (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

Vielen Dank für diese sehr klare, detaillierte Antwort! Aber Frage ... Ist es notwendig, *** dies zu tun? Xcode bietet diese Warnung für jeden Plugin-Aufruf, der länger als 10ms dauert, was nicht sehr lang ist (ich glaube nicht, dass Benutzer eine <100ms Verzögerung bemerken). Kann ich diese Warnung ignorieren oder wird Apple aufgrund dieser Warnung meine App ablehnen? – mattstuehler

+0

Schließlich hat jemand Schritte gegeben, um die Ursache zu finden. –

+1

@mattstuehler dies kann manchmal notwendig sein, wenn der Code länger als erwartet dauert oder nur Ihre Benutzeroberfläche einfriert. –

-4

1.Open Ihr Xcode-Projekt.

2.Klicken Sie auf die Einstellungsregisterkarte 2 "Capabilities".

3.Schalten Sie "Hintergrundmodi" ein.

4.Chose "Audio und Airplay".

Fertig. Jetzt können Sie Musik im Hintergrund abspielen.

PS: Ich benutze xCode 6 und Cordova 3.6.3