我在 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 .
现在,当实际触发回调并返回数据时(在 doSuccessCallback 和 doFailCallback 函数中),您需要使用 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/
类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
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我正在尝试为我的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
您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio
在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中
如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
我们正在使用Vagrant进行部署,我们最终希望将此集群部署在Rackspace上。vagrant-rackspace插件是一个自然的选择,但它有一些错误,这些错误未包含在最新的0.1.1版本中(notablythatvagrantprovisiondoesn'twork)。我已经在我的personalfork中解决了这个问题通过合并其他人的工作来对存储库进行改造。是否可以从github安装vagrant插件?显而易见的事情没有奏效:[unix]$vagrantplugininstallvagrant-rackspace--plugin-sourcehttps://github.com