Expo集成react-native-msal初始化AAD B2C时遇类型错误
我正在使用Expo 4.5.2和react-native-msal 4.0.0,已从react-native-msal示例目录的b2cClient.ts中复制B2CClient类,初始化配置与示例的App.tsx一致。我的配置如下:
auth: { clientId: '<CLIENT_ID>', authorityBase: 'https://example.b2clogin.com/tfp/example.onmicrosoft.com', policies: { signInSignUp: 'B2C_1_mySignupPolicy', passwordReset: 'B2C_1_myPasswordResetPolicy', }, redirectUri: Platform.select({ android: 'msauth://com.company.app/l5rSw0yVmvlj7l5rSw0yWAYk5tfVb2j%2F', default: undefined, }), },
我已完成Expo的额外配置步骤,但编辑器提示警告:Failed to resolve plugin for module "react-native-msal"(使用的版本与示例一致)。虽然仍能构建应用,但运行b2cClient.init()时出现错误:[TypeError: null is not an object (evaluating '_nativeModule.default.createPublicClientApplication')]
该包本应支持Expo且配置与示例一致,请问如何解决?
完成Expo预构建
react-native-msal依赖原生模块,Expo裸工作流必须完成预构建才能正确集成。执行命令:expo prebuild --clean预构建完成后重新启动项目,确保原生模块被正确注入。
检查Expo配置文件
确认app.json或app.config.js中已正确添加react-native-msal插件配置,示例如下:{ "expo": { "plugins": [ [ "react-native-msal", { "clientId": "<你的CLIENT_ID>", "android": { "redirectUri": "msauth://com.company.app/l5rSw0yVmvlj7l5rSw0yWAYk5tfVb2j%2F" } } ] ] } }替换为你实际的clientId和redirectUri后,重新执行预构建。
验证Android原生配置
打开android/app/src/main/AndroidManifest.xml,检查是否已添加MSAL的intent-filter,注意path中的%2F要替换为实际的/:<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="msauth" android:host="com.company.app" android:path="/l5rSw0yVmvlj7l5rSw0yWAYk5tfVb2j/" /> </intent-filter>清除缓存并重装依赖
- 删除
node_modules和package-lock.json/yarn.lock文件 - 执行
npm install或yarn install重装依赖 - 清除Expo缓存并重启项目:
expo r -c
- 删除
确认版本兼容性
Expo 4.5.2对应React Native 0.68.x版本,检查react-native-msal 4.0.0是否支持该RN版本。若存在兼容性问题,尝试调整包版本至匹配范围。
内容的提问来源于stack exchange,提问作者purple_cwsh

