swift React Native允许iOS中的触觉

a8jjtwal  于 2023-06-04  发布在  Swift
关注(0)|答案(1)|浏览(230)

我想在react native项目中测试allowHapticsAndSystemSoundsDuringRecording变量。我知道有一个instance method允许你改变这个值,但是我不确定如何在我为测试而创建的.mm文件中使用它。我不熟悉Objective C或Swift,所以这让事情变得有点困难。在.mm文件中输入setAllowHapticsAndSystemSoundsDuringRecording(true);会抛出错误,因为该方法无法识别。这是我需要从某个地方导入的东西吗?我知道我可能要创建一个示例,但我不确定是什么。

c0vxltue

c0vxltue1#

setAllowHapticsAndSystemSoundsDuringRecording是一个与iOS中的AVAudioSession类关联的方法,它不是一个React Native函数,也不是可以直接在React Native JavaScript文件中使用的函数。
使用这个方法意味着你要深入到原生代码中,无论是Objective-C还是Swift,你必须熟悉如何在React Native中的JavaScript和原生代码之间建立桥梁。您正确地理解了需要在AVAudioSession的示例上调用此方法。
下面是一个在Objective-C中如何使用它的粗略示例,在.mm文件中:
首先,在React Native项目的ios文件夹中创建一个名为MyAudioSessionManager.m的新文件。

// MyAudioSessionManager.m
#import <React/RCTBridgeModule.h>
#import <AVFoundation/AVFoundation.h>

@interface RCT_EXTERN_MODULE(MyAudioSessionManager, NSObject)
RCT_EXTERN_METHOD(setAllowHapticsAndSystemSounds:(BOOL)allow resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
@end

然后创建MyAudioSessionManager的实际实现:

// MyAudioSessionManager.mm
#import "MyAudioSessionManager.h"

@implementation MyAudioSessionManager

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(setAllowHapticsAndSystemSounds:(BOOL)allow resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
  AVAudioSession *session = [AVAudioSession sharedInstance];
  NSError *error;

  if ([session setCategory:AVAudioSessionCategoryPlayAndRecord mode:AVAudioSessionModeDefault options:AVAudioSessionCategoryOptionAllowBluetoothA2DP | AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionAllowAirPlay error:&error]) {
    if (@available(iOS 13.0, *)) {
      [session setAllowHapticsAndSystemSoundsDuringRecording:allow error:&error];
    } else {
      reject(@"Not available", @"setAllowHapticsAndSystemSoundsDuringRecording is not available for this iOS version", error);
      return;
    }

    [session setActive:YES error:nil];
    resolve(@(YES));
  } else {
    reject(@"Error", @"Error setting up audio session category", error);
  }
}

@end

这是一种简单的用法,并不能处理所有可能的错误。实际的实现应该注意正确地处理任何可能的错误。
最后,要将此功能暴露给React Native,您需要使用React Native的桥接功能。你可以创建一个新的原生模块或方法,将其暴露给React Native,然后从JavaScript代码中调用它。
示例:

import { NativeModules } from 'react-native';

// Inside a component or function
NativeModules.MyAudioSessionManager.setAllowHapticsAndSystemSounds(true)
  .then(() => console.log('Haptics and System Sounds set successfully'))
  .catch((error) => console.error('Error setting Haptics and System Sounds:', error));

你可以在React Native官方文档中阅读更多关于React Native中的原生模块:Native Modules (iOS)
请记住,直接操作 AVAudioSession 是一项相对高级的操作,需要仔细处理错误并了解iOS音频行为,因此仅在您确定有必要时才执行此操作。在许多情况下,您可以使用React Native或社区中可用的库提供的更高级别的API来完成所需的工作。

相关问题