看起来你需要创建一个expo配置插件,将元数据和服务值添加到AndroidManifest.xml中,还需要复制一个文件。
我将使用提到的https://github.com/cristianoccazinsp/react-native-foreground-service库安装步骤作为示例。
首先,您需要在项目中开始使用expo prebuild,它公开了本地文件而不需要从expo中弹出,并让我们保留所有expo工具,您可以忽略存储库中的本机文件夹,因为它们将在每次构建时重新生成。
通常,我会在package.json脚本中拥有类似这样的东西,以便更轻松地访问:
"eas:build": "npx expo prebuild && eas build --platform=android",
"prebuild": "npx expo prebuild",
您可以通过运行npx expo prebuild
来单独测试预构建,并检查是否创建了本机iOS和Android文件夹。
接下来,让我们在项目根目录中创建一个configPlugins
文件夹以获取所需的文件。
接下来,我们需要创建一个Expo配置插件,它允许我们在Expo预构建步骤期间编辑和复制本机文件。
configPlugins/withForegroundService.ts
import { AndroidConfig, ConfigPlugin, withAndroidManifest } from '@expo/config-plugins'
import path from 'path'
import { Paths } from '@expo/config-plugins/build/android'
import fs from 'fs'
export const withForegroundService: ConfigPlugin = (config) => {
config = withAndroidManifest(config, async (config) => {
const mainApplication = AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults)
AndroidConfig.Manifest.addMetaDataItemToMainApplication(
mainApplication,
'com.zinspector.foregroundservice.notification_channel_name',
'zInspector Service',
'value',
)
AndroidConfig.Manifest.addMetaDataItemToMainApplication(
mainApplication,
'com.zinspector.foregroundservice.notification_channel_description',
'zInspector Service.',
'value',
)
AndroidConfig.Manifest.addMetaDataItemToMainApplication(
mainApplication,
'com.zinspector.foregroundservice.notification_color',
'@color/orange',
'resource',
)
mainApplication.service = []
mainApplication.service.push({
$: {
'android:name': 'com.zinspector.foregroundservice.ForegroundService',
},
})
mainApplication.service.push({
$: {
'android:name': 'com.zinspector.foregroundservice.ForegroundServiceTask',
},
})
const srcFilePath = path.join(__dirname, 'color.xml')
const resFilePath = path.join(
await Paths.getResourceFolderAsync(config.modRequest.projectRoot),
'values',
'color.xml',
)
const res_dir = path.resolve(resFilePath, '..')
if (!fs.existsSync(res_dir)) {
await fs.promises.mkdir(res_dir)
}
try {
await fs.promises.copyFile(srcFilePath, resFilePath)
} catch (e) {
throw e
}
return config
})
return config
}
接下来,按照库的要求创建color.xml文件。
configPlugins/color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="orange" type="color">#FF4500
</item>
<integer-array name="androidcolors">
<item>@color/orange</item>
</integer-array>
</resources>
现在我们需要告诉 app.config.ts 关于这个插件。你也可以使用 app.json,但是 withForegroundService.ts
需要是一个 .js 文件,并且将被注册如下:plugins: [['./configPlugins/withForegroundService']]
。
app.config.ts
import { ExpoConfig, ConfigContext } from '@expo/config'
import { withForegroundService } from './configPlugins/withForegroundService'
export default ({ config }: ConfigContext): ExpoConfig => ({
...config,
...
...
plugins: [
withForegroundService,
],
})
要测试它,只需运行npx expo prebuild
,如果一切设置正确,您应该在android/app/src/main/AndroidManifest.xml
中看到更改,并且color.xml
应该被复制到android/app/src/main/res/values/color.xml
现在唯一需要做的就是配置前台任务并运行npx expo prebuild && eas build --platform=android
我测试了这种方法,并成功让前台服务通知出现。
![foreground service notification](https://istack.dev59.com/81So1m.webp)
希望这可以帮助到您!