Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c PhoneGap插件:AudioEncode成功回调从未调用_Objective C_Ios_Cordova_Phonegap Plugins - Fatal编程技术网

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

Objective c PhoneGap插件:AudioEncode成功回调从未调用,objective-c,ios,cordova,phonegap-plugins,Objective C,Ios,Cordova,Phonegap Plugins,我正在iOS上使用PhoneGap(Cordova)的AudioEncode插件。在为新版本的Cordova更新了几行之后,它似乎正确地将wav文件编码为m4a。在Xcode控制台中,我看到: AVAssetExportSessionStatusCompleted doing success callback 当我在手机上查看文件系统时,wav文件确实变成了m4a。但是,成功回调(我将文件上载到服务器的地方)永远不会运行。这是插件中的相关代码: -(void) doSuccessCallbac

我正在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)
AudioEncode.prototype.encodeAudio = function(audioPath, successCallback, failCallback) {
    cordova.exec(successCallback, failCallback, "AudioEncode", "encodeAudio", [audioPath]);
};
self.callback = [[arguments objectAtIndex:0] retain];
NSString* audioPath = [arguments objectAtIndex:1];
CDVPluginResult* pluginResult = nil;
NSString* javaScript = nil;

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

[self writeJavascript: javaScript];
[self.callback release];
我假设插件中的
doSuccessCallback
函数需要更新,但我没有使用Objective C或PhoneGap插件的经验,所以我在这一点上陷入了困境

有什么想法吗

更新

在上面发布的Objective C函数中,我尝试记录了
self.successCallback
,它记录为
。然后我转到主
encodeAudio
函数的顶部,分配给
self.successCallback
[arguments objectAtIndex:1]
)的参数也记录为
。因此,在我看来,回调没有成功地传递到主函数中

这是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;

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

我计划在GitHub上提交一个pull请求,并提供一个插件的工作版本,但现在,这里是基本的解决方案

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

#import <Cordova/CDVPlugin.h>
#import <Cordova/CDVPluginResult.h>
如果您没有像这样对参数进行排序,回调将不会传入(尽管audioPath是…)。查看文档了解更多详细信息,但参数必须是两个回调,首先是模块名称、模块操作,最后是一个额外参数数组

然后,您需要读取主encodeAudio函数中的参数,如下所示:

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)
AudioEncode.prototype.encodeAudio = function(audioPath, successCallback, failCallback) {
    cordova.exec(successCallback, failCallback, "AudioEncode", "encodeAudio", [audioPath]);
};
self.callback = [[arguments objectAtIndex:0] retain];
NSString* audioPath = [arguments objectAtIndex:1];
CDVPluginResult* pluginResult = nil;
NSString* javaScript = nil;

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

[self writeJavascript: javaScript];
[self.callback release];
请注意,现在只有一个回调对象,其中包含对成功和失败回调的引用。这意味着每当插件为
successCallback
failCallback
设置变量时,您现在只需要
callback
(例如
@synthetic callback
)。这也在AudioEncode.h文件中用
@接口
@属性
声明

现在,当实际触发回调并返回数据时(在
doSuccessCallback
doFailCallback
函数中),您需要使用
CDVPluginResult
,如下所示:

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)
AudioEncode.prototype.encodeAudio = function(audioPath, successCallback, failCallback) {
    cordova.exec(successCallback, failCallback, "AudioEncode", "encodeAudio", [audioPath]);
};
self.callback = [[arguments objectAtIndex:0] retain];
NSString* audioPath = [arguments objectAtIndex:1];
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上安装更新的模块之前,这应该可以帮助任何人让插件正常工作