Ionic,Phonegap,AngularJs:模拟时本地存储未定义的键

时间:2015-03-09 08:56:36

标签: angularjs cordova local-storage phonegap-build ionic

我刚刚构建了一个简单的应用程序,调用一个用symfony构建的rest api,并用fos_oauth保护。

我有一个AuthService,它返回一个访问令牌,允许我的移动应用程序访问我的api。

它存储在本地存储中:

Local storage

在我的浏览器上使用离子服务(类似于phonegap服务),应用程序完美正常工作,我可以访问我本地存储的变量。使用ios进行模拟时,它非常有效。但是当使用android模拟或使用phonegap应用程序在我的手机上显示我的应用程序时。我无法访问这些变量。这对你来说听起来很正常吗?

  

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

Android vs 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" );

    }

  });
});

AuthService:

这是对象存储在本地的方式。

$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']

2 个答案:

答案 0 :(得分:0)

在Phonegap中使用应用程序时,将从文件系统调用应用程序,从而在file://协议上运行。当您想要呼叫服务器时,您需要在服务器上使用JSONP或CORS标头才能成功建立连接,否则将出现跨域安全策略。

答案 1 :(得分:0)

It was simply not working because the emulated application does not access the localhost.

First solution :

Call the api from an online host.

Second solution :

Instead of calling http://localhost/的信息调用IP(您可以使用ifconfig获取它,对于我自己使用 ifconfig vboxnet0 )。

对于虚拟主持人我还没弄清楚。