2014-07-04 9 views
6

मैं फोनगैप 3 और मीडिया प्लगइन का उपयोग कर रहा हूं।फोनगैप "['मीडिया'] प्लगइन को पृष्ठभूमि धागे का उपयोग करना चाहिए।"

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

यह मेरा एप्लिकेशन में जाने के रूप में यह है, या करना है:

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

मैं phonegap प्रलेखन (http://docs.phonegap.com/en/edge/guide_platforms_ios_plugin.md.html) से देखा है: जब iOS पर मेरी ऐप का परीक्षण मैं इन त्रुटियों को प्राप्त हो रही है मुझे प्रत्येक प्लगइन के लिए इसे संपादित करने की ज़रूरत है? मैं इसे कहां रखूं?

मैंने इस बारे में कुछ पोस्ट ऑनलाइन देखी हैं, लेकिन उपर्युक्त कोड का उपयोग करने के बारे में स्पष्ट उत्तर के साथ कोई भी नहीं।

उत्तर

10

व्यक्तिगत रूप से मैंने अभी तक Media प्लगइन का उपयोग नहीं किया है, लेकिन पृष्ठभूमि धागे को संभालने के लिए आपको यह जांचने की आवश्यकता होगी कि कौन सी कॉल warning का कारण बन रही है।

उदाहरण के लिए यह चेतावनी फेंकता है तो जब आप एक media वस्तु पैदा कर रहे:

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

तो फिर तुम प्लगइन्स .js फ़ाइल की जाँच कर सकते हैं (जो Media.js है)। समारोह Media के लिए देखो और देशी कॉल जो इस मामले में है के लिए देखो:

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

इस से आप जानते हैं कि इस Media वर्ग के create विधि बुला है।
तो खुला Media.m (या CDVSound.m इस सटीक मामले में) जाने के लिए और और (आप cordova/plugins/org.apache.cordova.media/src/ios में मिल जाना चाहिए) create विधि के लिए देखो, अंत के साथ पूरे विधि संपुटित:

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

यह एक पृष्ठभूमि धागा पैदा करेगा "मूल" मीडिया निर्माण के लिए। यह इस तरह दिखना चाहिए:

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

का उपयोग करता हूं, यह बहुत स्पष्ट, विस्तृत प्रतिक्रिया के लिए धन्यवाद! लेकिन सवाल ... क्या यह *** आवश्यक *** है? एक्सकोड किसी भी प्लगइन कॉल के लिए यह चेतावनी प्रदान करता है जो 10ms से अधिक समय लेता है, जो बहुत लंबा नहीं है (मुझे नहीं लगता कि उपयोगकर्ता <100ms देरी देखेंगे)। क्या मैं इस चेतावनी को सुरक्षित रूप से अनदेखा कर सकता हूं, या क्या यह चेतावनी ऐप्पल को मेरे ऐप को अस्वीकार कर देगी? – mattstuehler

+0

आखिर में किसी ने रूट कारण को कैसे ढूंढें इस पर कदम प्रदान किए। –

+1

@mattstuehler यह कभी-कभी आवश्यक हो सकता है जब कोड अपेक्षा से अधिक समय लेता है या बस आपके यूआई को जमा करता है। –

-4

1.Open अपने Xcode प्रोजेक्ट।

2. सेटिंग टैब 2 "क्षमताओं" पर क्लिक करें।

3. "पृष्ठभूमि मोड" चालू करें।

4. "ऑडियो और एयरप्ले" चुनें।

हो गया.अब आप पृष्ठभूमि में संगीत चला सकते हैं।

पीएस: मैं एक्सकोड 6 और कॉर्डोवा 3.6.3

संबंधित मुद्दे