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

时间:2017-07-25 05:17:06

标签: ios cordova ionic2 cordova-plugins

我更新到Ionic 3.5,之后我收到此错误,当我尝试cordova build ios时:

Invalid data, chunk must be a string or buffer, not object

没有解释为什么会发生此错误。我用Cordova 7.0.1和6.5.0尝试了这两个。有趣的是,它适用于Windows机器,但不适用于Mac。我只在Mac上收到错误。我感谢任何见解或帮助。

 ionic info

全球套餐:

@ionic/cli-utils : 1.5.0
Cordova CLI      : 7.0.1
Ionic CLI        : 3.5.0

本地包裹:

@ionic/app-scripts              : 1.3.7
@ionic/cli-plugin-cordova       : 1.4.1
@ionic/cli-plugin-ionic-angular : 1.3.2
Cordova Platforms               : android 6.2.3
Ionic Framework                 : ionic-angular 3.5.3

系统:

Node       : v7.10.0
OS         : Windows 10
Xcode      : not installed
ios-deploy : not installed
ios-sim    : not installed
npm        : 4.6.1

4 个答案:

答案 0 :(得分:5)

@Ari如果你仍然遇到这个问题,这就是我为解决这个问题所做的。

我必须编辑文件" fcm_config_files_process.js"位于文件夹" plugins / cordova-plugin-fcm / scripts /":

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

由于某些未知原因,在构建项目时,此行(42)抛出错误"无效数据,块必须是字符串或缓冲区,而不是对象"所以我做的是评论该行,然后手动复制文件" GoogleService-Info.plist" to" platforms / ios /" +名称+" /资源/"

希望得到这个帮助。

答案 1 :(得分:3)

我从github issue之一获得了修复。它只需要正确的strings.xml路径。

无需降级cordova或cordova-android

解决方法是替换其中的代码 /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('(\r\n|\n|\r)[ \t]*(\r\n|\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;
    }
}

要解决此问题,请执行以下操作:

请确保您已将上述文件复制到“ plugins”文件夹中,因为cordova将所有cordova-plugins从node_modules目录复制到了plugins目录,

如果在修改文件之前已经添加了平台 plugins/cordova-plugin-fcm/scripts/fcm_config_files_process.js,您需要删除平台并再次添加。

答案 2 :(得分:0)

我们遇到此错误,因为Apple的开发推送证书已过时。我们已经更新了 - 它起作用了。

答案 3 :(得分:0)

在创建Ionic 2应用程序时删除默认添加的ios平台,然后再次添加。
并删除并添加“ cordova-fcm-plugin”。
离子平台rm ios
离子平台添加ios