gpt4 book ai didi

objective-c - PhoneGap 插件 : AudioEncode success callback never called

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:24 25 4
gpt4 key购买 nike

我在 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;

最佳答案

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

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

在问这个问题之前,我已经从 #import <PhoneGap/PGPlugin.h> 更新了 AudioEncode.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];

请注意,现在只有一个回调对象,其中包含对成功和失败回调的引用。这意味着每当插件为 successCallback 设置变量时和 failCallback , 你现在只需要 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 之前,这应该可以帮助任何人使插件正常工作。

关于objective-c - PhoneGap 插件 : AudioEncode success callback never called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com