Timeplan webapp API documentation

Generelt

I mobilapplikationen er der lavet en række "integrations" som tjener hver deres formål, f.eks. push notifikationer eller kalender.
Hver metode i de respektive integrationer kan kaldes direkte på selve integrationen med "dot" annotation

Returværdier fra metodekald

For at modtage resultatet fra et metodekald, skal der laves en JavaScript-metode der hedder det samme som request metodekaldet + Result. Metoden skal desuden ligge i et scope der matcher navngivningen på scopet for den kaldte metode minus Integration.

Det er vist lettest forklaret gennem et eksempel, hvor farvekoder angiver sammenhængen.

Hvis følgende metode kaldes fra websiden:

PushNotificationIntegration.getLastPublishedToken();

vil resultatet af metodekaldet blive returneret via et kald til PushNotification.getLastPublishedTokenResult, så på websiden skal følgende være defineret:

var PushNotification = { getLastPublishedTokenResult(token) { console.log('Push notification token received by request: ' + token); } }

I dette dokument vil ovenstående metode være specificeret således:

getLastPublishedToken(): string

Specifikationen vil altså angive returværdien direkte i specifikationen, mens denne reelt vil komme som input til den tilhørende Result metode.

Events

Events, der kaldes fra appen, har ikke nogen returværdi, da det er kald fra appen til webappen og denne forventes ikke at skulle aflevere data tilbage til appen.

Eksempel:

var PushNotification = { notificationReceivedEvent(arguments) { console.log('Push notification received: ' + JSON.stringify(arguments)); } }

Events uden scope

Der er to events i systemet, som bliver kaldt udenfor scope, da disse ikke ligger i en integration.

appIntegrationsAreReady()

Når alle integrationer i appen er loadet korrekt ind, kaldes denne metode for at fortælle webappen, at appen er klar til at blive kaldt. Først efter denne metode er blevet kaldt, må webappen kalde webAppIsReady(), som forklares i næste sektion. Det er normalt ikke nødvendigt at lytte efter dette event, da appen typisk vil være loadet langt hurtigere end webappen, som jo skal loades fra en ekstern server. Men fejler kaldet til webAppIsReady(), er det sikkert fordi appen endnu ikke er færdigloadet.

appErrorEvent(error): { message: string: AdditionalDetails: string }

Opstår der en fejl i appen i forbindelse med et kald fra webappen til appen, vil eventuelle exceptions blive fanget og overført til websiden via dette event.

App

Integrationsnavn: AppIntegration

Denne integration bliver brugt til diverse grundlæggende kald.

Metodekald

webAppIsReady(): void

Webappen forventes at kalde denne metode så snart den er klar til at modtage events fra appen. Først når denne metode er kaldt ved appen, at webappen er initialiseret og klar til at modtage events.

setAppUrl(url: string): bool

Denne metode kan benyttes til at styre den URL, som appen skal starte fra, næste gang appen startes. Metoden returnerer true, når opstarts-URL'en er ændret.

resetAppUrl(): void

Kald denne metode for at få appen til at start på den URL, som den er "født med" (kan variere mellem testmiljø og produktion).

restartApp(): void

Kald denne metode og appen vil reload og åbne den gemte URL. Anvend gerne denne metode hvis der ikke er internet på mobilen og brugeren skal prøve at reload appen igen.

version(): string

Returnerer appens versionsnummer (f.eks. 1.0.0).

download(string url, string fileName): void

Downloader fil på url'ens placering, og angiver fileName som fil navn.

downloadWithAuth(string url, string fileName, string cookieName): void

Downloader fil på url'ens placering, og angiver fileName som fil navn.

Værdien fra "cookieName" cookie'en blive sendt med i requesten. Værdien sendes i "Authorization" headeren med "Bearer " foran.

openExternalBrowser(string url): void

Åbner et eksternt browser window med den angivne url i parameteren.

requestReview(): void

Åbner en dialog i appen, hvor brugeren kan give en rating til appen.
Man får ikke noget resultat fra dette kald.
Dialogen vil maks blive vist 3 gange pr. 365 dage.

isStorageAccessGranted(): bool

Tjekker om der er givet adgang til at tilgå fil biblioteket på mobilen. (Gælder kun for Android. iOS behøver ikke denne permission og returnere altid true)

requestStorageAccess(): bool

