英文:
React Native Allowing Haptics in iOS
问题
我想测试我的React Native项目中的allowHapticsAndSystemSoundsDuringRecording
变量。我知道有一个实例方法可以用来更改这个值,但我不确定如何在我为测试创建的.mm
文件中使用它。我对Objective C或Swift不太熟悉,所以这使事情变得更加困难。在.mm
文件中只是输入setAllowHapticsAndSystemSoundsDuringRecording(true);
会引发错误,因为该方法未被识别。这是否是我需要从某处导入的内容?我理解我可能需要创建某个实例,但我不确定应该是什么。
英文:
I want to test the allowHapticsAndSystemSoundsDuringRecording
variable in my react native project. I know that there is an instance method that allows you to change this value but I'm not sure how to use it in the .mm
file I've created for testing. I'm not familiar with Objective C or Swift so it makes things a bit more difficult. Just typing out setAllowHapticsAndSystemSoundsDuringRecording(true);
in a .mm
file throws an error cos the method is not recognized. Is this something I need to import from somewhere? I get that I probably have to create an instance of something but I'm not sure what that would be.
答案1
得分: 2
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';
// 在组件或函数内部
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或社区中可用的库来完成你的需求。
英文:
setAllowHapticsAndSystemSoundsDuringRecording
is a method that is associated with the AVAudioSession
class in iOS, and is not a React Native function or something you can directly use in a React Native JavaScript file.
The usage of this method means you're diving into native code, either Objective-C or Swift, and you have to be familiar with how to bridge between JavaScript in React Native and the native code. You're correct in understanding that this method needs to be called on an instance of AVAudioSession
.
Here's a rough example of how you might use this in Objective-C, in the .mm
file:
First, create a new file named MyAudioSessionManager.m in the ios folder of your React Native project.
// 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
Then create the actual implementation of 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
This is a simple usage and does not handle all possible errors. The actual implementation should take care to handle any possible errors properly.
Finally, to expose this functionality to React Native, you'll need to use React Native's bridging capabilities. You can create a new native module or method, expose it to React Native, and then call it from your JavaScript code.
Example:
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));
You can read more about native modules in React Native in the official React Native documentation: Native Modules (iOS).
Remember, manipulating AVAudioSession directly is a relatively advanced operation that requires careful error handling and understanding of iOS audio behavior, so only do this if you're sure it's necessary. In many cases, you might be able to accomplish what you need using higher-level APIs provided by React Native or by libraries available in the community.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论