<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ionic vue (android/ios) Archieven - Utilewebsites</title>
	<atom:link href="https://www.utilewebsites.nl/section/ionic-vue-android-ios/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.utilewebsites.nl/section/ionic-vue-android-ios/</link>
	<description></description>
	<lastBuildDate>Sun, 13 Jul 2025 10:03:32 +0000</lastBuildDate>
	<language>nl-NL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>Veilige Headless Architectuur met Ionic Vue en een PHP JWT-API</title>
		<link>https://www.utilewebsites.nl/knowledgebase/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api/</link>
		
		<dc:creator><![CDATA[UtileWebsites]]></dc:creator>
		<pubDate>Sun, 13 Jul 2025 09:29:17 +0000</pubDate>
				<guid isPermaLink="false">https://www.utilewebsites.nl/?post_type=wz_knowledgebase&#038;p=5389</guid>

					<description><![CDATA[<p>Een handleiding voor het beveiligen van headless systemen met JSON Web Tokens. Inleiding: Waarom JWT voor Headless Beveiliging? Headless betekent dat uw backend uitsluitend data levert, zonder presentatie­laag—bijvoorbeeld een PHP-API die alleen JSON terugstuurt naar een mobiele app of JavaScript-frontend. In zo’n stateless omgeving werkt traditionele sessie­authenticatie niet soepel: de server moet elke request onafhankelijk verwerken zonder gebruikers­sessies bij te houden. JSON Web Tokens (JWT) bieden een compacte, self-contained en veilige manier om autorisatie­gegevens mee te sturen. De client ontvangt na inloggen een token dat bij elke API-call wordt meegestuurd, waardoor uw backend eenvoudig kan verifiëren of de gebruiker geautoriseerd&#160;<a href="https://www.utilewebsites.nl/knowledgebase/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api/" class="read-more">Continue Reading</a></p>
<p>Het bericht <a href="https://www.utilewebsites.nl/knowledgebase/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api/">Veilige Headless Architectuur met Ionic Vue en een PHP JWT-API</a> verscheen eerst op <a href="https://www.utilewebsites.nl">Utilewebsites</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Een handleiding voor het beveiligen van headless systemen met JSON Web Tokens.</p>



<h3 class="wp-block-heading"><strong>Inleiding: Waarom JWT voor Headless Beveiliging?</strong></h3>



<figure class="wp-block-image size-large is-resized"><a href="https://www.utilewebsites.nl/wp-content/uploads/2025/07/jwt_headless_app_ionic_vue3.jpg"><img fetchpriority="high" decoding="async" width="1024" height="877" src="https://www.utilewebsites.nl/wp-content/uploads/2025/07/jwt_headless_app_ionic_vue3-1024x877.jpg" alt="" class="wp-image-5401" style="width:360px;height:auto" srcset="https://www.utilewebsites.nl/wp-content/uploads/2025/07/jwt_headless_app_ionic_vue3-1024x877.jpg 1024w, https://www.utilewebsites.nl/wp-content/uploads/2025/07/jwt_headless_app_ionic_vue3-300x257.jpg 300w, https://www.utilewebsites.nl/wp-content/uploads/2025/07/jwt_headless_app_ionic_vue3-768x658.jpg 768w, https://www.utilewebsites.nl/wp-content/uploads/2025/07/jwt_headless_app_ionic_vue3-1536x1316.jpg 1536w, https://www.utilewebsites.nl/wp-content/uploads/2025/07/jwt_headless_app_ionic_vue3.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph"><strong>Headless</strong> betekent dat uw backend uitsluitend data levert, zonder presentatie­laag—bijvoorbeeld een PHP-API die alleen JSON terugstuurt naar een mobiele app of JavaScript-frontend. In zo’n stateless omgeving werkt traditionele sessie­authenticatie niet soepel: de server moet elke request onafhankelijk verwerken zonder gebruikers­sessies bij te houden.</p>



<p class="wp-block-paragraph">JSON Web Tokens (JWT) bieden een compacte, self-contained en veilige manier om autorisatie­gegevens mee te sturen. De client ontvangt na inloggen een token dat bij elke API-call wordt meegestuurd, waardoor uw backend eenvoudig kan verifiëren of de gebruiker geautoriseerd is.</p>



<h3 class="wp-block-heading"><strong>De Anatomie van een JWT</strong></h3>



<ul class="wp-block-list">
<li><strong>Header:</strong> Bevat metadata zoals het algoritme (<code>alg</code>) en het type token (<code>typ</code>).</li>



<li><strong>Payload:</strong> Bevat de “claims”—gegevens over de gebruiker (<code>sub</code>), de issuer (<code>iss</code>), en de expiration (<code>exp</code>). U kunt hier ook rollen of permissies toevoegen.</li>



<li><strong>Signature:</strong> Een cryptografische handtekening over header en payload, met uw geheime sleutel, om manipulatie te voorkomen.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Deel 1: De PHP Backend – Een JWT API Bouwen</strong></h3>



<p class="wp-block-paragraph">In dit deel bouwen we de PHP-backend die tokens uitgeeft en valideert. We gebruiken <code>firebase/php-jwt</code> om JWT’s aan te maken en te controleren, en zorgen voor strikte claim- en algoritme­validatie.</p>



<ul class="wp-block-list">
<li><strong>Structuur:</strong>
<ul class="wp-block-list">
<li><code>api/login.php</code>: Valideert inloggegevens en geeft een JWT (access + refresh) terug.</li>



<li><code>api/refresh.php</code>: Ververst het access token met een geldig refresh token.</li>



<li><code>api/secure-data.php</code>: Beveiligd endpoint; alleen toegankelijk met een geldig access token.</li>



<li><code>.env</code>: Bevat uw geheime sleutels (<code>JWT_SECRET</code> en <code>JWT_REFRESH_SECRET</code>).</li>
</ul>
</li>



<li><strong>Installatie:</strong><br>    <pre class="wp-block-code"><code>composer require firebase/php-jwt</code></pre><br>  </li>
</ul>



<h4 class="wp-block-heading"><strong>1. Token Genereren (login.php)</strong></h4>



<pre class="wp-block-code"><code>&lt;?php
require __DIR__ . '/vendor/autoload.php';
use Firebase\JWT\JWT;

// Laad geheim uit .env
$secret       = getenv('JWT_SECRET');
$refreshSecret= getenv('JWT_REFRESH_SECRET');

// Valideer gebruiker...
if (validUser($_POST&#91;'email'], $_POST&#91;'password'])) {
    $now = time();
    $accessPayload = &#91;
        'iss' =&gt; 'https://uw-domein.nl',
        'aud' =&gt; 'https://uw-domein.nl',
        'iat' =&gt; $now,
        'exp' =&gt; $now + 900,        // 15 minuten
        'sub' =&gt; getUserId(),
        'role'=&gt; 'user'
    ];
    $refreshPayload = &#91;
        'iss' =&gt; 'https://uw-domein.nl',
        'aud' =&gt; 'https://uw-domein.nl',
        'iat' =&gt; $now,
        'exp' =&gt; $now + 604800,     // 1 week
        'sub' =&gt; getUserId()
    ];
    $accessToken  = JWT::encode($accessPayload, $secret, 'HS256');
    $refreshToken = JWT::encode($refreshPayload, $refreshSecret, 'HS256');
    echo json_encode(&#91;'accessToken'=&gt;$accessToken, 'refreshToken'=&gt;$refreshToken]);
    exit;
}
http_response_code(401);
echo json_encode(&#91;'error'=&gt;'Ongeldige inloggegevens']);
</code></pre>



<h4 class="wp-block-heading"><strong>2. Token Valideren (secure-data.php)</strong></h4>



<pre class="wp-block-code"><code>&lt;?php
require __DIR__ . '/vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

$secret = getenv('JWT_SECRET');
$auth   = $_SERVER&#91;'HTTP_AUTHORIZATION'] ?? '';
if (preg_match('/Bearer\s(\S+)/', $auth, $m)) {
    try {
        $token = $m&#91;1];
        $decoded = JWT::decode($token, new Key($secret, 'HS256'));
        // Controleer iss en aud
        if ($decoded-&gt;iss !== 'https://uw-domein.nl' || $decoded-&gt;aud !== 'https://uw-domein.nl') {
            throw new Exception('Invalid token issuer or audience');
        }
        echo json_encode(&#91;'data'=&gt;'Beveiligde informatie']);
        exit;
    } catch (Exception $e) {
        http_response_code(401);
        echo json_encode(&#91;'error'=&gt;'Toegang geweigerd']);
        exit;
    }
}
http_response_code(401);
echo json_encode(&#91;'error'=&gt;'Geen token gevonden']);
</code></pre>



<h4 class="wp-block-heading"><strong>3. Refresh Endpoint (refresh.php)</strong></h4>



<pre class="wp-block-code"><code>&lt;?php
require __DIR__ . '/vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

$refreshSecret = getenv('JWT_REFRESH_SECRET');
$body = json_decode(file_get_contents('php://input'), true);
try {
    $decoded = JWT::decode($body&#91;'refreshToken'], new Key($refreshSecret, 'HS256'));
    $now = time();
    $newAccess = &#91;
        'iss'=&gt;'https://uw-domein.nl','aud'=&gt;'https://uw-domein.nl',
        'iat'=&gt;$now,'exp'=&gt;$now+900,'sub'=&gt;$decoded-&gt;sub
    ];
    $token = JWT::encode($newAccess, getenv('JWT_SECRET'), 'HS256');
    echo json_encode(&#91;'accessToken'=&gt;$token]);
} catch (Exception $e) {
    http_response_code(401);
    echo json_encode(&#91;'error'=&gt;'Ongeldig refresh token']);
}
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Deel 2: De Ionic Vue App – API Communicatie met Axios</strong></h3>



<p class="wp-block-paragraph">In dit deel bouwen we de frontend in Ionic Vue. We installeren Axios, maken een service voor al onze API-calls inclusief refresh-token-rotatie, en implementeren veilige opslag.</p>



<h4 class="wp-block-heading"><strong>1. Secure Storage &amp; Axios Setup</strong></h4>



<p class="wp-block-paragraph">Installeer eerst secure storage plugin voor Capacitor:</p>



<pre class="wp-block-code"><code>npm install @capacitor-community/secure-storage</code></pre>



<pre class="wp-block-code"><code>// src/services/AxiosService.js
import axios from 'axios';
import { SecureStoragePlugin } from '@capacitor-community/secure-storage';

const API_URL = import.meta.env.VITE_API_URL || 'https://www.jouw-domein.nl/api';
const storage = new SecureStoragePlugin();

const axiosInstance = axios.create({ baseURL: API_URL, headers:{'Content-Type':'application/json'} });

axiosInstance.interceptors.request.use(async config =&gt; {
  const token = await storage.get({ key:'accessToken' });
  if (token.value) config.headers.Authorization = `Bearer ${token.value}`;
  return config;
});

export default axiosInstance;
</code></pre>



<h4 class="wp-block-heading"><strong>2. Login &amp; Token Opslag (<code>LoginPage.vue</code>)</strong></h4>



<pre class="wp-block-code"><code>&lt;script setup&gt;
import { SecureStoragePlugin } from '@capacitor-community/secure-storage';
import axiosService from '@/services/AxiosService';
const storage = new SecureStoragePlugin();

async function handleLogin() {
  const resp = await axiosService.post('/login.php', params);
  await storage.set({ key:'accessToken', value:resp.data.accessToken });
  await storage.set({ key:'refreshToken', value:resp.data.refreshToken });
  router.push('/tabs/dashboard');
}
&lt;/script&gt;
</code></pre>



<h4 class="wp-block-heading"><strong>3. Refresh Logic</strong></h4>



<p class="wp-block-paragraph">In uw interceptor kunt u bij 401 automatisch een refresh-call doen:</p>



<pre class="wp-block-code"><code>axiosInstance.interceptors.response.use(null, async error =&gt; {
  if (error.response?.status === 401) {
    const refresh = await storage.get({key:'refreshToken'});
    const { data } = await axios.post('/refresh.php', { refreshToken: refresh.value });
    await storage.set({key:'accessToken', value:data.accessToken});
    error.config.headers.Authorization = `Bearer ${data.accessToken}`;
    return axiosInstance.request(error.config);
  }
  return Promise.reject(error);
});</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><strong>Best Practices &amp; Veiligheid</strong></h3>



<ul class="wp-block-list">
<li>Gebruik altijd HTTPS voor transportbeveiliging.</li>



<li>Bewaar tokens in veilige opslag (bv. Capacitor Secure Storage), niet in localStorage.</li>



<li>Implementeer access- en refresh-tokenrotatie voor kortlevende sessies.</li>



<li>Valideer altijd <code>iss</code>, <code>aud</code> en <code>alg</code> aan serverzijde.</li>



<li>Beperk token-payload tot minimaal noodzakelijke data.</li>
</ul>



<h3 class="wp-block-heading"><strong>Conclusie</strong></h3>



<p class="wp-block-paragraph">Deze gids onderstreept dat echte beveiliging begint bij een “security-first” architectuur: korte levensduur tokens, dual-tokenstrategie, veilige client-opslag en strikte server-validatie. Met deze lagenaanpak bouwt u een veerkrachtige, productieklare headless applicatie die bestand is tegen moderne dreigingen.</p>


<p>```</p><p>Het bericht <a href="https://www.utilewebsites.nl/knowledgebase/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api/">Veilige Headless Architectuur met Ionic Vue en een PHP JWT-API</a> verscheen eerst op <a href="https://www.utilewebsites.nl">Utilewebsites</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Stappen om een PDF te downloaden en weer te geven in een Ionic Vue-app (Android/iOS):</title>
		<link>https://www.utilewebsites.nl/knowledgebase/stappen-om-een-pdf-te-downloaden-en-weer-te-geven-in-een-ionic-vue-app-android-ios/</link>
		
		<dc:creator><![CDATA[UtileWebsites]]></dc:creator>
		<pubDate>Sat, 30 Nov 2024 09:20:47 +0000</pubDate>
				<guid isPermaLink="false">https://www.utilewebsites.nl/?post_type=wz_knowledgebase&#038;p=5168</guid>

					<description><![CDATA[<p>2. Component Code (Web en Mobile)Voeg de volgende code toe als component in je Ionic Vue-project: 3. Toelichting 4. Compatibiliteit</p>
<p>Het bericht <a href="https://www.utilewebsites.nl/knowledgebase/stappen-om-een-pdf-te-downloaden-en-weer-te-geven-in-een-ionic-vue-app-android-ios/">Stappen om een PDF te downloaden en weer te geven in een Ionic Vue-app (Android/iOS):</a> verscheen eerst op <a href="https://www.utilewebsites.nl">Utilewebsites</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full is-resized"><a href="https://www.utilewebsites.nl/wp-content/uploads/2024/11/pdf_donwload_in_app_android_ios.jpg"><img decoding="async" width="411" height="471" src="https://www.utilewebsites.nl/wp-content/uploads/2024/11/pdf_donwload_in_app_android_ios.jpg" alt="" class="wp-image-5158" style="width:306px;height:auto" srcset="https://www.utilewebsites.nl/wp-content/uploads/2024/11/pdf_donwload_in_app_android_ios.jpg 411w, https://www.utilewebsites.nl/wp-content/uploads/2024/11/pdf_donwload_in_app_android_ios-262x300.jpg 262w" sizes="(max-width: 411px) 100vw, 411px" /></a></figure>

<ol class="wp-block-list">
<li><strong>Installeer Vereiste Packages</strong> Voeg de benodigde libraries toe aan je project:</li>
</ol>

<pre class="wp-block-code"><code>npm install pdfjs-dist @capacitor/filesystem @capacitor-community/http
</code></pre>

<p class="wp-block-paragraph">2. <strong>Component Code (Web en Mobile)</strong><br/>Voeg de volgende code toe als component in je Ionic Vue-project:</p>

<pre class="wp-block-code"><code>&lt;template>
  &lt;ion-page>
    &lt;ion-header>
      &lt;ion-toolbar>
        &lt;ion-title>PDF Viewer&lt;/ion-title>
      &lt;/ion-toolbar>
    &lt;/ion-header>
    &lt;ion-content class="ion-padding">
      &lt;ion-button @click="downloadAndRenderPdf">Download PDF&lt;/ion-button>
      &lt;!-- PDF.js rendering container -->
      &lt;div v-if="pdfUrl">
        &lt;canvas ref="pdfCanvas" style="width: 100%;">&lt;/canvas>
      &lt;/div>
    &lt;/ion-content>
  &lt;/ion-page>
&lt;/template>

&lt;script>
import { defineComponent, watch } from "vue";
import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent, IonButton } from "@ionic/vue";
import { Filesystem, Directory } from "@capacitor/filesystem";
import { CapacitorHttp } from "@capacitor/core";
import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf';

// Set the workerSrc to the imported worker
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
  "pdfjs-dist/build/pdf.worker.min.mjs",
  import.meta.url
).toString();

import { Capacitor } from '@capacitor/core';

// Add detailed platform and path logging
const platform = Capacitor.getPlatform();
console.log('Platform detection:', {
  platform,
  isAndroid: platform === 'android',
  isWeb: platform === 'web'
});

export default defineComponent({
  name: "TestpdfPage",
  components: {
    IonPage,
    IonHeader,
    IonToolbar,
    IonTitle,
    IonContent,
    IonButton,
  },
  data() {
    return {
      pdfUrl: null, // URL of the PDF to be rendered
    };
  },
  methods: {
    // Method to download and render the PDF
    async downloadAndRenderPdf() {
      try {
        console.log("Starting PDF download process...");

        const pdfUrl = "https://example.com/sample.pdf";
        const fileName = "temp.pdf";
        const dirPath = "downloaded";
        const savedFilePath = `${dirPath}/${fileName}`;

        console.log("Downloading PDF using CapacitorHttp from:", pdfUrl);

        // Clean up the existing directory
        try {
          await Filesystem.rmdir({
            path: dirPath,
            directory: Directory.Data,
            recursive: true,
          });
          console.log("Cleaned up existing directory");
        } catch (e) {
          console.log("No existing directory to clean up");
        }

        // Download PDF using native HTTP
        const response = await CapacitorHttp.get({
          url: pdfUrl,
          responseType: "arraybuffer",
        });

        console.log("Download response:", response);

        // Check if response.data is a string (Base64) or an ArrayBuffer
        let base64Data;
        if (typeof response.data === 'string') {
          // Data is already Base64-encoded
          base64Data = response.data;
          console.log("Received data is a Base64 string");
        } else {
          // Convert ArrayBuffer to Base64
          base64Data = this.arrayBufferToBase64(response.data);
          console.log("Converted ArrayBuffer to Base64");
        }

        console.log("Base64 data length:", base64Data.length);

        // Save to device storage
        try {
          await Filesystem.mkdir({
            path: dirPath,
            directory: Directory.Data,
            recursive: true,
          });
          console.log("Created directory for PDF");

          await Filesystem.writeFile({
            path: savedFilePath,
            data: base64Data,
            directory: Directory.Data,
          });

          console.log("File saved locally");

          // Check if the file exists and get its size
          const fileStat = await Filesystem.stat({
            path: savedFilePath,
            directory: Directory.Data,
          });

          console.log("File exists:", fileStat.uri);
          console.log("File size in bytes:", fileStat.size);

          if (fileStat.size === 0) {
            console.error("Downloaded file is empty.");
            return;
          }

          // Set the PDF URL to display it
          this.pdfUrl = "data:application/pdf;base64," + base64Data;
        } catch (fsError) {
          console.error("Filesystem Error:", fsError);
          throw fsError;
        }
      } catch (error) {
        console.error("Operation Failed:", error);
      }
    },
    // Method to render the PDF on a canvas
    async renderPdf() {
      console.log("Starting PDF rendering process...");

      const canvas = this.$refs.pdfCanvas;
      if (!canvas) {
        console.error("Canvas element not found");
        return;
      }
      console.log("Canvas element found");

      const ctx = canvas.getContext("2d");
      if (!ctx) {
        console.error("Failed to get 2D context");
        return;
      }
      console.log("2D context obtained");

      try {
        const pdf = await pdfjsLib.getDocument(this.pdfUrl).promise;
        console.log("PDF document fetched successfully");

        const page = await pdf.getPage(1);
        console.log("Page 1 of PDF document fetched successfully");

        const viewport = page.getViewport({ scale: 1.5 });
        console.log("Viewport created with scale 1.5");

        canvas.width = viewport.width;
        canvas.height = viewport.height;
        console.log("Canvas dimensions set to width:", viewport.width, "height:", viewport.height);

        const renderContext = {
          canvasContext: ctx,
          viewport: viewport,
        };

        console.log("Starting PDF page render");
        await page.render(renderContext).promise;
        console.log("PDF rendered successfully");
      } catch (error) {
        console.error("Error rendering PDF:", JSON.stringify(error, Object.getOwnPropertyNames(error)));
      }
    },
    // Helper method to convert ArrayBuffer to Base64
    arrayBufferToBase64(buffer) {
      let binary = "";
      const bytes = new Uint8Array(buffer);
      const len = bytes.byteLength;
      for (let i = 0; i &lt; len; i++) {
        binary += String.fromCharCode(bytes&#91;i]);
      }
      return btoa(binary);
    },
  },
  watch: {
    // Watcher to render the PDF when the URL changes
    pdfUrl(newUrl) {
      if (newUrl) {
        this.$nextTick(() => {
          this.renderPdf();
        });
      }
    }
  }
});
&lt;/script>
</code></pre>

<p class="wp-block-paragraph">3. <strong>Toelichting</strong></p>

<ul class="wp-block-list">
<li><strong>HTTP Plugin</strong>: Hiermee download je bestanden veilig en effectief op mobiele apparaten.</li>



<li><strong>Filesystem Plugin</strong>: Hiermee sla je bestanden lokaal op in de <code>Documents</code>-directory, essentieel voor Android/iOS.</li>



<li><strong>PDF.js</strong>: Verantwoordelijk voor het renderen van PDF's in een canvas-element.</li>
</ul>

<p class="wp-block-paragraph">4. <strong>Compatibiliteit</strong></p>

<ul class="wp-block-list">
<li><strong>Android/iOS</strong>: Zorg ervoor dat je permissies instelt voor bestandstoegang in je <code>AndroidManifest.xml</code> en <code>Info.plist</code>.</li>



<li><strong>Web</strong>: PDF.js werkt direct met een externe URL zonder dat lokale opslag nodig is.</li>
</ul>
<p>Het bericht <a href="https://www.utilewebsites.nl/knowledgebase/stappen-om-een-pdf-te-downloaden-en-weer-te-geven-in-een-ionic-vue-app-android-ios/">Stappen om een PDF te downloaden en weer te geven in een Ionic Vue-app (Android/iOS):</a> verscheen eerst op <a href="https://www.utilewebsites.nl">Utilewebsites</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ionic, Vue, Laravel</title>
		<link>https://www.utilewebsites.nl/knowledgebase/ionic-vue-laravel/</link>
		
		<dc:creator><![CDATA[UtileWebsites]]></dc:creator>
		<pubDate>Thu, 04 Nov 2021 10:49:06 +0000</pubDate>
				<guid isPermaLink="false">https://www.utilewebsites.nl/?post_type=wz_knowledgebase&#038;p=4014</guid>

					<description><![CDATA[<p>Om een applicatie te ontwikkelen vanuit 1 code dat bruikbaar is als web-app, native android &#38; native ios kunt u bijvoorbeeld een setup gebruiken vanuit Ionic. Gezien wij een grote ervaring hebben met Vue, programmeren wij vanuit javascript vooral binnen het Vue frame. Een mogelijk opzet wordt hier beschreven Ionic &#38; Vue : https://ionicframework.com/docs/vue/quickstart Er is een video tutorial : https://www.youtube.com/watch?v=mQ4zmFy4d7Y Voor de Api calls/data/database/backend zou men laraval kunnen gebruiken. Installatie zie hier : https://laravel.com/docs/8.x</p>
<p>Het bericht <a href="https://www.utilewebsites.nl/knowledgebase/ionic-vue-laravel/">Ionic, Vue, Laravel</a> verscheen eerst op <a href="https://www.utilewebsites.nl">Utilewebsites</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Om een applicatie te ontwikkelen vanuit 1 code dat bruikbaar is als web-app, native android &amp; native ios kunt u bijvoorbeeld een setup gebruiken vanuit Ionic. Gezien wij een grote ervaring hebben met Vue, programmeren wij vanuit javascript vooral binnen het Vue frame.</p>



<p class="wp-block-paragraph">Een mogelijk opzet wordt hier beschreven Ionic &amp; Vue : <a href="https://ionicframework.com/docs/vue/quickstart" target="_blank" rel="noreferrer noopener">https://ionicframework.com/docs/vue/quickstart</a></p>



<p class="wp-block-paragraph">Er is een video tutorial : <a href="https://www.youtube.com/watch?v=mQ4zmFy4d7Y" target="_blank" rel="noreferrer noopener">https://www.youtube.com/watch?v=mQ4zmFy4d7Y</a></p>



<p class="wp-block-paragraph">Voor de Api calls/data/database/backend zou men laraval kunnen gebruiken. Installatie zie hier : <a href="https://laravel.com/docs/8.x" target="_blank" rel="noreferrer noopener">https://laravel.com/docs/8.x</a></p>
<p>Het bericht <a href="https://www.utilewebsites.nl/knowledgebase/ionic-vue-laravel/">Ionic, Vue, Laravel</a> verscheen eerst op <a href="https://www.utilewebsites.nl">Utilewebsites</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
