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

Posted

技术标签:

【中文标题】PhoneGap 插件:从未调用过 AudioEncode 成功回调【英文标题】:PhoneGap plugin: AudioEncode success callback never called 【发布时间】:2012-08-17 14:39:18 【问题描述】:

我在 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>。所以,在我看来,回调没有成功地传递到主函数中。

这是 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】:

好的,我通过仔细阅读Cordova Plugin Development Guide 中的基本示例了解了这一点。问题在于cordova.exec() 的参数顺序,这一定是最近发生了变化。

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

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

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

PGPlugin 的任何引用也应更新为CDVPlugin,并且PhoneGap 应变为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

现在,当实际触发回调并返回数据时(在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 之前,这应该可以帮助任何人使插件正常工作。

【讨论】:

以上是关于PhoneGap 插件:从未调用过 AudioEncode 成功回调的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap + Facebook 插件:为 iOs 准备的 Xcodeproj 包

如何从 InAppBrowser 中调用 Phonegap 插件?

从 AngularJS 控制器调用 phonegap 插件

PhoneGap - exec() 调用未知插件

然后调用时延迟对象和phonegap插件的问题

PhoneGap Windows8 的自定义插件将调用 c# 代码