4. Agenda
1. Wprowadzenie do Mobile Services
2. Projekt – opis, funkcjonalności
3. Tworzenie projektu
4. Mobile Services w praktyce
• Praca z danymi
• Działanie po stronie serwera
• Uwierzytelnianie
• Notyfikacje Push
• Łączenie z usługami zewnętrznymi (Sendgrid,Schedule)
• Łączenie z usługami Azure (zdjęcia – Azure Storage)
6. Projekt
Projekt ma na celu stworzenie programu pozwalającego
zarządzad zadaniami w grupie sposobem ala Agile.
Osoba posiadająca aplikację na Windows 8, będzie mogła
tworzyd grupy, które maja na celu wykonanie wypisanych
zadao. Twórca grupy będzie miał możliwośd dodawania zadao
oraz grupowiczy.
Każdy użytkownik posiadający wersję mobilną aplikacji
(Windows Phone, Android, iPhone lub przeglądarka HTML)
będzie mógł zobaczyd do jakich grup należy oraz jakie zadania
znajdują się w grupie. Dodatkowo będzie mógł przypisad sobie
zadanie oraz zaznaczyd, że skooczył je lub odpisad od Siebie.
7. Skrócony opis projektu – Agile
Notepad
W programie można dodawad grupy do których twórca (administrator) może
dodawad zadania i grupowiczy.
Wybrane zadania każdy możne przypisywad sobie do zrobienia. Dodatkowo po
przypisaniu zadania można zaznaczyd, że jest ono zrobione lub „odpisad” od siebie.
Aby wejśd do programu należy się uwierzytelnid za pomocą konta FB.
Kiedy właściciel doda zadanie do grupy wszyscy należacy do tej grupy zostaną
poinformowani o nowych zadaniach.
Raz na tydzieo zostaje rozesłany mail do wszystkich o wolnych zadaniach.
8. Funkcjonalności
• Uwierzytelnianie
• Stworzenie profilu
• Dodanie/usunięcie grupy
• Wyświetlenie grup do których się należy lub się
stworzyło
• Dodanie/usunięce zadania z grupy
• Dołączenie/usunięcie użytkownika z grupy
• Poinformowanie grupowiczy o nowym zadaniu
• Wysłanie maila informującego o zadaniach
11. Jak się tworzy projekt -
początek
App.xaml.cs
public static MobileServiceClient MobileService = new
MobileServiceClient("https://agilenotepad.azure-mobile.net/", "[kod AMS]");
12. Jak się tworzy projekt -
początek
App.xaml.cs
public static MobileServiceClient MobileService = new
MobileServiceClient("https://agilenotepad.azure-mobile.net/", "[kod AMS]");
16. public class Comment
{
[DataMember(Name = "id")]
public string IdComment { get; set; }
public string Desc { get; set; }
//foreign
public string IdTask { get; set; }
public string IdUser { get; set; }
}
17. Funkcjonalności
• Uwierzytelnianie
• Stworzenie profilu
• Dodanie/usunięcie grupy
• Wyświetlenie grup do których się należy lub się
stworzyło
• Dodanie/usunięce zadania z grupy
• Dołączenie/usunięcie użytkownika z grupy
• Poinformowanie grupowiczy o nowym zadaniu
• Wysłanie maila informującego o zadaniach
22. 3.Wysłanie informacji o dodaniu grupy
private DelegateCommand addNewGroup;
public ICommand AddNewGroup
{
get
{
if (addNewGroup == null)
{
addNewGroup = new DelegateCommand((x) =>
{
DispatchedMessenger.Instance.Send(new
AddGroupMessage(x as String));
});
}
return addNewGroup;
}
}
Przechwycenie komunikatu
[MessageHandler]
public void BackgroundMessageHandler(AddGroupMessage message)
{
AddGroup(message.NameGroup);
}
23. public async void AddGroup(string NameG)
{
try
{
Group item = new Group { IdUser =
MainSettings.user.UserId, Name = NameG };
await groupTable.InsertAsync(item);
ListGroups.Add(item);
MessageBoxService.Notify("Grupa została dodana",
"Dodawanie grupy");
}
catch (Exception e)
{
MessageBoxService.Notify(e.Message, "Dodawanie grupy");
}
}
24. public static MobileServiceClient MobileService = new
MobileServiceClient("https://agilenotepad.azure-mobile.net/", "");
private IMobileServiceTable<Group> groupTable =
App.MobileService.GetTable<Group>();
await groupTable.InsertAsync(item);
25. function insert(item, user, request) {
var groupTable = tables.getTable('Group');
groupTable.where({Name: item.Name}).
read({success: checkName});
function checkName(results) {
if (results.length > 0) {
console.log("Nie dodawaj grupy");
request.respond(statusCodes.BAD_REQUEST,"Już istnieje
taka grupa");
} else {
console.log("Dodaj grupe");
request.execute();
}
}
}
26. Kod - usunięcie grupy
public static MobileServiceClient MobileService = new
MobileServiceClient("https://agilenotepad.azure-mobile.net/", "");
private IMobileServiceTable<Group> groupTable =
App.MobileService.GetTable<Group>();
Group item = new Group { id = xid };
await groupTable.DeleteAsync(item);
27. Funkcjonalności
• Uwierzytelnianie
• Stworzenie profilu
• Dodanie/usunięcie grupy
• Wyświetlenie grup do których się należy lub się
stworzyło
• Dodanie/usunięce zadania z grupy
• Dołączenie/usunięcie użytkownika z grupy
• Poinformowanie grupowiczy o nowym zadaniu
• Wysłanie maila informującego o zadaniach
28. Operacje CRUD - READ
Wyświetlanie grupy zadaniowej do któej się należy lub się
stworzyło.
DEMO
29. Kod – wyświetlenie grupy
private IMobileServiceTable<Group> groupTable =
App.MobileService.GetTable<Group>();
Dictionary<string, string> myParam = new Dictionary<string, string>();
myParam.Add("ifMyGroups", "true");
List<Group> list = await App.MobileService.GetTable<Group>().
Skip(0).WithParameters(myParam).ToListAsync();
Dictionary<string, string> myParam = new Dictionary<string, string>();
myParam.Add("ifMyGroups", "false");
List<Group> list = await App.MobileService.GetTable<Group>().
Skip(0).WithParameters(myParam).ToListAsync();
30. function read(query, user, request) {
if( request.parameters == null)
console.log("Nie ma parametrow");
if(request.parameters.ifMyGroups == 'true')
{
query.where({ IdUser: user.userId });
request.execute();
console.log(„Pobrało moje grupy");
}
else
{
var sql = "SELECT g.id, g.Name, g.IdUser FROM
[agilenotepad].[Connect] c,[agilenotepad].[Group] g WHERE c.IdGroup =
g.id AND c.IdUser = ?;";
mssql.query(sql, user.userId, {
success: function(results) {
request.respond(statusCodes.OK, results);
}
});
}
}
31. Funkcjonalności
• Uwierzytelnianie
• Stworzenie profilu
• Dodanie/usunięcie grupy
• Wyświetlenie grup do których się należy lub się
stworzyło
• Dodanie/usunięce zadania z grupy
• Dołączenie/usunięcie użytkownika z grupy
• Poinformowanie grupowiczy o nowym zadaniu
• Wysłanie maila informującego o zadaniach
35. Funkcjonalności
• Uwierzytelnianie
• Stworzenie profilu
• Dodanie/usunięcie grupy
• Wyświetlenie grup do których się należy lub się
stworzyło
• Dodanie/usunięce zadania z grupy
• Dołączenie/usunięcie użytkownika z grupy
• Poinformowanie grupowiczy o nowym zadaniu
• Wysłanie maila informującego o zadaniach
42. Kod – tworzenie konta po
uwierzytelnieniu
public static MobileServiceClient MobileService = new
MobileServiceClient("https://agilenotepad.azure-mobile.net/",
"");
MainSettings.user = await
App.MobileService.LoginAsync(MobileServiceAuthenticationProvide
r.Facebook);
private IMobileServiceTable<Profile> profileTable =
App.MobileService.GetTable<Profile>();
await profileTable.InsertAsync(entity);
43. function insert(item, user, request) {
var profileTable = tables.getTable('Profile');
profileTable.where({
IdUser: item.IdUser
}).read({
success: checkPermissions
});
function checkPermissions(results) {
if (results.length > 0) {
//console.log("Nie dodawaj użytkownika");
request.respond();
} else {
//console.log("Dodaj użytkownika");
request.execute();
}
}
}
44. Kod – pobieranie informacji o
użytkowniku
public static MobileServiceClient MobileService = new
MobileServiceClient("https://agilenotepad.azure-mobile.net/", "");
private IMobileServiceTable<Profile> profileTable;
profileTable = App.MobileService.GetTable<Profile>();
List<Profile> profileUsers = await (from p in profileTable
where p.IdUser == MainSettings.user.UserId
select p).ToListAsync();
function read(query, user, request) {
request.execute(); }
45. Funkcjonalności
• Uwierzytelnianie
• Stworzenie profilu
• Dodanie/usunięcie grupy
• Wyświetlenie grup do których się należy lub się
stworzyło
• Dodanie/usunięce zadania z grupy
• Dołączenie/usunięcie użytkownika z grupy
• Poinformowanie grupowiczy o nowym zadaniu
• Wysłanie maila informującego o zadaniach
46. Kod – pobranie zadania z
grupy
taskTable = App.MobileService.GetTable<Job>();
MobileServiceTableQuery<Job> query = taskTable.Where(x =>
x.IdGroup == group.id);
47. Kod dołączenie użytkownika
do grupy
connectTable = App.MobileService.GetTable<Connect>();
await connectTable.InsertAsync(new Connect { IdGroup = group.id, IdUser
= id });
profileTable = App.MobileService.GetTable<Profile>();
List<Profile> l = await profileTable.Where(x => x.IdUser ==
id).Take(1).ToListAsync();
48. Co można zrobić po stronie
serwera
• Walidacja • Czy grupa istnieje
• Czy użytkownik już istnieje
• Selekcja
• Pobieranie grup do których należy
grupowicz
• Pobranie grup których właścicielem jest
grupowicz
• Notyfikacje • Wysłanie do wszyskich członków
grupy informację o dodaniu
zadania do grupy
• Potwierdzenie zmiany profilu
50. function read(query, user, request) {
if(request.parameters.kindQuery === "PeopleInGroup")
{
var sql = 'SELECT p.id,p.Name,p.Email,p.IdUser,p.channel FROM
[agilenotepad].[Profile] p,[agilenotepad].[Connect] c WHERE p.IdUser =
c.IdUSer AND c.IdGroup = ?;';
mssql.query(sql, [request.parameters.numberGroup], {
success: function(results) {
request.respond(statusCodes.OK, results);
}
});
}
else
request.execute();
}
51. Po za tym
• Modyfikowad żądanie
• Modyfikowad odpowiedź
• Walidowad dane
• Odczytywad i zapisywad dane osobno
• Używad autoryzacji użytkownika
• Używad notyfikacji push
• Wysyład dodatkowe żądania HTTP
• Wychwytywad błedy i debugowad kod
52. Funkcjonalności
• Uwierzytelnianie
• Stworzenie profilu
• Dodanie/usunięcie grupy
• Wyświetlenie grup do których się należy lub się
stworzyło
• Dodanie/usunięce zadania z grupy
• Dołączenie/usunięcie użytkownika z grupy
• Poinformowanie grupowiczy o nowym zadaniu
• Wysłanie maila informującego o zadaniach
55. Notyfikacje Push – aplikacja
Notyfikacje push – wysyłanie informacji wszystkim członką
grupy
DEMO
56. function insert(item, user, request) {
console.log(item.id);
request.execute(
{
success: function() {
var sql = "SELECT p.channel FROM [agilenotepad].[Job]
j,[agilenotepad].[Connect] c, [agilenotepad].[Profile] p WHERE p.IdUser = c.IdUser AND
c.IdGroup = j.IdGroup AND j.id = ?";
mssql.query(sql, [item.id], {
success: function(results) {
if (results.length > 0) {
for(var i=0;0< results.length;i++){
push.wns.sendToastText04(results[i].channel, {
text1: 'new task'
}, {
success: function(pushResponse) {
console.log("Sent push:", pushResponse);
}
});
}
}
}
}); request.respond();
}
}
);
}
57. Funkcjonalności
• Uwierzytelnianie
• Stworzenie profilu
• Dodanie/usunięcie grupy
• Wyświetlenie grup do których się należy lub się
stworzyło
• Dodanie/usunięce zadania z grupy
• Dołączenie/usunięcie użytkownika z grupy
• Poinformowanie grupowiczy o nowym zadaniu
• Wysłanie maila informującego o zadaniach
Azure Mobile Services to :- DATASCHEDULERPUSHIDENTITYCONFIGURESCALELOGS
Kroki po manage.windowsazure.comLogowanie do konta AzureStworzenie usługi Mobile Services (z bazą danych)Instalacja SDKStworzenie projektu aplikacji na W8, dwie możliwości nowa lub istniejącaDodanie odwołania do Mobile ServicesMożemy zacząć pisać appke wykorzystująć Azure Mobile Services
Kroki po manage.windowsazure.comLogowanie do konta AzureStworzenie usługi Mobile Services (z bazą danych)Instalacja SDKStworzenie projektu aplikacji na W8, dwie możliwości nowa lub istniejącaDodanie odwołania do Mobile ServicesMożemy zacząć pisać appke wykorzystująć Azure Mobile Services
Kroki po manage.windowsazure.comLogowanie do konta AzureStworzenie usługi Mobile Services (z bazą danych)Instalacja SDKStworzenie projektu aplikacji na W8, dwie możliwości nowa lub istniejącaDodanie odwołania do Mobile ServicesMożemy zacząć pisać appke wykorzystująć Azure Mobile Services
Kroki po manage.windowsazure.comLogowanie do konta AzureStworzenie usługi Mobile Services (z bazą danych)Instalacja SDKStworzenie projektu aplikacji na W8, dwie możliwości nowa lub istniejącaDodanie odwołania do Mobile ServicesMożemy zacząć pisać appke wykorzystująć Azure Mobile Services
Po wejściu do wybranego projektu Mobile Services możemy ściagnąć przykładowe projekty i tutoriale do WP8, W8, Android, iOS, HTML/Javascript.Co możemy zobaczyć w :DASHBOARDWykresy wykorzystania usługi Generate schemaPodstawowe informacje o usłudze jak adres, lokacje, id subscription itp.DATAPrzejście do odpowiednich tabelSCHEDULERUstawienia dla scheduleraPUSHUstawienia dla odpowiednich notyfikacji jak : MS, Apple, Google.IDENTITYUstawinie dla uwierzytelniania jak FB, Googl, MS i TwitterCONFIGUREUstawienia bazy danychDynamic SchemaMonitoringSCALEUstawienie czy system ma być skalowalny i na ile maszynZmiana typu bazy danychLOGInformację o zapisywanych logach przez Nas i automatycznie przez usługe
Tabele tworzymy ręcznie a kolumny automatycznie.Każda tabla posiada 4 skrypty : create, update, read i deleteMożna ustawiać permission na tabele na każdą z operacji : everyone, anybody with the Application Key, Only Authenticated User, Only Scripts and Admins.
Tabele tworzymy ręcznie a kolumny automatycznie.Każda tabla posiada 4 skrypty : create, update, read i deleteMożna ustawiać permission na tabele na każdą z operacji : everyone, anybody with the Application Key, Only Authenticated User, Only Scripts and Admins.
Przykład kodu z tabelą
Zaczynamy od dodania możliwości tworzenia grupy w aplikacji
Zdebugować aplikacje
Wczytywanie grup (READ)Dodanie kodu dla tytułu (XAML)Dodanie listy do wyświetlenia grup (XAML)Kod wczytujący grupy (VM)
Mocno wspomagane skryptem po stronie serwera
Wczytywanie grup (READ)Dodanie kodu dla tytułu (XAML)Dodanie listy do wyświetlenia grup (XAML)Kod wczytujący grupy (VM)
Get started with authentication in Mobile ServicesTrzeba się każdorazowo logowaćStandardowo mamy dostępne 4 sposoby logowania.Linki :Microsoft AccountFacebook loginTwitter loginGoogle login
Należy stworzyć aplikacje, dodać stronę i pobrać API Key
Należy stworzyć aplikacje, dodać stronę i pobrać API Key
Co trzeba zrobic po stronie Mobile Servcies :Dodać klucze do FBUstawić usprawnienia do tabelPo ustawieniu uprawnień na tabele przy usuwaniu pokazać jaki jest wynik kiedy tego nie dopilnujemy
Co trzeba zrobic po stronie Mobile Servcies :Dodać klucze do FBUstawić usprawnienia do tabelPo ustawieniu uprawnień na tabele przy usuwaniu pokazać jaki jest wynik kiedy tego nie dopilnujemy
Dodanie strony do uwierzytelnianiaNadanie mu statusu pierwszej uruchamianejStworzenie miejsca do przetrzymywania inforamcji o użytkowniku zalogowanymDodanie kodu do logowania
INSERT function insert(item, user, request) {request.execute();}UPDATE function update(item, user, request) {request.execute();}DELETEfunction del(id, user, request) {request.execute();}READfunction read(query, user, request) {request.execute();}
function read(query, user, request) { query.where({ IdUser: user.userId }); request.execute();}
Rezerwacja nazwy w sklepieRejstracja w aplikacji , pobranie certyfikatuWybranie aplikacjiPobranie klucza do noyfikacji Push