我正在使用以下方式开发适用于iPhone的基本身份验证移动应用程序:
Titanium v.3.23
XAMPP作为我的本地服务器和PHP
MySQL作为本地数据库
我正在处理的应用程序基于以下教程:
http://code.tutsplus.com/tutorials/titanium-user-authentication-part-1--mobile-3728
我能够从教程中获取代码并运行没有问题,应用程序允许我将用户名/密码密钥发布到我的本地数据库,使用密钥登录,并在我的主窗口上显示信息
我开始操纵代码以反映我正在尝试构建的更多内容,一个基于窗口的应用程序(不像教程中的基于选项卡),这将允许我创建用户名/密码密钥,登录到主窗口,并在该主窗口上显示我的信息。
我已经成功修改了代码,允许我在本地数据库中创建一个新的用户名/密码,并让应用程序在登录时验证用户名/密码是否匹配。但是,当我登录主屏幕时,它显示我的用户名和密码是"未定义"。为了检查错误,我在当前持有工作代码的项目中输入了相同的用户/传递,并且它是可见的。所以我知道我当前的PHP和数据库都正常工作。
目前,我的app.js是:
setTimeout (function() {
var login;
login = require ('login');
login.LogIn();
var mainWin = Titanium.UI.createWindow();
Ti.App.addEventListener('grantEntrance', function(event){
mainWin.title = 'Welcome ' + event.name;
mainWin.url = 'main.js';
mainWin.name = event.name;
mainWin.email = event.email;
});
}, 2000);
setTimeout函数最终是一个启动画面,我从上面的教程中独立添加。我也改变了#34; main"项目反映我的mainWin,而不是" main"如教程中所示。
目前,我的login.js是:
function LogIn(){
var loginWin = Ti.UI.createWindow({
backgroundColor:'white'
});
var username = Titanium.UI.createTextField({
color:'#336699',
top:10,
left:10,
width:300,
height:40,
hintText:'Username',
keyboardType:Titanium.UI.KEYBOARD_DEFAULT,
returnKeyType:Titanium.UI.RETURNKEY_DEFAULT,
borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED
});
loginWin.add(username);
var password = Titanium.UI.createTextField({
color:'#336699',
top:60,
left:10,
width:300,
height:40,
hintText:'Password',
passwordMask:true,
keyboardType:Titanium.UI.KEYBOARD_DEFAULT,
returnKeyType:Titanium.UI.RETURNKEY_DEFAULT,
borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED
});
loginWin.add(password);
var loginBtn = Titanium.UI.createButton({
title:'Login',
top:110,
width:90,
height:35,
borderRadius:1,
font:{fontFamily:'Arial',fontWeight:'bold',fontSize:14}
});
loginWin.add(loginBtn);
var createLabel = Titanium.UI.createLabel({
text:'Create Profile',
bottom: 25,
left:25
});
loginWin.add(createLabel);
var indicatorWin = Ti.UI.createView({
width: 320,
height: 480,
backgroundColor: '#000000',
opacity: 0.5
});
var acctInd = Ti.UI.createActivityIndicator({
height:50,
width:50,
style: Titanium.UI.createActivityIndicatorStyle.Plain,
top:250,
left:130
});
var actLabel = Titanium.UI.createLabel({
text: 'Checking Login Details',
color: '#FFFFFF',
left:70,
top:200,
height:50
});
indicatorWin.hide();
acctInd.hide();
actLabel.hide():
loginWin.add(indicatorWin);
indicatorWin.add(acctInd);
indicatorWin.add(actLabel);
var loginReq = Titanium.Network.createHTTPClient();
loginReq.onload = function()
{
var json = this.responseText;
var response = JSON.parse(json);
if (response.logged == true)
{
username.blur();
password.blur();
Ti.App.fireEvent('grantEntrance', {
name:response.name,
email:response.email
});
loginWin.close();
var main;
main = require ('main');
main.MainM();
}
else
{
alert(response.message);
}
};
loginBtn.addEventListener('click',function(e)
{
if (username.value != '' && password.value != '')
{
loginReq.open("POST","http://localhost/Tuts/post_auth.php");
var params = {
username: username.value,
password: Ti.Utils.md5HexDigest(password.value)
};
loginReq.send(params);
indicatorWin.show();
acctInd.show();
actLabel.show();
}
else
{
alert("Username/Password are required");
}
});
createLabel.addEventListener('click', function(e) {
var ProfileWin, ProfileInc;
ProfileInc = require ('createProfile');
ProfileWin = new ProfileInc.CreateP();
ProfileWin.open();
});
loginWin.open();
return ;loginWin;
}
exports.LogIn=LogIn;
目前,我的main.js是:
function MainM(){
var mainWin = Ti.UI.createWindow({
backgroundColor:'white'
});
var msg = Titanium.UI.createLabel({
text:"\n\nYour email is:\n" + mainWin.email + "\n\nyour name is:\n" + mainWin.name,
top:10,
left:10,
width:300,
height:'auto'
});
mainWin.add(msg);
mainWin.open();
return ;mainWin;
}
exports.MainM=MainM;
正如您所看到的,我对应用程序的实际数据库部分没有太大的改变。这就是为什么我感到困惑,因为它不起作用。我发现的唯一研究表明异步请求可能存在问题,并且听说通过使用setTimeout函数我可能能够解决我的错误。我试图在几个地方插入该功能,但错误仍然存在。
很抱歉这么久,我已经为此工作了一个月,我希望尽可能详细。
感谢您的帮助!
答案 0 :(得分:0)
在您的代码中,主屏幕是一个新窗口,它无法访问变量电子邮件和名称。
在min win中获取值的方法是将它们保存在Properties并使用它们,或者修改你的main.js。