Voor je verder gaat...
Deze week zijn de developer tools voor het maken van WP8.1 apps vrijgegeven. Deze update zal de komende maanden op vrijwel alle WP devices verschijnen en is vooral onder de motorkap een stuk anders. Met de nieuwe tools zijn ook nieuwe 8.1 emulators en rond half april kun je wp8.1 ook als developer op jedevice zetten.
WinRT is wat gebruikt wordt voor Windows 8(.1) apps en zal ook de nieuwe standaard zijn voor apps op Windows Phone. Met de komst van wp8.1 is dit voor 90%+ dezelfde code als bij de Windows 8.1 apps (voorheen 1/3 van dat).
Bestaande WP8 apps zullen wel nog gewoon werken op WP8.1 (al weet ik zo niet of dat ook werkt met apps die je vanuit visual studio side-load op je device of dat het alleen die uit de store zijn)
Er zijn wijzigingen in bijvoorbeeld de gehele api, manifest en controls zoals deze (waarvan ik weet dat je die gebruikt)
- de Panorama pagina is vervangen door de al door Win8.1 gebruikte Hub.
- de longlistselector die je tot nu gebruikte is niet meer beschikbaar en nu gebruik je een listview/gridview (data templates en bijna alle xaml is over het algemeen gewoon te gebruiken).
- navigatie tussen pagina's (fijner dan de huidige standaard manier)
dingen zoals background tasks, toast notifications etc. en als je gebruik wilt maken van de nieuwe 8.1 features zul je ook moeten overstappen.
Met de nieuwe tools zijn ook nieuwe 8.1 emulators en rond half april kun je wp8.1 ook op je device zetten.
Je kunt nog gewoon verder gaan met wat je nu doet maar ik zou alvast eens de nieuwe tools downloaden en een kijkje nemen. Ook kun je dan alvast eens met de nieuwe wp8.1 features spelen
En dan voorbeeld code om in te loggen: (WP8)
(als je nog even de website kunt zeggen waar je wilt inloggen, sommige dingen zijn dus bij elke website anders)
Om te kunnen inloggen zou ik eerst een class maken waar je wat info kunt opslaan over de gebruiker en de cookies:
[CPP]public class Account
{
private readonly CookieCollection _cookieCollection;
public Account(CookieCollection cookieCollection, string uniqueId)
{
_cookieCollection = cookieCollection;
this.UniqueId = uniqueId;
}
public string UniqueId { get; private set; }
public CookieCollection GetCookies()
{
return _cookieCollection;
}
public override string ToString()
{
return string.Format("Account: {0}", UniqueId);
}
}[/CPP]
En een class waar je de method maakt om in te loggen:
[CPP]public class AuthenticationService
{
public async Task<Account> Authenticate(string username, string password)
{
const string url = "http://www.website.com/login.html/ofzoiets";
var request = WebRequest.CreateHttp(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = new CookieContainer();
var post = string.Format("username={0}&password={1}", username, password); //voorbeeld postdata
var postBytes = Encoding.UTF8.GetBytes(post);
request.ContentLength = postBytes.Length;
var requestStream = await request.GetRequestStreamAsync();
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
await request.GetResponseAsync();
//if source page is needed, you can read it instead of just looking at the returned cookies
var cookieCollection = request.CookieContainer.GetCookies(new Uri(url));
var userIdCookie = cookieCollection["uid"]; // voorbeeld van site waar ik mee test
return userIdCookie == null ? null : new Account(cookieCollection, userIdCookie.Value);
}
}[/CPP]
Om de post datastring te achterhalen heb ik in de browser een developer tab open gezet en daar kon ik zien wat er nodig was. ook zou je met bv. wireshark de packets kunnen sniffen voor de website. (Dit is bij elke pagina anders.)
en de usage:
[CPP]var service = new AuthenticationService();
var account = await service.Authenticate("username", "password");
if (account != null)
{
MessageBox.Show(account.ToString(), "Authenticated", MessageBoxButton.OK);
}
else
{
MessageBox.Show("You have provided an invalid username or password.\r\n\r\nPlease try again.", "Authentication Failed!", MessageBoxButton.OK);
}[/CPP]
ik maak ook gebruik van deze async extension method: (dit is ook iets wat allemaal in WP8.1 kant en klaar zit
)
[CPP]public static Task<Stream> GetRequestStreamAsync(this HttpWebRequest request)
{
var taskComplete = new TaskCompletionSource<Stream>();
request.BeginGetRequestStream(asyncResponse =>
{
try
{
var responseRequest = (HttpWebRequest)asyncResponse.AsyncState;
var someResponse = responseRequest.EndGetRequestStream(asyncResponse);
taskComplete.TrySetResult(someResponse);
}
catch (WebException)
{
taskComplete.TrySetResult(null);
}
}, request);
return taskComplete.Task;
}[/CPP]
nadat je een account variable hebt kun je de cookies daarin gebruiken bij elk request (waar in de authenticate method alleen een nieuwe wordt aangemaakt)