Плагин Custom Square Magstipe Reader Ionic / Cordova "Класс не найден" - PullRequest
0 голосов
/ 22 января 2019

Я наткнулся на небольшую загадку в проекте, над которым я работаю, который включает в себя создание плагина для считывателей магнитных полос 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», удалением плагина и повторным стартом.Любая помощь в том, что я мог упустить, приветствуется.

...