Ionic — приложение отлично работает в браузере и симуляторе iOS, но не в симуляторе Android

#android #angularjs #ionic-framework

#Android #angularjs #ionic-framework

Вопрос:

Я действительно новичок в мире мобильной разработки и пробую свои силы в этом, используя IonicFramework.

Я создаю форму входа в систему, и при успешном входе пользователь переходит в другое состояние, которое вызывается viewMyList . Кажется, все работает нормально, когда я запускаю команду ionic serve , я могу войти в систему и перейти к следующему состоянию, и, похоже, все в порядке и на симуляторе iOS, но на симуляторе Android при нажатии кнопки входа в систему ничего не происходит, я тоже не вижу никаких ошибок.

Моя попытка

login.html

 <ion-view title="Login">
    <ion-content class="has-header" padding="true">
        <form class="list">
            <h2 id="login-heading3" style="color:#000000;text-align:center;">Welcome back!</h2>
            <div class="spacer" style="width: 300px; height: 32px;"></div>
            <ion-list>
                <label class="item item-input">
                    <span class="input-label">Email</span>
                    <input type="text" placeholder="" ng-model="credentials.username">
                </label>
                <label class="item item-input">
                    <span class="input-label">Password</span>
                    <input type="text" placeholder="" ng-model="credentials.password">
                </label>
            </ion-list>
            <div class="spacer" style="width: 300px; height: 18px;"></div>
            <a class="button button-positive  button-block" ng-click="login()">Sign In</a>
        </form>
    </ion-content>
</ion-view>
  

ng-click связано с login()

Вот мой loginCtrl , который содержит login() функцию

 .controller('loginCtrl', function ($scope, $state, $ionicHistory, User) {

    $scope.credentials = {
        username: '',
        password: ''
    };
    $scope.login = function () {
        User.login($scope.credentials)
            .then(function (response) {
                console.log(JSON.stringify(response));
                //Login should not keep any history
                $ionicHistory.nextViewOptions({historyRoot: true});
                $state.go('app.viewMyList');
            })
    };

    $scope.message = "this is a message loginCtrl";
})
  

Вот мой User сервис, который заботится о логике входа в систему

 angular.module('app.user', [])
    .factory('User', function ($http) {

        var apiUrl = 'http://127.0.0.1:8000/api';
        var loggedIn = false;

        return {
        login: function (credentials) {
            console.log(JSON.stringify('inside login function'));
            console.log(JSON.stringify(credentials));
            return $http.post(apiUrl   '/tokens', credentials)
                .success(function (response) {
                    console.log(JSON.stringify('inside .then of login function'));
                    var token = response.data.token;
                    console.log(JSON.stringify(token));
                    $http.defaults.headers.common.Authorization = 'Bearer '   token;
                    persist(token);
                })

                .error(function (response) {
                    console.log('inside error of login function');
                    console.log(JSON.stringify(response));
                })
                ;
        },

            isLoggedIn: function () {
                if (localStorage.getItem("token")  != null) {
                    return loggedIn = true;
                }
            }
        };

        function persist(token) {

            window.localStorage['token'] = angular.toJson(token);
        }
    });
  

Вот route причина входа в систему

     .state('login', {
        url: '/login',
        templateUrl: 'templates/login.html',
        controller: 'loginCtrl'


    })
  

На данный момент я действительно ничего не понимаю, поскольку, похоже, не могу понять, почему на Android ничего не происходит, из моего устранения неполадок все, что я смог найти, это когда я нажимаю на кнопку входа в систему, код, похоже, не входит в следующую функцию.

 $scope.login = function () {
    User.login($scope.credentials)
        .then(function (response) {
            console.log(JSON.stringify(response));
            //Login should not keep any history
            $ionicHistory.nextViewOptions({historyRoot: true});
            $state.go('app.viewMyList');
        })
};
  

Любая помощь будет действительно оценена.

Комментарии:

1. проверьте консоль на удаленном отладчике Chrome

2. Не могли бы вы уточнить свой ответ? У меня не проблема с браузером, у меня проблема с симулятором Android.

3. да, именно поэтому я говорю вам проверять консоль во время работы на вашем устройстве Android. подключите свое Android-устройство к ноутбуку, введите тип Chrome chrome://inspect , затем вы можете проверить приложение, запущенное на вашем устройстве.

4. Теперь я понимаю, что вы говорите, я запускаю команду simulator ionic run android -l -c -s , поэтому все журналы, которые я вижу на терминале, и в этом я не вижу ошибок

5. Я обновил код и добавил .error внутри login: function (credentials) { , и теперь я вижу, что только на Android поток переходит в эту функцию, но все же я не вижу никаких ошибок, console.log(JSON.stringify(response)); внутри .error просто распечатывается null

Ответ №1:

Сначала установите плагин белого списка.

 cordova plugin add cordova-plugin-whitelist
  

добавьте следующий код в свой config.xml файл в вашем корневом каталоге проекта

 <allow-navigation href="http://example.com/*" />
  

или:

 <allow-navigation href="http://*/*" />
  

Если вы все еще сталкиваетесь с какой-либо проблемой, вы можете проверить консоль во время работы на устройстве Android с помощью Chrome remote debugging

  • Подключите устройство к компьютеру.(Убедитесь, что на вашем мобильном устройстве включена отладка по USB).

  • напишите chrome://inspect в браузере на рабочем столе Chrome.

  • вы увидите подключенное устройство, выберите проверить и проверьте консоль на наличие журнала.

Комментарии:

1. Plugin "cordova-plugin-whitelist" already installed on android. это то, что я вижу в консоли, когда пытаюсь cordova plugin add cordova-plugin-whitelist , и allow-navigation это тоже не помогает

2. я спросил вас, прежде чем вы установили белый список, вы говорите «нет»

3. извините, я действительно новичок в мире мобильной разработки, поэтому я не знал, что все плагины cordova предустановлены с ionic

4. вы еще не проверяли консоль Chrome на своем устройстве Android?

5. извините за поздний ответ, да, я проверил, и ошибка, которую я получаю, заключается net::ERR_CONNECTION_REFUSED в том, что это не имеет никакого смысла, почему я получаю эту ошибку?