2012-08-17 4 views
2

iOS에서 PhoneGap (Cordova) 용 AudioEncode 플러그인을 사용하고 있습니다. 최신 버전의 Cordova에 대한 몇 줄을 업데이트 한 후 wav 파일을 m4a로 올바르게 인코딩 한 것으로 보입니다. Xcode의 콘솔에서 나는 참조 : 내가 전화의 파일 시스템을 볼 때PhoneGap 플러그인 : AudioEncode 성공 콜백이 호출되지 않았습니다.

AVAssetExportSessionStatusCompleted 
doing success callback 

는, WAV 파일이 실제로 M4A되고있다. 그러나 success 콜백 (파일을 서버에 업로드하는 위치)은 절대로 실행되지 않습니다.

-(void) doSuccessCallback:(NSString*)path { 
    NSLog(@"doing success callback"); 
    NSString* jsCallback = [NSString stringWithFormat:@"%@(\"%@\");", self.successCallback, path]; 
    [self writeJavascript: jsCallback]; 
    [self.successCallback release]; 
} 

응용 프로그램에서 내 코드는 다음과 같이 간다 : 나는 플러그인의 doSuccessCallback 기능을 믿고있어

function encodeSuccess (path) { 
    console.log('Audio encoded to M4A! Preparing to upload...') 
    // file transfer code... 
} 

console.log('Preparing to encode audio file...') 
window.plugins.AudioEncode.encodeAudio(entry.fullPath, encodeSuccess, fail) 

가 필요

업데이트 할,하지만 난 돈이 플러그인의 관련 코드 Objective C 또는 PhoneGap 플러그인에 대한 경험이 없으므로이 시점에서 고민하고 있습니다.

아이디어가 있으십니까? 목적 함수에서 C

UPDATE 내가 self.successCallback를 기록하려고 상기 게시하며 <null>로 기록. 그런 다음 주 encodeAudio 함수의 맨 위로 올라 갔고 self.successCallback ([arguments objectAtIndex:1])에 지정된 인수도 <null>으로 기록됩니다. 그래서 콜백이 main 함수로 성공적으로 전달되지 않는 것 같습니다.

어쩌면 누군가가 여기에 문제가 자리 수 있으며, AudioEncode.h 파일입니다

@interface AudioEncode : CDVPlugin { 
    NSString* successCallback; 
    NSString* failCallback; 
} 

@property (nonatomic, retain) NSString* successCallback; 
@property (nonatomic, retain) NSString* failCallback; 

- (void)encodeAudio:(NSArray*)arguments withDict:(NSDictionary*)options; 

답변

2

확인을, 나는 밀접하게 Cordova Plugin Development Guide의 기본 예제를 읽고이 알아 냈어. 문제는 최근에 변경된 cordova.exec()의 매개 변수 순서에있었습니다.

GitHub에 대한 플러그인 요청을 플러그인의 작동 버전과 함께 제출할 계획이지만, 현재 기본 해결책이 있습니다.

이 질문을하기 전에, 나는에 #import <PhoneGap/PGPlugin.h>에서 AudioEncode.h의 수입을 업데이트했다 :

#import <Cordova/CDVPlugin.h> 
#import <Cordova/CDVPluginResult.h> 

PGPlugin에 대한 언급도 CDVPlugin으로 업데이트해야하며, PhoneGapcordova 될 것이다.

여기에 문제의 핵심이있다 : (원래 플러그인 PhoneGap.exec()를 호출) AudioEncode.js, cordova.exec()에서 다음과 같이 호출 할 필요가있다 :

AudioEncode.prototype.encodeAudio = function(audioPath, successCallback, failCallback) { 
    cordova.exec(successCallback, failCallback, "AudioEncode", "encodeAudio", [audioPath]); 
}; 

이 같은 매개 변수를 주문하지 않는 경우, 콜백은 전달되지 않습니다 (audioPath는 ... 이었지만). 자세한 내용은 문서를 살펴보면 매개 변수는 먼저 두 콜백, 모듈 이름, 모듈 액션 및 마지막으로 추가 매개 변수의 배열이어야합니다.

그런 다음 같은 주요 encodeAudio 함수에서 매개 변수를 읽을해야합니다 : 성공에 대한 참조를 포함하고 콜백 실패 이제 하나의 콜백 객체가 있다고

self.callback = [[arguments objectAtIndex:0] retain]; 
NSString* audioPath = [arguments objectAtIndex:1]; 

참고. 즉, 플러그인이 successCallbackfailCallback에 대한 변수를 설정할 때마다 callback (예 : @synthesize callback) 만 필요합니다. 이것은 AudioEncode.h 파일에서도 @interface@property으로 선언됩니다.

실제로합니다 (doSuccessCallbackdoFailCallback 기능에서) & 반환 데이터를 콜백을 발사 할 때 지금,이 같은 CDVPluginResult를 사용해야합니다 :

CDVPluginResult* pluginResult = nil; 
NSString* javaScript = nil; 

pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:path]; 
javaScript = [pluginResult toSuccessCallbackString:self.callback]; 

[self writeJavascript: javaScript]; 
[self.callback release]; 

을 내가 GitHub의에 업데이트 된 모듈을 얻을 때까지,이 누구든지 플러그인 작동을 도와야합니다.

관련 문제