我正在尝试为phonegap / cordova编写一个插件,允许在通过电话中断时恢复音频。我正在使用AVAudioSesionInterruptionNotification,它运行良好。但是,我需要能够将一个字符串发送到我的事件处理程序,但我无法弄清楚如何。
我在这里设置一个事件监听器并从javascript层调用它:
- (void) startListeningForAudioSessionEvent:(CDVInvokedUrlCommand*)command{
NSString* myImportantString = [command.arguments objectAtIndex:0];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAudioSessionEvent:) name:AVAudioSessionInterruptionNotification object:nil];
}
我在这里处理这个事件:
- (void) onAudioSessionEvent:(NSNotification *)notification
{
if([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeEnded]]){
//do stuff using myImportantString
}
}
无法弄清楚如何将myImportantString传递给onAudioSessionEvent。我知道Objective-C很少(因此我使用了cordova),所以请回复,好像你正在和孩子说话一样。谢谢!
顺便说一句,我只是想在这里找到的cordova媒体插件上添加几种方法:https://github.com/apache/cordova-plugin-media/tree/master/src/ios
所以上面的代码是我的.m文件的全部减去这部分
@implementation CDVSound (extendedCDVSound)
答案 0 :(得分:1)
像这样:
// near the top of MyController.m (above @implementation)
@interface MyController ()
@property NSString *myImportantString;
@end
// inside the implementation
- (void) startListeningForAudioSessionEvent:(CDVInvokedUrlCommand*)command{
self.myImportantString = [command.arguments objectAtIndex:0];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAudioSessionEvent:) name:AVAudioSessionInterruptionNotification object:nil];
}
- (void) onAudioSessionEvent:(NSNotification *)notification
{
if([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeEnded]]){
//do stuff using self.myImportantString
}
}
答案 1 :(得分:1)
使用基于块的API添加观察者可能更容易:
- (void) startListeningForAudioSessionEvent:(CDVInvokedUrlCommand*)command{
NSString* myImportantString = [command.arguments objectAtIndex:0];
id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AVAudioSessionInterruptionNotification
object:nil
queue:nil
usingBlock:^(NSNotification *notification){
if([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeEnded]]){
//do stuff using myImportantString; you could even skip the use of that
//temporary variable and directly use [command.arguments objectAtIndex:0],
//assuming that command and command.arguments are immutable so that you
//can rely on them still being the same
}
}];
}
通过使用基于块的API,您可以直接引用在发布通知时调用的代码中添加观察者时范围内的任何变量。
当您完成观察时,您需要删除observer
作为通知的观察者。