Я наткнулся на небольшую загадку в проекте, над которым я работаю, который включает в себя создание плагина для считывателей магнитных полос Square Connect с Android.Я уже создал плагин для Ionic / Cordova и отредактировал другие, чтобы они были более совместимы с моими потребностями - но из этого пакета был другой зверь.
Во-первых, они требовали от васчтобы расширить базовый класс Android-приложений для унификации 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);
})
}
});
}
};
Насколько я могу судить, этот хук должен изменитьПеременная android: name = "" тега приложения в AndroidManifest с расширенным именем приложения.В настоящее время Cordova указывает на MainActivity (так что ловушка не работает должным образом), но я также не уверен, хочу ли я перезаписать MainActivity Cordova!
Хорошо, если я перейду к приложению, все этосборки правильно, я не получаю ошибок при сборке - но когда я запускаю приложение, сразу после входа пользователя в SDK должен авторизоваться с помощью Square.Вместо этого я получаю прекрасную ошибку «Class not Found» в моих журналах - что в сочетании с явным отсутствием каких-либо сообщений 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, а затем обычно тестовая сборка, с той же ошибкой «Class not Found», удалением плагина и повторным стартом.Любая помощь в том, что я мог упустить, приветствуется.