我在一个正在进行的项目中遇到了一些麻烦,该项目涉及使用Android为Square Connect磁条读取器构建插件。之前,我已经为Ionic / Cordova构建了一个插件,并且我已经编辑了其他插件以使其更符合我的需求-但这个SDK简直就是一门怪兽。
首先,他们要求您扩展基本的Android Application类以统一SDK,因此将不会提供此代码,因为它直接来自于他们的SDK-但是,将其放入Ionic项目是一个挑战。我一直在使用此钩子,以便将扩展类放置在适当的位置
hook.js:
var APP_CLASS = 'SquareApplication';
module.exports = function(context) {
var fs = context.requireCordovaModule('fs'),
path = context.requireCordovaModule('path');
var platformRoot = path.join(context.opts.projectRoot,'platforms/android');
var manifestFile = path.join(platformRoot, 'AndroidManifest.xml');
if (fs.existsSync(manifestFile)) {
fs.readFile(manifestFile, 'utf8', function (err, data) {
if (err) {
throw new Error('Unable to find AndroidManifest.xml: ' + err);
}
if (data.indexOf(APP_CLASS) == -1) {
var result = data.replace(/<application/g, '<application android:name="' + APP_CLASS + '"');
fs.writeFile(manifestFile, result, 'utf8', function (err) {
if (err) throw new Error('Unable to write AndroidManifest.xml: ' + err);
})
}
});
}
};
据我所知,这个钩子应该使用扩展的应用程序名称来更改AndroidManifest中应用程序标签的android:name =“”变量。科尔多瓦目前有指向MainActivity的指针(因此该钩子无法按预期工作),但是我不确定是否要覆盖科尔多瓦的MainActivity!
好吧,如果我要移植所有正确构建的应用程序,则在构建时不会出现任何错误-但是,当我运行该应用程序时,用户登录SDK后应立即向Square授权。取而代之的是,我的日志中出现了一个可爱的“找不到类”错误-再加上明显缺少任何Android Log.d消息,这意味着Ionic / Cordova找不到插件!
所以我看看所有常见的地方。
plugin.xml:
<?xml version='1.0' encoding='utf-8'?>
<plugin id="catalpa-plugin-square-connect" version="0.0.1" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
<name>Square Connect Plugin</name>
<js-module name="SquareConnect" src="www/squareConnect.js">
<clobbers target="cordova.plugins.SquareConnect" />
</js-module>
<platform name="android">
<config-file parent="/widget" target="res/xml/config.xml">
<feature name="catalpa-plugin-square-connect">
<param name="android-package" value="com.catalpa.square"/>
</feature>
</config-file>
<config-file target="app/src/main/AndroidManifest.xml" parent="/manifest">
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.AUDIO" />
<uses-permission android:name="android.permission.LOCATION" />
<uses-permission android:name="android.permission.STORAGE" />
<uses-permission android:name="android.permission.PHONE" />
</config-file>
<framework src="gradle.properties" custom="true" type="gradleReference"/>
<framework src="build.gradle" custom="true" type="gradleReference" />
<source-file src="src/android/SquareConnect.java" target-dir="src/com/catalpa/square/" />
<source-file src="src/android/SquareApplication.java" target-dir="src/com/catalpa/square/" />
<source-file src="src/android/CheckoutWrapper.java" target-dir="src/com/catalpa/square/" />
<source-file src="src/android/AuthorizationWrapper.java" target-dir="src/com/catalpa/square/" />
</platform>
<hook type="after_prepare" src="hooks/squareConnect.js" />
</plugin>
具体地说,我开始看我在哪里声明js模块。名称是好,源目录是好,而问题就是我在应用程序中使用的东西。我检查了config.xml文件,以确保插件信息能够到达需要的地方,并且一切就在那里。
java文件位于其正确的目录中,并且在构建时没有出现任何构建错误或类丢失错误。我没有Java错误来指示缺少类,仅是从JS中获得,并且通常在找不到插件的情况下,因为我的plugin.xml尚未正确设置,但这应该就在所有地方。我能想到的唯一问题可能是挂钩未正确设置扩展应用程序文件,但我认为那会在Android控制台/ Java中引起错误,并且不会阻止Cordova调用插件本身。
只是转储其他一些相关文件,因为我迷失了方向,试图找出问题所在。
www / plugin.js
var exec = require('cordova/exec');
/*'use strict';
var SquareConnect = ( typeof SquareConnect === 'undefined' ? {} : SquareConnect );
var cordova = window.cordova || window.Cordova,
fail = function(error) {
console.log('Error running your request: ' + error);
};*/
var PLUGIN_NAME = 'SquareConnect'; //'SquareConnect'
exports.authorize = function (success, error) {
exec(success, error, PLUGIN_NAME, 'authorize', []);
};
exports.checkout = function (arg0, success, error) {
exec(success, error, PLUGIN_NAME, 'checkout', [arg0]);
}
我尝试过的方法:对plugin.js文件和plugin.xml文件进行各种操作,然后通常进行测试构建,看到相同的“找不到类”错误,删除插件并再次从头开始。感谢您对我可能会缺少的任何帮助。