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
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, 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)); }
}
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.
Integrationsnavn: AppIntegration
Denne integration bliver brugt til diverse grundlæggende kald.
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
appInForegroundEventRecieved()
Eventet bliver kaldt hver gang appen kommer i forgrunden på brugerens telefon, og når appen startes og derved også kommer i forgrunden
Integrationsnavn: PushNotificationIntegration
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.
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.
Integrationsnavn: CalendarIntegration
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
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.
Integrationsnavn: QrScannerIntegration
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.
publishQrResultEvent(message: string)
Hvis kameraet scanner en QR-kode vil dette event blive kaldt og returnere værdien af QR-koden.
Integrationsnavn: GeofenceIntegration
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.
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.
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)
Integrationsnavn: NFCIntegration
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.
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.
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.
Integrationsnavn: BiometricIntegration
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.