Ionic, Phonegap, AngularJs: неопределенный ключ локального хранилища при эмуляции

Я только что создал простое приложение, вызывающее API для отдыха, созданное с помощью symfony и защищенное с помощью fos_oauth.

У меня есть AuthService, который возвращает токен доступа, который позволяет моему мобильному приложению получить доступ к моему API.

Он хранится в локальном хранилище:

Локальное хранилище

В моем браузере, использующем ионную подачу (аналогично поставке телефонной связи), приложение отлично работает, и я могу получить доступ к своей переменной, хранящейся локально. При эмуляции с ios работает отлично. Но при эмуляции с Android или отображении моего приложения на моем телефоне с помощью приложения phonegap. Я не могу получить доступ к этим переменным. Вам это кажется нормальным?

[phonegap] 404 http://ynd.dev/api/login?access_token=undefined

Android против iOS

index.html :

<!-- Utils -->
<script src="js/service/LocalStorageService.js"></script>

<!-- JS Config -->
<script src="js/functions.js"></script>
<script src="js/config/parameters.js"></script>

<!-- your app's js -->
<script src="js/app.js"></script>
<script src="js/config/routing.js"></script>
<script src="js/service/AuthService.js"></script>

LocalStorageService.js:

setObject: function(key, value) {
    $window.localStorage.setItem(key, JSON.stringify(value));
},
getObject: function(key) {
    return JSON.parse($window.localStorage.getItem(key) || '{}');
}

parameters.js:

// Resources
var domain = 'http://ynd.dev';
var public_id = '4_4spkzm1pubcw40og04okk4wogs0cc44wkgkkoco88k8cwgkwgs';
var secret = '28es09ymlcg0wgskgs4cso0co0ok0ww0gw8g0k8g4kcowckcco';

// Access token
var access_token = '';
var identity_token = '';

app.js:

var app = angular.module('ionicApp', ['ionic', 'ionic.utils', 'ngResource']);

app.run(function($ionicPlatform,$rootScope, $localStorage, $location, AuthService) {

  $ionicPlatform.ready(function() {
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
    // for form inputs)
    if(window.cordova && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
    }
    if(window.StatusBar) {
      StatusBar.styleDefault();
    }

    access_token = $localStorage.getObject('access_token');
    identity_token = $localStorage.getObject('identity_token');

    AuthService.token();

  });
  $rootScope.$on('$stateChangeStart', function (event, next) {

    access_token = $localStorage.getObject('access_token');
    identity_token = $localStorage.getObject('identity_token');

    AuthService.token();

    // IF no user logged
    if(isObjectEmpty(identity_token)){

      $location.path( "/login" );

    }

  });
});

Служба авторизации:

Вот как объект хранится в локальном.

$localStorage.setObject('access_token', {
                            key: res.data.access_token,
                            type: 'anonymous',
                            expires_at: Date.now()+(res.data.expires_in*1000)
                        });

Любые идеи или подсказки?

ОБНОВЛЕНИЕ: (CORS)

allow_origin: ['*'] 
allow_headers: ['*'] 
allow_methods: ['POST', 'PUT', 'GET', 'DELETE', 'OPTIONS']

person Brieuc    schedule 09.03.2015    source источник
comment
Вы должны попытаться зарегистрировать localstorage на вашем setObject/getObject, чтобы дать больше информации. Я не вижу очевидной причины, но вы должны использовать localStorage.getItem(key) и .setItem(key) вместо localStorage[key], лучше stackoverflow.com/questions/12632463/ обратите внимание, что я не посмотрите, как это может решить вашу проблему, это просто оптимизация.   -  person Boris Charpentier    schedule 09.03.2015
comment
Хорошо, спасибо, приятно это знать.   -  person Brieuc    schedule 09.03.2015
comment
Откуда на самом деле берется поле предупреждения? Где именно в вашем коде вы вызываете предупреждение?   -  person Rias    schedule 09.03.2015
comment
Я просто поместил предупреждение в свою службу входа в систему, прежде чем вызывать URL-адрес 'ynd.dev/api /login?access_token='+access_token   -  person Brieuc    schedule 09.03.2015


Ответы (2)


При использовании приложения в Phonegap приложение вызывается из файловой системы, поэтому работает по протоколу file://. Когда вы хотите вызвать свой сервер, вам нужно будет использовать заголовки JSONP или CORS на вашем сервере, чтобы установить успешное соединение, так как в противном случае возникнут междоменные политики безопасности.

person Rias    schedule 09.03.2015
comment
На стороне сервера используется Symfony2 с пакетом FOS Rest и пакетом Nelmio Cors. Настройки уже сделаны и работают. Мое приложение на самом деле уже находится за пределами моей серверной части, и приложение правильно получает от него данные. Только в приложении phonegap и эмуляции Android я не могу получить доступ к локальным сохраненным переменным (или сохраненная переменная не получила данные с сервера). Здесь настройка cors обновлена ​​​​в сообщении. - person Brieuc; 09.03.2015
comment
проблема существует и на реальных устройствах Android или, например, в эмуляторе iOS? - person Rias; 09.03.2015
comment
Эмулятор IOS отлично работает и возвращает правильное значение. Эмулятор Android возвращает значение undefined. Приложение Phonegapp, которое позволяет протестировать его через IP на телефоне Iphone или Android (без компиляции), также возвращает значение undefined. - person Brieuc; 09.03.2015
comment
Я не знаком с Phonegap через IP без компиляции, но, возможно, ваш эмулятор не поддерживает localStorage и Phonegap через IP имеет какое-то несоответствие домена. Вы пытались скомпилировать приложение и запустить его на устройствах? - person Rias; 09.03.2015
comment
Пока нет, это то, что я мог бы попробовать. пока не уверен, как это сделать. я новичок в этом. Возможно, что действительно нет поддержки localStorage, по крайней мере, это лучшее предположение, которое у меня было. - person Brieuc; 09.03.2015
comment
Что ж, эмуляторы — это просто эмуляторы, и в некоторых случаях они ведут себя по-разному. Из того, что я вижу в вашем коде, он выглядит правильно для меня, и с правильными заголовками CORS он должен, по крайней мере, извлекать и сохранять значение в localStorage в большинстве браузеров и устройств. Так что в вашем случае я бы попробовал сначала убедиться, что проблема не в эмуляторах :) - person Rias; 09.03.2015
comment
Спасибо за подсказку, я обязательно об этом позабочусь. - person Brieuc; 09.03.2015

Это просто не работало, потому что эмулируемое приложение не имеет доступа к локальному хосту.

Первое решение:

Вызов API с онлайн-хостинга.

Второе решение:

Вместо вызова http://localhost/ вызовите IP-адрес (вы можете получить его с помощью ifconfig, для себя я использовал ifconfig vboxnet0).

Для виртуального хоста я не понял.

person Brieuc    schedule 06.05.2015