无法使用 cordova-plugin-fcm 插件向 iOS 生产添加推送通知权利
Unable to add push notifications entitlement to iOS production with cordova-plugin-fcm plugin
我正在尝试使用 Visual Studio 2017 在空白的 Cordova 应用程序中安装 cordova-plugin-fcm 插件。
我安装插件并添加 google-plist 文件等。
在我的 mac 我有 xcode 7.2.1.
当我从 visual studio 构建一个 ipa 时,它会生成一个 IPA,但它没有启用推送通知。
我已将所有源代码(包括插件文件夹)添加到 bitbucket。 Link 下面;
https://bitbucket.org/quintonn/pushnotificationtest
要在 iphone 上启用推送通知,我缺少什么?
仅供参考,我可以很容易地在 android 上使用它。
我不想必须打开 xcode 才能启用推送通知。我知道可以直接从 Visual Studio 使用挂钩或 xcconfig 或 config.xml。但我就是无法让它工作,我已经花了大约 3 个星期现在无法让它工作。而且我只是感觉在黑暗中,因为所有在线阅读 material 都是针对不同版本的 cordova,或 visual studio,或 xcode,或 phonegap 或 ionic 或其他。
我已经在这个问题上花费了很多很多....小时。
我想出了一个 cordova after_prepare 钩子来解决我在 XCode 7 和 8 上的问题。
这是...
"use strict";
var fs = require('fs');
var path = require('path');
var xcode = require('xcode');
module.exports = function (context)
{
var encoding = 'utf-8';
var plist = fs.readFileSync(path.resolve(__dirname, "../GoogleService-Info.plist"), encoding);
fs.writeFileSync(path.resolve(__dirname, "../platforms/ios/GoogleService-Info.plist"), plist, encoding);
var projectPath = path.resolve(__dirname, "../platforms/ios/APP NAME.xcodeproj/project.pbxproj");
var pbxFile = fs.readFileSync(projectPath, encoding);
var proj = new xcode.project(projectPath);
proj = proj.parseSync();
var pbxGroupKey = proj.findPBXGroupKey({
name: "Resources"
});
proj.removeResourceFile('GoogleService-Info.plist', {}, pbxGroupKey);
proj.addResourceFile('GoogleService-Info.plist', {}, pbxGroupKey);
proj.addBuildProperty('"CODE_SIGN_IDENTITY[sdk=iphoneos*]"', '"iPhone Distribution"', 'Release');
proj.addBuildProperty('DEVELOPMENT_TEAM', 'XXXXXXXX', 'Release');
proj.addBuildProperty('PROVISIONING_PROFILE', "XXXXXXXX-XXXXXXXX-XXXX-XXXX-XXXXXXXX", 'Release');
proj.addBuildProperty('PROVISIONING_PROFILE_SPECIFIER', '"NAME OF PROFILE"', 'Release');
proj.addBuildProperty('TARGETED_DEVICE_FAMILY', '"1,2"', 'Release');
proj.addTargetAttribute("DevelopmentTeam", "XXXXXXXX");
var pushEntitlement = "{com.apple.Push ={enabled = 1;};}";
proj.addTargetAttribute("SystemCapabilities", pushEntitlement);
/*var attributes = proj.getFirstProject()['firstProject']['attributes'];
if (attributes['TargetAttributes'] === undefined)
{
attributes['TargetAttributes'] = {};
}
var target = proj.getFirstTarget();
if (attributes['TargetAttributes'][target.uuid] === undefined)
{
attributes['TargetAttributes'][target.uuid] = {};
}
attributes['TargetAttributes'][target.uuid]["SystemCapabilities"] = "{com.apple.Push ={enabled = 1;};}";
*/
fs.writeFileSync(projectPath, proj.writeSync());
fs.writeFileSync(path.resolve(__dirname, "../platforms/ios/APP NAME/Resources/GoogleService-Info.plist"), plist, encoding);
fs.writeFileSync(path.resolve(__dirname, "../platforms/ios/APP NAME/Resources/Resources/GoogleService-Info.plist"), plist, encoding);
};
请记住更新您的 APP 名称、配置文件名称和团队 ID。
我正在尝试使用 Visual Studio 2017 在空白的 Cordova 应用程序中安装 cordova-plugin-fcm 插件。 我安装插件并添加 google-plist 文件等。 在我的 mac 我有 xcode 7.2.1.
当我从 visual studio 构建一个 ipa 时,它会生成一个 IPA,但它没有启用推送通知。 我已将所有源代码(包括插件文件夹)添加到 bitbucket。 Link 下面; https://bitbucket.org/quintonn/pushnotificationtest
要在 iphone 上启用推送通知,我缺少什么? 仅供参考,我可以很容易地在 android 上使用它。
我不想必须打开 xcode 才能启用推送通知。我知道可以直接从 Visual Studio 使用挂钩或 xcconfig 或 config.xml。但我就是无法让它工作,我已经花了大约 3 个星期现在无法让它工作。而且我只是感觉在黑暗中,因为所有在线阅读 material 都是针对不同版本的 cordova,或 visual studio,或 xcode,或 phonegap 或 ionic 或其他。
我已经在这个问题上花费了很多很多....小时。
我想出了一个 cordova after_prepare 钩子来解决我在 XCode 7 和 8 上的问题。 这是...
"use strict";
var fs = require('fs');
var path = require('path');
var xcode = require('xcode');
module.exports = function (context)
{
var encoding = 'utf-8';
var plist = fs.readFileSync(path.resolve(__dirname, "../GoogleService-Info.plist"), encoding);
fs.writeFileSync(path.resolve(__dirname, "../platforms/ios/GoogleService-Info.plist"), plist, encoding);
var projectPath = path.resolve(__dirname, "../platforms/ios/APP NAME.xcodeproj/project.pbxproj");
var pbxFile = fs.readFileSync(projectPath, encoding);
var proj = new xcode.project(projectPath);
proj = proj.parseSync();
var pbxGroupKey = proj.findPBXGroupKey({
name: "Resources"
});
proj.removeResourceFile('GoogleService-Info.plist', {}, pbxGroupKey);
proj.addResourceFile('GoogleService-Info.plist', {}, pbxGroupKey);
proj.addBuildProperty('"CODE_SIGN_IDENTITY[sdk=iphoneos*]"', '"iPhone Distribution"', 'Release');
proj.addBuildProperty('DEVELOPMENT_TEAM', 'XXXXXXXX', 'Release');
proj.addBuildProperty('PROVISIONING_PROFILE', "XXXXXXXX-XXXXXXXX-XXXX-XXXX-XXXXXXXX", 'Release');
proj.addBuildProperty('PROVISIONING_PROFILE_SPECIFIER', '"NAME OF PROFILE"', 'Release');
proj.addBuildProperty('TARGETED_DEVICE_FAMILY', '"1,2"', 'Release');
proj.addTargetAttribute("DevelopmentTeam", "XXXXXXXX");
var pushEntitlement = "{com.apple.Push ={enabled = 1;};}";
proj.addTargetAttribute("SystemCapabilities", pushEntitlement);
/*var attributes = proj.getFirstProject()['firstProject']['attributes'];
if (attributes['TargetAttributes'] === undefined)
{
attributes['TargetAttributes'] = {};
}
var target = proj.getFirstTarget();
if (attributes['TargetAttributes'][target.uuid] === undefined)
{
attributes['TargetAttributes'][target.uuid] = {};
}
attributes['TargetAttributes'][target.uuid]["SystemCapabilities"] = "{com.apple.Push ={enabled = 1;};}";
*/
fs.writeFileSync(projectPath, proj.writeSync());
fs.writeFileSync(path.resolve(__dirname, "../platforms/ios/APP NAME/Resources/GoogleService-Info.plist"), plist, encoding);
fs.writeFileSync(path.resolve(__dirname, "../platforms/ios/APP NAME/Resources/Resources/GoogleService-Info.plist"), plist, encoding);
};
请记住更新您的 APP 名称、配置文件名称和团队 ID。