Ionic, Phonegap, AngularJs : 模拟时本地存储未定义键
Ionic, Phonegap, AngularJs : local storage undefined key when emulating
我刚刚构建了一个简单的应用程序调用 rest api 使用 symfony 构建并使用 fos_oauth 保护。
我有一个 AuthService return 一个访问令牌,允许我的移动应用程序访问我的 api。
它存储在本地存储中:
在我的浏览器上使用 ionic serve(类似于 phonegap serve)应用程序运行良好,我可以访问本地存储的变量。当用 ios 模拟时,它工作得很好。但是当使用 android 模拟或使用 phonegap 应用程序在我的 phone 上显示我的应用程序时。我无法访问这些变量。你觉得这正常吗?
[phonegap] 404 http://ynd.dev/api/login?access_token=undefined
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']
在 Phonegap 中使用应用程序时,应用程序从文件系统调用,因此在 file://
协议上运行。当你想调用你的服务器时,你需要在你的服务器上使用 JSONP 或 CORS headers 才能成功连接,否则会出现 cross-domain 安全策略。
它根本无法工作,因为模拟应用程序不访问本地主机。
第一个解决方案:
从在线主机调用 api。
第二种方案:
而不是调用 http://localhost/ 调用 IP(您可以使用 ifconfig 获取它,我自己使用 ifconfig vboxnet0)。
对于虚拟主机,我还没有弄清楚。
我刚刚构建了一个简单的应用程序调用 rest api 使用 symfony 构建并使用 fos_oauth 保护。
我有一个 AuthService return 一个访问令牌,允许我的移动应用程序访问我的 api。
它存储在本地存储中:
在我的浏览器上使用 ionic serve(类似于 phonegap serve)应用程序运行良好,我可以访问本地存储的变量。当用 ios 模拟时,它工作得很好。但是当使用 android 模拟或使用 phonegap 应用程序在我的 phone 上显示我的应用程序时。我无法访问这些变量。你觉得这正常吗?
[phonegap] 404 http://ynd.dev/api/login?access_token=undefined
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']
在 Phonegap 中使用应用程序时,应用程序从文件系统调用,因此在 file://
协议上运行。当你想调用你的服务器时,你需要在你的服务器上使用 JSONP 或 CORS headers 才能成功连接,否则会出现 cross-domain 安全策略。
它根本无法工作,因为模拟应用程序不访问本地主机。
第一个解决方案:
从在线主机调用 api。
第二种方案:
而不是调用 http://localhost/ 调用 IP(您可以使用 ifconfig 获取它,我自己使用 ifconfig vboxnet0)。
对于虚拟主机,我还没有弄清楚。