2014-07-04 29 views
6

Phonegap 3 ve Media eklentisini kullanıyorum.Phonegap "['Medya'] Eklenti bir arka plan iş parçacığı kullanmalıdır."

- (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]; 
    }]; 
} 

budur benim uygulamasına gidebilir veya yapıyor mu:

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

Ben PhoneGap belgelerinde (http://docs.phonegap.com/en/edge/guide_platforms_ios_plugin.md.html) Bu gördük: iOS'ta Uygulamamı test ederken ben bu hataları almaya devam Her eklenti için düzenlemem gerekiyor mu? Onu nereye koyayım?

Bu konuyla ilgili çevrimiçi birkaç yayın gördüm, ancak hiçbiri yukarıdaki kodun nasıl kullanılacağına dair net bir cevaba sahip değildir.

cevap

10

Şahsen ben henüz Media eklentisini kullanmamıştım ama arka plan iş parçacığı işlemek için warning neden çağrı olduğunu kontrol etmeniz gerekir.

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

Sonra ( Media.js olan) eklentileri .js dosyasını kontrol edebilirsiniz: Bir media nesnesi oluştururken Örneğin

bu uyarı atarsa. fonksiyonu Media bakın ve bu durumda olan yerli çağrı için bak: Bundan

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

bu Media sınıfının create yöntemini çağırarak olduğunu biliyoruz.
Şimdi git ve açık Media.m (veya CDVSound.m tam bu durumunda) ve son ile tüm yöntem saklanması, (eğer cordova/plugins/org.apache.cordova.media/src/ios onu bulmalı) create yöntemi için bak: Bu arka plan iş parçacığı yaratacak

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

"native" medya oluşturma için. Bu gibi görünmelidir:

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

bu çok açık, detaylı cevap için teşekkür ederiz! Ama soru ... Bunu yapmak için *** gerekli mi? Xcode, 10ms'den uzun süren herhangi bir eklenti araması için bu uyarıyı sağlar, bu çok uzun değildir (kullanıcıların <100 ms gecikme farkedeceğini sanmıyorum). Bu uyarıyı güvenli bir şekilde göz ardı edebilir miyim, yoksa bu uyarı Apple'ın uygulamamı reddetmesine neden olur mu? – mattstuehler

+0

Son olarak, bir kişi temel nedenin nasıl bulunacağına dair adımlar attı. –

+1

@mattstuehler Bu, kodun beklenenden uzun sürmesi veya yalnızca UI'nizi donduğunda gerekli olabilir. –

-4

1.Open Xcode projesine.

2. Ayarlar sekmesi 2 "Yetenekler" 'e tıklayın.

3.Turn “Background Modes” öğesini açın.

4. "Audio ve Airplay" öğesini seçin.

Done.Şimdi arka planda müzik çalabilirsiniz.

PS: Ben Xcode 6 kullanıp Cordova 3.6.3

İlgili konular