Åbner default permission request og giver brugeren mulighed for at give adgang til fil biblioteket (Gælder kun for Android. iOS behøver ikke denne permission og returnere altid true

Events

appInForegroundEventRecieved()

Eventet bliver kaldt hver gang appen kommer i forgrunden på brugerens telefon, og når appen startes og derved også kommer i forgrunden

Push notifikationer

Integrationsnavn: PushNotificationIntegration

Metodekald

initialize(): bool

Initialisering af push notifikationer. Denne metode skal kaldes, når brugeren ønsker at kunne modtage push notifikationer. Når metoden kaldes, vil der på iOS blive spurgt om lov til at vise push notifikationer. På Android sker der ikke noget. Metoden returnerer true når kaldet er afsluttet.

getLastPublishedToken(): string

Returnerer en string, der indeholder det token, der skal anvendes til at sende push notifikationer til mobilen med.

Events

tokenReceivedEvent(token: string)

Kaldes med et token, der kan anvendes til at sende push notifikationer til mobilen med.

notificationReceivedEvent(notification: any)

Kaldes med den notifikation, som er modtaget af mobilen. Indholdet af denne er det indhold, der sendes fra backenden. Der vil desuden altid være en speciel property tilknyttet, appWasLaunchedFromNotification, som angiver om appen kom i forgrunden ved at der blev trykket på notifikationen eller om appen allerede var i forgrunden, da notifikationen blev modtaget.

Kalender

Integrationsnavn: CalendarIntegration

Beskrivelse af opbevaring af data på telefon

Tilføjes der et event på telefonen, vil der i telefonens egne lokale hukommelse gemmes et key pair hvor EventId'et er key og dets værdi er SyncId'et.
På den måde vil applikationen altid kunne finde et tilhørende SyncId for et gemt event, hvis applikationen ikke har været slettet.
Slettes applikationen fra telefonen vil den lokale hukommelse for applicationen blive slettet og alt gemt data vil være væk*.
*Hvis telefonen køre på en Android version der er nyere end Android 6.0(API 23) som anvender "Auto Backup" vil det gemte data forblive på telefonen. Auto Backup kan slås fra på telefonen ved at følge denne guide: https://developer.android.com/guide/topics/data/autobackup

Metodekald

isAccessGranted(): bool

Returnerer en boolean der angiver, om der er adgang til kalenderen.

requestAccess(): bool

Spørger brugeren om adgang til mobilens kalender. Returnerer en boolean der angiver, om kaldet til systemet gik godt eller skidt. Så værdien kan ikke bruges til at afgøre, om der er adgang til kalenderen. Her er et efterfølgende kald til isAccessGranted() nødvendigt. Bliver adgang til kalenderen afvist 2 gange vil der ved efterfølgende kald til requestAccess blive redirectet over i indstillinger på telefonen hvor brugeren så kan give adgang.
Dette gøres da der ikke kan spørges om adgang via. den normale dialog i appen mere end 2 gange.

listCalendars(): { id: string, name: string }[]

Returnerer en liste af tilgængelige kalendere på telefonen. For hver kalender returneres id og name.

addEvent(calendarId: string, name: string, description: string, syncId: string, startDateTime: Date, endDateTime: Date): {result: bool, syncId: string, error: string}

Tilføjer et event til kalenderen med det angivne calendarId og syncId. Returnerer et objekt hvori result er true hvis eventet er tilføjet og false hvis det er mislykkedes, syncId der matcher det i parameteren, og error vil indeholde en fejlbesked hvis kaldet er fejlet. {result: bool, syncId: string, error: string}

deleteEvent(eventId: string): {result: bool, eventId: string, error: string}

Sletter eventet med den givne eventId. Returnerer et objekt med samme beskrivelse som addEvent returkaldet {result: bool, eventId: string, error: string}

listEvents(calendarId: string, from: Date, to: Date): { calendarId: string, eventId: string, title: string, description: string, syncId: string, startDate: Date, endDate: Date }[]

Returnerer liste af events indenfor tidsrummet defineret af de to parametre from og to fra den givne kalender.

Qr-kode Scanner

Integrationsnavn: QrScannerIntegration

Metodekald

isCameraAccessGranted(): bool

Returnerer en boolean der angiver, om der er adgang til kameraet.

requestCameraAccess(): bool

Spørger brugeren om adgang til mobilens kamera. Returnerer en boolean der angiver, om kaldet til systemet gik godt eller skidt. Så værdien kan ikke bruges til at afgøre, om der er adgang til kameraet. Her er et efterfølgende kald til IsCameraAccessGranted() nødvendigt.

startQrCodeScanner()

Åbner kameraet på telefonen og begynder at scanne efter en QR-kode. Når kameraet har scannet en QR-kode vil kameraet igen blive lukket og returnere til den side hvor funktionen blev kaldt fra.

Events

publishQrResultEvent(message: string)

Hvis kameraet scanner en QR-kode vil dette event blive kaldt og returnere værdien af QR-koden.

Geofence

Integrationsnavn: GeofenceIntegration

Beskrivelse geofence

Geofence kan opsættes ved at specificere koordinaterne for et bestemt punkt og angive en radius som så tilsammen udgør et geofence område.
For at anvende geofence kræver det tilladelse til at modtage brugerens lokation. Brugerens lokation vil blive opdateret 1 gang i minuttet.
Går brugeren ind, ud eller forbliver i mere end 5 minutter i et område vil der blive kaldt et event.
Tilføjes der et geofence bliver det gemt lokalt på brugerens telefon. Ved initiering af geofence integrationen vil de gemte geofences blive tilføjet og overvåget. De gemte geofences kan slettes fra brugerens telefon igen.

Metodekald

IsLocationAccessGranted(): bool

Returnerer en boolean der angiver, om der er adgang til brugerens lokation.

RequestLocationAccess(): bool

Spørger brugeren om adgang til mobilens lokation. Returnerer en boolean der angiver, om kaldet til systemet gik godt eller skidt. Så værdien kan ikke bruges til at afgøre, om der er adgang til lokationen. Her er et efterfølgende kald til IsLocationAccessGranted() nødvendigt.

InitGeofence(): {result: bool, error: string}

Initiere geofence klienten i appen og starter en lokations service der henter brugerens lokation hvert minut. Gemte geofences vil blive hentet fra telefonens hukommelse og overvågning af dem startet
Returnere et objekt hvori result er true hvis Initialisering lykkedes. Hvis Initialiseringen fejler vil result være false, og objektet vil indeholde en error property med en tilhørende fejl besked.

AddGeofence(double Latitude, double Longitude, float Radius, string Name): {result: bool, geofenceName: string, error: string}

Tilføjer, gemmer og starter overvågning af et geofence på telefonen med de angivne parametre. Geofencet vil have midtpunkt i de angivne koordinater og en radius på størrelse med den givne radius parameter.
Geofence koordinaterne skal være præcise og angives med . inden kommatal (engelsk format) eks: (Latitude=10.12342, Longitude=20.23234)
Der kan maksimalt være 100 geofences på en telefon, og der må ikke være geofences med samme navn.
Returnere et objekt hvori result er true hvis tilføjelsen af geofencet lykkedes. Hvis tilføjelsen fejler vil result være false, og objektet vil indeholde en error property med en tilhørende fejl besked.

GetCreatedGeofence(): {result: bool, geofences: List<{double Latitude, double Longitude, float Radius, string Name}>}

Returnerer liste af geofences der indeholder latitude, longitude, radius og navn.
Result er altid true, da den blot returnerer en tom liste, hvis ingen geofences er oprettet.

RemoveGeofences(): bool

Stopper overvågelsen af alle geofences og fjerner dem fra telefonens hukommelse
Returnere true hvis kaldet lykkedes, hvis ikke false.

SetNotificationUrl(string url) : {result: bool}

Sætter den url der vil blive kaldt ved et geofence event.

GetActiveGeofences(): List>

Returnere et array/liste af strenge med navnet på de geofences som brugeren er indenfor.

Events

geofenceEventRecieved() : {action: string, geofenceName: string}

Bevæger brugeren sig ind eller ud af et geofence område eller har brugeren opholdt sig indefor et geofence område i mere end 5 minutter, så vil et eventet blive kaldt og returnere et objekt med en action der beskriver brugerens interaktion med geofencet og et geofenceName som er navnet på det påvirket geofence.
Er appen ikke i forgrunden vil der kunne laves et netværks kald til en bestemt url med samme retur objekt (Skal diskuteres med Timeplan)

NFC

Integrationsnavn: NFCIntegration

Beskrivelse af NFC

NFC er ikke tilgængeligt på alle slags telefoner, især billigere android telefoner har ikke en NFC læser. Så kald altid isNFCSupported() for at tjekke om brugerens telefon er kompatibel med læsning af NFC tags.
Læsning af NFC tags har dets begrænsninger, når man anvender en telefon til læsning. Her er listen af understøttet NFC tags som kan læses: NDEF, MIFARE(kun Android), ISO/IEC 14443, ISO/IEC 15693, ISO/IEC 7816(Kun Android) & FeliCa.

Metodekald

isNFCSupported(): boolean

Returnere en boolean der angiver om NFC er understøttet på brugerens enhed.

startListening(): { success: boolean; error?: string }

Starter NFC scanneren. Returnere et objekt med success der angiver om det lykkedes at starte NFC scanneren.

stopListening(): { success: boolean; error?: string }

Stopper NFC scanneren. Returnere et objekt med success der angiver om det lykkedes at stoppe NFC scanneren.

Events

nfcTagScannedEvent(result): { success: boolean; error?: string; result?: Array<{ messsage: string | null; mimeType: string; typeFormat: "Empty" | "WellKnown" | "Mime" | "Uri" | "External" | "Unknown" | "Unchanged" | "Reserved"; }> }

Lykkedes det at scanne et NFC tag vil dette event blive kaldt.
Returnere et objekt med success der angiver om det lykkedes at scanne et NFC tag.
Hvis success er true vil der være et result objekt med en message, mimeType og typeFormat property.
Hvis success er false vil der være en error property med en tilhørende fejlbesked.

Biometric

Integrationsnavn: BiometricIntegration

Metodekald

isSupported(): boolean

Returnere en boolean der angiver om Biometrics er understøttet på brugerens enhed.

exists(): boolean

Returnere en boolean der angiver om der er gemt noget med biometrics på brugerens enhed.

save(value: any): boolean

Gemmer en værdi med biometrics på brugerens enhed. Returnere en boolean der angiver om det lykkedes at gemme værdien.

load(): {success: boolean, data?: any}

Anmoder brugeren om at bruge fingeraftryk/face id for at hente en værdi med biometrics på brugerens enhed. Hvis success er true vil der være et data objekt med den gemte værdi. Hvis success er false lykkedes det ikke at hente værdien

delete(): boolean

Sletter en værdi med biometrics på brugerens enhed. Returnere en boolean der angiver om det lykkedes at slette værdien.

Arkitektur