无效数据,块必须是字符串或缓冲区,而不是对象 - 离子和火碱



我目前正在我的MAC上设置我的离子应用程序,但是我一直遇到一个问题,当我使用Cordova版本8.0.0和android版本6.4.0添加cordova-plugin-fcm时,我收到以下错误:

无效数据,块必须是字符串或缓冲区,而不是对象

请注意,我的应用程序没有安装 ios 平台。另外,由于我安装了FCM插件,因此我已将google-services.json文件添加到项目的根目录中。

最后,最奇怪的是,当我使用PC时,我的项目运行良好。但是,在我的MAC(我一直使用)上,不适用于我的项目。

知道为什么这不起作用。仅供参考 - 我在网上尝试了很多解决方案

  • 卸载并重新安装科尔多瓦
  • 科尔多瓦版本 7.1.0
  • 从 cordova-plugin-fcm 文件夹fcm_config_files_process.js文件中注释掉以下行:

-

//fs.writeFileSync("platforms/ios/" + name + "/Resources/GoogleService-Info.plist", contents)

知道我做错了什么吗?

通过cordova-plugin-fcm Github问题提供的解决方案根据100多个用户的赞成票和评论工作。

感谢Cesar Cruz的提及。 +赞成票

它适用于Ionic,就像对我来说它是我的Ionic项目的解决方案一样。

我的解决方案摘录:https://github.com/fechanique/cordova-plugin-fcm/issues/213#issuecomment-357162384

解决方法是替换/cordova-plugin-fcm/scripts/fcm_config_files_process.js 中的代码,如下所示:

#!/usr/bin/env node
'use strict';
var fs = require('fs');
var path = require('path');
fs.ensureDirSync = function (dir) {
if (!fs.existsSync(dir)) {
dir.split(path.sep).reduce(function (currentPath, folder) {
currentPath += folder + path.sep;
if (!fs.existsSync(currentPath)) {
fs.mkdirSync(currentPath);
}
return currentPath;
}, '');
}
};
var config = fs.readFileSync('config.xml').toString();
var name = getValue(config, 'name');
var IOS_DIR = 'platforms/ios';
var ANDROID_DIR = 'platforms/android';
var PLATFORM = {
IOS: {
dest: [
IOS_DIR + '/' + name + '/Resources/GoogleService-Info.plist',
IOS_DIR + '/' + name + '/Resources/Resources/GoogleService-Info.plist'
],
src: [
'GoogleService-Info.plist',
IOS_DIR + '/www/GoogleService-Info.plist',
'www/GoogleService-Info.plist'
]
},
ANDROID: {
dest: [
ANDROID_DIR + '/google-services.json',
ANDROID_DIR + '/app/google-services.json',
],
src: [
'google-services.json',
ANDROID_DIR + '/assets/www/google-services.json',
'www/google-services.json'
],
stringsXml: ANDROID_DIR + '/app/src/main/res/values/strings.xml'
}
};
// Copy key files to their platform specific folders
if (directoryExists(IOS_DIR)) {
copyKey(PLATFORM.IOS);
}
if (directoryExists(ANDROID_DIR)) {
copyKey(PLATFORM.ANDROID, updateStringsXml)
}
function updateStringsXml(contents) {
var json = JSON.parse(contents);
var strings = fs.readFileSync(PLATFORM.ANDROID.stringsXml).toString();
// strip non-default value
strings = strings.replace(new RegExp('<string name="google_app_id">([^@<]+?)</string>', 'i'), '');
// strip non-default value
strings = strings.replace(new RegExp('<string name="google_api_key">([^@<]+?)</string>', 'i'), '');
// strip empty lines
strings = strings.replace(new RegExp('(rn|n|r)[ t]*(rn|n|r)', 'gm'), '$1');
// replace the default value
strings = strings.replace(new RegExp('<string name="google_app_id">([^<]+?)</string>', 'i'), '<string name="google_app_id">' + json.client[0].client_info.mobilesdk_app_id + '</string>');
// replace the default value
strings = strings.replace(new RegExp('<string name="google_api_key">([^<]+?)</string>', 'i'), '<string name="google_api_key">' + json.client[0].api_key[0].current_key + '</string>');
fs.writeFileSync(PLATFORM.ANDROID.stringsXml, strings);
}
function copyKey(platform, callback) {
for (var i = 0; i < platform.src.length; i++) {
var file = platform.src[i];
if (fileExists(file)) {
try {
var contents = fs.readFileSync(file).toString();
try {
platform.dest.forEach(function (destinationPath) {
var folder = destinationPath.substring(0, destinationPath.lastIndexOf('/'));
fs.ensureDirSync(folder);
fs.writeFileSync(destinationPath, contents);
});
} catch (e) {
// skip
}
callback && callback(contents);
} catch (err) {
console.log(err)
}
break;
}
}
}
function getValue(config, name) {
var value = config.match(new RegExp('<' + name + '>(.*?)</' + name + '>', 'i'));
if (value && value[1]) {
return value[1]
} else {
return null
}
}
function fileExists(path) {
try {
return fs.statSync(path).isFile();
} catch (e) {
return false;
}
}
function directoryExists(path) {
try {
return fs.statSync(path).isDirectory();
} catch (e) {
return false;
}
}
  1. 确保您已将上述文件复制到"插件"文件夹中 科尔多瓦从目录中复制node_modules所有科尔多瓦插件 到插件目录。
  2. 如果您在修改文件之前已经添加了平台 plugins/cordova-plugin-fcm/scripts/fcm_config_files_process.js,你 需要删除平台并再次添加。

看看@ketanyekale的解决方案 at https://github.com/fechanique/cordova-plugin-fcm/issues/213#issuecomment-357162384 它可能有用,尽管不适用于离子。

也许您可以获得有关如何解决问题的线索。

它在Cordova/phonegap项目中为我工作。

相关内容

  • 没有找到相关文章

最新更新