【发布时间】:2023-01-10 16:16:20
【问题描述】:
我正在尝试导出一个 swift 模块 according to react-native's documentation,但是当我尝试在我的 javascript 文件中调用此函数时遇到以下错误。我认为这个问题与在我的 swift 代码中调用 async 方法有关。所以我不确定在 react-native 中创建本机模块时如何从我的 swift 文件中导出和调用 async 方法。
这是包含我要导出的 async 方法的 AppleMusicAuth.swift 文件
//
// AppleMusicAuth.swift
//
//
//
import Foundation
import MusicKit
@available(iOS 15.0, *)
@objc(AppleMusicAuth)
class AppleMusicAuth: NSObject {
@objc
func getAuthStatus() async -> Void {
let response = await MusicAuthorization.request()
print(response)
}
}
与我的 AppleMusicAuth.m 文件一起使用 RCT_EXTERN_METHOD 方法将模块导出到我的 JS 应用程序
//
// AppleMusicAuth.m
//
//
//
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
@interface RCT_EXTERN_MODULE(AppleMusicAuth, NSObject)
RCT_EXTERN_METHOD(getAuthStatus)
@end
以及导入调用模块和方法的Javascript文件
import { NativeModules } from 'react-native';
const { AppleMusicAuth } = NativeModules;
export default AppleMusicAuth;
import React from 'react';
import {Button} from 'react-native';
import AppleMusicAuth from '../nativeModules/AppleMusicAuth';
type Props = {};
const App: React.FC<Props> = () => {
return (
<Button
onPress={() => {
AppleMusicAuth.getAuthStatus();
}}
title="Button"
color="#841584"
/>
);
};
export default App;
【问题讨论】:
-
感觉这个问题需要更多关注,目前还没有对 MusicKit 的 objective c 支持,所以 swift 是唯一的选择,但据我所知,没有办法在 RN 模块中使用 async await 我觉得 PromisesSwift 可能值得研究但不当然。
标签: javascript reactjs swift objective-c react-native