2

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>た。それから main 関数の先頭まで行って、( )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;
4

1 に答える 1

2

わかりました、 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 は...)。詳細についてはドキュメントを参照してください。ただし、パラメーターは最初に 2 つのコールバック、モジュール名、モジュール アクション、最後に追加パラメーターの配列である必要があります。

次に、次のようにメインの encodeAudio 関数のパラメーターを読み込む必要があります。

self.callback = [[arguments objectAtIndex:0] retain];
NSString* audioPath = [arguments objectAtIndex:1];

ここでは、成功コールバックと失敗コールバックへの参照を含むコールバック オブジェクトが 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 にアップするまで、これは誰でもプラグインを機能させるのに役立つはずです。

于 2012-08-19T23:54:02.850 に答える