草庐IT

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

coder 2024-01-21 原文

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

有关objective-c - PhoneGap 插件 : AudioEncode success callback never called的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  3. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  4. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  7. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  8. ruby - 你会如何在 Ruby 中表达成语 "with this object, if it exists, do this"? - 2

    在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中

  9. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

    如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

  10. ruby - vagrant 从 github 安装插件 - 2

    我们正在使用Vagrant进行部署,我们最终希望将此集群部署在Rackspace上。vagrant-rackspace插件是一个自然的选择,但它有一些错误,这些错误未包含在最新的0.1.1版本中(notablythatvagrantprovisiondoesn'twork)。我已经在我的personalfork中解决了这个问题通过合并其他人的工作来对存储库进行改造。是否可以从github安装vagrant插件?显而易见的事情没有奏效:[unix]$vagrantplugininstallvagrant-rackspace--plugin-sourcehttps://github.com

随机推荐