PhoneGap插件:从未调用过AudioEncode成功回调

时间:2012-08-17 14:39:18

标签: objective-c ios cordova phonegap-plugins

我在iOS上使用PhoneGap(Cordova)的AudioEncode插件。为更新版本的Cordova更新几行之后,它似乎正确地将wav文件编码为m4a。在Xcode控制台中,我看到:

AVAssetExportSessionStatusCompleted
doing success callback

当我查看手机上的文件系统时,wav文件确实变成了m4a。但是,成功回调(我将文件上传到服务器)永远不会运行。这是插件中的相关代码:

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

我在应用中的代码是这样的:

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)

我假设插件中的doSuccessCallback函数需要更新,但我没有使用Objective C或PhoneGap插件的经验,所以我在这一点上陷入困​​境。

有什么想法吗?

更新

在上面发布的Objective C函数中,我尝试记录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;

1 个答案:

答案 0 :(得分:2)

好的,我通过仔细阅读Cordova Plugin Development Guide中的基本示例来解决这个问题。问题在于cordova.exec()的参数排序,最近必须更改。

我计划在GitHub上提交一个带有插件工作版本的拉取请求,但是现在,这是基本的解决方案。

在提出这个问题之前,我已将AudioEncode.h中的导入从#import <PhoneGap/PGPlugin.h>更新为:

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

PGPlugin的任何引用也应更新为CDVPluginPhoneGap应为cordova

以下是问题的关键:在AudioEncode.js中,cordova.exec()(原始插件调用PhoneGap.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声明。

现在,当实际触发回调&amp;返回数据(在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上获得更新的模块,这应该可以帮助任何人使插件正常工作。