匷åãªPWAå ±æã¿ãŒã²ãããã³ãã©ãæ§ç¯ããã«ã¹ã¿ã å ±æããŒã¿ãåŠçããæ¹æ³ãåŠã³ãŸãããã©ãããã©ãŒã ãããã€ã¹ãåãããŠãŒã¶ãŒãšã³ã²ãŒãžã¡ã³ããåäžãããå®è·µçãªäŸãã°ããŒãã«ãªèæ ®äºé ãã玹ä»ã
ããã°ã¬ãã·ããŠã§ãã¢ããªã®å ±æã¿ãŒã²ãããã³ãã©ïŒã«ã¹ã¿ã å ±æããŒã¿ã®åŠç
Web Share Target APIã¯ãããã°ã¬ãã·ããŠã§ãã¢ããªïŒPWAïŒããŠãŒã¶ãŒã®ããã€ã¹ã®ãã€ãã£ããªå ±ææ©èœãšã·ãŒã ã¬ã¹ã«çµ±åã§ããããã«ããŸããããã«ãããPWAã¯ããã¹ããç»åãURLãªã©ä»ã®ã¢ããªããå ±æãããããŒã¿ãåãåããã«ã¹ã¿ã ã®æ¹æ³ã§åŠçã§ããŸãããã®ã¬ã€ãã§ã¯ãPWAã«ãããå ±æã¿ãŒã²ãããã³ãã©ã®äœæãšæŽ»çšã«ã€ããŠæ·±ãæãäžãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹åäžã®ããã®ã«ã¹ã¿ã å ±æããŒã¿åŠçã«çŠç¹ãåœãŠãŸãã
Web Share Target APIãšPWAã®çè§£
ããã°ã¬ãã·ããŠã§ãã¢ããªã¯ãææ°ã®ãŠã§ãæè¡ã掻çšããŠããã€ãã£ãã¢ããªã®ãããªäœéšãæäŸããŸããä¿¡é Œæ§ãé«ããé«éã§ãé åçã§ããããŠãŒã¶ãŒã¯ããŒã ç»é¢ããçŽæ¥ã¢ã¯ã»ã¹ã§ããŸããWeb Share Target APIã¯ãã®æ©èœãæ¡åŒµããPWAãä»ã®ã¢ããªã±ãŒã·ã§ã³ããå ±æãããã³ã³ãã³ãã®ã¿ãŒã²ãããšããŠæ©èœã§ããããã«ããããšã§ãPWAãããã«å€æ©èœã«ããŸãã
äž»èŠãªæŠå¿µ
- ãŠã§ãã¢ããªãããã§ã¹ã: PWAã®äžå¿ã§ãããå ±æã¿ãŒã²ããã®èšå®ãå«ãã¢ããªã«é¢ããã¡ã¿ããŒã¿ãå®çŸ©ããŸãã
- å ±æã¿ãŒã²ãããã³ãã©: PWAã«å ±æãããããŒã¿ãååããåŠçããJavaScriptã³ãŒãã§ãã
- å ±æããŒã¿: å ±æå ã®ã¢ããªããåä¿¡ããæ å ±ã§ãããã¹ããç»åãURLãªã©ããããŸãã
- ã¹ã³ãŒã: PWAãå ±æããŒã¿ãåŠçã§ããURLãå®çŸ©ããŸãã
ãŠã§ãã¢ããªãããã§ã¹ãã§ã®å ±æã¿ãŒã²ããã®èšå®
æåã®ã¹ãããã¯ããŠã§ãã¢ããªãããã§ã¹ãå
ã§å
±æã¿ãŒã²ãããèšå®ããããšã§ãããã®JSONãã¡ã€ã«ã¯ãå
±æãªã¯ãšã¹ããã©ã®ããã«åŠçãã¹ãããå«ãããã©ãŠã¶ã«PWAã«é¢ããæ
å ±ãäŒããŸãããããã§ã¹ãå
ã®share_targetã¡ã³ããŒãéèŠã§ãã
{
"name": "My Awesome App",
"short_name": "AwesomeApp",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#000000",
"icons": [
{
"src": "/images/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/images/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"share_target": {
"action": "/share-target-handler",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"title": "title",
"text": "text",
"url": "url",
"files": [
{
"name": "image",
"accept": ["image/*"]
}
]
}
}
}
解説:
action: å ±æããŒã¿ãåŠçããPWAå ã®ãšã³ããã€ã³ãã®URLïŒäŸïŒ/share-target-handlerïŒãmethod: å ±æãªã¯ãšã¹ãã«äœ¿çšãããHTTPã¡ãœããïŒéåžžã¯POSTïŒãenctype: ãã©ãŒã ããŒã¿ãã©ã®ããã«ãšã³ã³ãŒããããããæå®ããŸãïŒãã¡ã€ã«ã¢ããããŒãã«ã¯multipart/form-dataãäžè¬çã§ãïŒãparams: æåŸ ãããããŒã¿ãã©ã¡ãŒã¿ãèšè¿°ããŸããããã§ãå ±æã¢ããªã±ãŒã·ã§ã³ããåãåãããŒã¿ã®çš®é¡ã宣èšããŸããtitle: å ±æã³ã³ãã³ãã®ã¿ã€ãã«ãtext: å ±æã®ããã¹ãã³ã³ãã³ããurl: å ±æã«é¢é£ããURLãfiles: å ±æãããç»åããã®ä»ã®ãã¡ã€ã«ãæ±ãããã®ãã¡ã€ã«ä»æ§ã®é åãnameã¯ãã³ãã©ã§ãã¡ã€ã«ãèå¥ããæ¹æ³ã§ããacceptã¯èš±å¯ããããã¡ã€ã«ã¿ã€ããæå®ããŸãïŒäŸïŒä»»æã®ç»åã®å Žåã¯image/*ïŒã
å ±æã¿ãŒã²ãããã³ãã©ã®æ§ç¯ (JavaScript)
ãããã§ã¹ããèšå®ããããå
±æããŒã¿ãåŠçããJavaScriptã³ãŒããäœæããŸããããã¯éåžžãaction URLã«éä¿¡ãããPOSTãªã¯ãšã¹ããåŠçããããšãå«ã¿ãŸããããã¯Node.jsã®ãããªãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãµãŒããŒãµã€ãã§å®è¡ããããšããéåžžã«å°ããåçŽãªãã³ãã©ãäœæããå Žåã¯ã¯ã©ã€ã¢ã³ããµã€ãã®ãµãŒãã¹ã¯ãŒã«ãŒã§å®è¡ããããšãã§ããŸãã
åºæ¬çãªããã¹ããšURLã®åŠçäŸ
以äžã¯ãããã¹ããšURLããã£ããã£ãããµãŒããŒãµã€ãã®ã¢ãããŒãïŒNode.jsãšExpressã䜿çšïŒã®åºæ¬çãªäŸã§ãã
// server.js (Node.js with Express)
const express = require('express');
const multer = require('multer'); // For handling multipart/form-data
const path = require('path');
const fs = require('fs');
const app = express();
const upload = multer({ dest: 'uploads/' }); // Configure multer for file uploads
const port = 3000;
app.use(express.static('public')); // Serve static assets
// Parse URL-encoded bodies
app.use(express.urlencoded({ extended: true }));
app.post('/share-target-handler', upload.any(), (req, res) => {
// Access shared data from req.body
const title = req.body.title;
const text = req.body.text;
const url = req.body.url;
console.log('Shared Title:', title);
console.log('Shared Text:', text);
console.log('Shared URL:', url);
// Process the shared data as needed (e.g., save to a database, display on a page)
res.send(`
Share Received!
Title: ${title || 'None'}
Text: ${text || 'None'}
URL: ${url || 'None'}
`);
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
解説:
- Node.jsãµãŒããŒãšExpressã䜿çšããŠãmultipart/form-dataãæ±ãããã®`multer`ã©ã€ãã©ãªã䜿çšããç°¡åãªã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
/share-target-handlerã«ãŒãã¯POSTãªã¯ãšã¹ããåŠçããŸãã- ãã³ãã©ã¯ãªã¯ãšã¹ãããã£ãã
titleãtextãurlãã©ã¡ãŒã¿ãæœåºããŸãã - ãã®åŸãã³ãŒãã¯ããŒã¿ãã³ã³ãœãŒã«ã«ãã°åºåããåºæ¬çãªHTMLããŒãžã«è¡šç€ºããŸãã
ç»ååŠçã®äŸ
ãã³ãã©ã匷åããŠç»åãã¡ã€ã«ãåŠçã§ããããã«ããŸãããããµãŒããŒã³ãŒãã以äžã®ããã«å€æŽããŸãã
// server.js (Node.js with Express, extended)
const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const app = express();
const upload = multer({ dest: 'uploads/' }); // Configure multer for file uploads
const port = 3000;
app.use(express.static('public')); // Serve static assets, including the uploads directory.
// Parse URL-encoded bodies
app.use(express.urlencoded({ extended: true }));
app.post('/share-target-handler', upload.any(), (req, res) => {
const title = req.body.title;
const text = req.body.text;
const url = req.body.url;
const files = req.files; // Access the uploaded files
console.log('Shared Title:', title);
console.log('Shared Text:', text);
console.log('Shared URL:', url);
console.log('Shared Files:', files);
let imageHtml = '';
if (files && files.length > 0) {
files.forEach(file => {
const imagePath = path.join('/uploads', file.filename);
imageHtml += `
`;
});
}
res.send(`
Share Received!
Title: ${title || 'None'}
Text: ${text || 'None'}
URL: ${url || 'None'}
${imageHtml}
`);
});
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
éèŠãªå€æŽç¹:
- `multer`ããã±ãŒãžãã€ã³ããŒãããŸããããã¯ãã«ãããŒããã©ãŒã ããŒã¿ïŒãã¡ã€ã«ãå«ãïŒã®è§£æãæ åœããŸãã
- `multer`ã®èšå®ã«ãããã¢ããããŒãããããã¡ã€ã«ã¯`uploads`ãã£ã¬ã¯ããªã«ä¿åãããŸãïŒãã®ãã£ã¬ã¯ããªããããžã§ã¯ãã«ååšããããšã確èªããŠãã ããïŒããã¹åŒæ°`dest: 'uploads/'`ã¯ããã¡ã€ã«ãä¿åãããããŒã«ã«ã®å Žæãå®çŸ©ããŸãã
- `multer`ã«ãã£ãŠèšå®ããã`req.files`ããããã£ã«ã¯ããã¡ã€ã«ãå ±æãããå Žåã«ãã¡ã€ã«ãªããžã§ã¯ãã®é åãå«ãŸããŸãã
- ç»ååŠçã»ã¯ã·ã§ã³ã§ã¯ãã¢ããããŒãããããã¡ã€ã«ãå埩åŠçããåç»åã«å¯ŸããŠ`img`ã¿ã°ãã¬ã³ããªã³ã°ããŸãã`path.join()`颿°ã¯ãã¢ããããŒããããç»åãžã®æ£ãããã¹ãæ§ç¯ããŸãã
- éèŠãªç¹ãšããŠã`app.use(express.static('public'));`ã䜿çšããŠãuploadsãã£ã¬ã¯ããªããéçã¢ã»ãããæäŸããŸããããã«ãããã¢ããããŒãããããã¡ã€ã«ãå ¬éã¢ã¯ã»ã¹å¯èœã«ãªããŸãã
ããããã¹ãããã«ã¯ãå¥ã®ã¢ããªïŒããã€ã¹ã®åçã®ã£ã©ãªãŒãªã©ïŒããPWAã«ç»åãå ±æããŸããå ±æãããç»åã¯ã¬ã¹ãã³ã¹ããŒãžã«è¡šç€ºãããŸãã
ãµãŒãã¹ã¯ãŒã«ãŒã®çµ±åïŒã¯ã©ã€ã¢ã³ããµã€ãåŠçïŒ
ããé«åºŠãªã·ããªãªããªãã©ã€ã³æ©èœã®ããã«ã¯ãå ±æã¿ãŒã²ããã®åŠçããµãŒãã¹ã¯ãŒã«ãŒã§å®è£ ã§ããŸãããã®ã¢ãããŒãã«ãããPWAã¯ã¢ã¯ãã£ããªãããã¯ãŒã¯æ¥ç¶ããªããŠãæ©èœããããŒã¿åŠçããžãã¯ã«å¯Ÿãããã倧ããªå¶åŸ¡ãå¯èœã«ãªããŸãããã®äŸã¯ããã§ã«ç»é²æžã¿ã®ãµãŒãã¹ã¯ãŒã«ãŒãããããšãåæãšããŠããŸãã
// service-worker.js
self.addEventListener('fetch', (event) => {
// Check if the request is for our share target handler
if (event.request.url.includes('/share-target-handler') && event.request.method === 'POST') {
event.respondWith(async function() {
try {
const formData = await event.request.formData();
const title = formData.get('title');
const text = formData.get('text');
const url = formData.get('url');
const imageFile = formData.get('image'); // Access the uploaded image file
console.log('Shared Title (SW):', title);
console.log('Shared Text (SW):', text);
console.log('Shared URL (SW):', url);
console.log('Shared Image (SW):', imageFile); // Handle image file as needed
// Process the shared data (e.g., store in IndexedDB)
// Example: Store in IndexedDB
if (title || text || url || imageFile) {
await storeShareData(title, text, url, imageFile); // Assume this is defined.
}
return new Response('Share received and processed!', { status: 200 });
} catch (error) {
console.error('Error handling share:', error);
return new Response('Error processing share.', { status: 500 });
}
}());
}
// Other fetch event handling (e.g., caching, network requests)
// ...
});
async function storeShareData(title, text, url, imageFile) {
const dbName = 'shareDataDB';
const storeName = 'shareStore';
const db = await new Promise((resolve, reject) => {
const request = indexedDB.open(dbName, 1);
request.onerror = (event) => {
reject(event.target.error);
};
request.onsuccess = (event) => {
resolve(event.target.result);
};
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains(storeName)) {
db.createObjectStore(storeName, { autoIncrement: true });
}
};
});
const transaction = db.transaction(storeName, 'readwrite');
const store = transaction.objectStore(storeName);
const data = {
title: title,
text: text,
url: url,
timestamp: Date.now()
};
if (imageFile) {
const reader = new FileReader();
reader.onload = (event) => {
data.image = event.target.result;
store.add(data);
};
reader.onerror = (event) => {
console.error("Error reading image file:", event.target.error);
};
reader.readAsDataURL(imageFile);
} else {
store.add(data);
}
await new Promise((resolve, reject) => {
transaction.oncomplete = resolve;
transaction.onerror = reject;
});
}
解説:
- ãµãŒãã¹ã¯ãŒã«ãŒã¯
fetchã€ãã³ããååããŸãã - ãªã¯ãšã¹ããå
±æã¿ãŒã²ãããã³ãã©ã®URLïŒ
/share-target-handlerïŒãžã®POSTã§ãããã©ããããã§ãã¯ããŸãã - ãµãŒãã¹ã¯ãŒã«ãŒã¯
event.request.formData()ã䜿çšããŠå ±æããŒã¿ãè§£æããŸãã - ããŒã¿ãã£ãŒã«ãïŒã¿ã€ãã«ãããã¹ããURLãç»åïŒãæœåºããŸãããã¡ã€ã«ã¯BlobãšããŠæ±ãããŸãã
- å ±æããŒã¿ã¯ãµãŒãã¹ã¯ãŒã«ãŒèªäœã§åŠçãããŸãããã®äŸã§ã¯ãããŒã¿ã¯IndexedDBã«ä¿åãããŸãã
- ãã®ã³ãŒãã¯ãå ±æããŒã¿ãIndexedDBã«ä¿åããããã®`storeShareData()`颿°ïŒã³ãŒãããŒã¹ã®ä»ã®å Žæã«ãããšä»®å®ïŒãæäŸããŸãã
ãµãŒãã¹ã¯ãŒã«ãŒã«é¢ããéèŠãªèæ ®äºé :
- éåææäœ: ãµãŒãã¹ã¯ãŒã«ãŒã¯éåæã§åäœããããããã¹ãŠã®æäœïŒIndexedDBã¢ã¯ã»ã¹ãªã©ïŒã¯
async/awaitãŸãã¯Promiseã§åŠçããå¿ èŠããããŸãã - ã¹ã³ãŒã: ãµãŒãã¹ã¯ãŒã«ãŒã«ã¯ã¹ã³ãŒãããããã¢ã¯ã»ã¹ããããªãœãŒã¹ã¯ãã®ã¹ã³ãŒãå ã«ããå¿ èŠããããŸãïŒãŸãã¯ããœãŒã¹ãå€éšã®å Žåã¯CORSçµç±ã§ã¢ã¯ã»ã¹å¯èœã§ããå¿ èŠããããŸãïŒã
- ãªãã©ã€ã³æ©èœ: ãµãŒãã¹ã¯ãŒã«ãŒã«ãããPWAã¯ãªãã©ã€ã³ã§æ©èœã§ããŸããããã€ã¹ããããã¯ãŒã¯ã«æ¥ç¶ããŠããªããŠããå ±æã¿ãŒã²ããã䜿çšã§ããŸãã
ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ã«ã¹ã¿ãã€ãº
å ±æããŒã¿ã®åŠçæ¹æ³ãã«ã¹ã¿ãã€ãºã§ããããšã§ãããè±ããªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãžã®æãéãããŸãã以äžã«ããã€ãã®ã¢ã€ãã¢ãæããŸãã
- ã³ã³ãã³ãéçŽ: ãŠãŒã¶ãŒãPWAå ã§ããŸããŸãªãœãŒã¹ãããªã³ã¯ãããã¹ãã¹ãããããåéã§ããããã«ããŸããäŸãã°ããã¥ãŒã¹ã¢ã°ãªã²ãŒã¿ãŒã¯ããŠãŒã¶ãŒãèšäºãçŽæ¥ãªãŒãã£ã³ã°ãªã¹ãã«å ±æã§ããããã«ããããšãã§ããŸãã
- ç»åç·šéãšæ¡åŒµ: ã¢ããªã«ç»åãå ±æãããåŸãåºæ¬çãªç»åç·šéæ©èœãæäŸãããŠãŒã¶ãŒãç»åãä¿åãããããã«å ±æããåã«å€æŽã§ããããã«ããŸããããã¯ããŠãŒã¶ãŒãç»åã«æ³šéãä»ããããéãããå ¥ãããã§ããç»åããŒã¹ã®ã¢ããªã«åœ¹ç«ã¡ãŸãã
- ãœãŒã·ã£ã«ã¡ãã£ã¢çµ±å: ãŠãŒã¶ãŒãPWAå ã§å ±æã³ã³ãã³ãã䜿çšããŠãœãŒã·ã£ã«ã¡ãã£ã¢ã®æçš¿ãäºåã«å ¥åã§ããããã«ããŸããããã¯ãèšäºã®å ±æãããœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ãžã®ç»åã®å ±æã«äœ¿çšã§ããŸãã
- ãªãã©ã€ã³ä¿å: å ±æããŒã¿ãããŒã«ã«ã«ä¿åïŒäŸïŒIndexedDBã䜿çšïŒããŠããŠãŒã¶ãŒãã€ã³ã¿ãŒãããæ¥ç¶ãªãã§ã¢ã¯ã»ã¹ã§ããããã«ããŸããããã¯ãæ¥ç¶ãå¶éãããŠããå°åã®ãŠãŒã¶ãŒã«ãšã£ãŠéåžžã«è²Žéã§ãã
- æèã«å¿ããã¢ã¯ã·ã§ã³: å ±æãããããŒã¿ã®çš®é¡ã«åºã¥ããŠããŠãŒã¶ãŒã«ç¹å®ã®ã¢ã¯ã·ã§ã³ãææ¡ãæäŸããŸããäŸãã°ãURLãå ±æãããå ŽåãPWAã¯ããããªãŒãã£ã³ã°ãªã¹ãã«è¿œå ããããšãææ¡ããããé¢é£ã³ã³ãã³ããå§ãããããããšãã§ããŸãã
ããŸããŸãªå ±æã¿ã€ãã®åŠç
ãããã§ã¹ãã®paramsã䜿çšãããšãããŸããŸãªãã¡ã€ã«åœ¢åŒã«å¯ŸããŠç°ãªãacceptã¿ã€ããæå®ã§ããŸãã以äžã«ããã€ãã®äŸã瀺ããŸãã
- ç»å:
"accept": ["image/*"]ã¯ãã¹ãŠã®ç»åã¿ã€ããåãå ¥ããŸãã - ç¹å®ã®ç»åã¿ã€ã:
"accept": ["image/png", "image/jpeg"]ã¯PNGãšJPEGç»åã®ã¿ãåãå ¥ããŸãã - åç»:
"accept": ["video/*"]ã¯ãã¹ãŠã®åç»ã¿ã€ããåãå ¥ããŸãã - é³å£°:
"accept": ["audio/*"]ã¯ãã¹ãŠã®é³å£°ã¿ã€ããåãå ¥ããŸãã - PDF:
"accept": ["application/pdf"]ã¯PDFããã¥ã¡ã³ããåãå ¥ããŸãã - è€æ°ã¿ã€ã:
"accept": ["image/*", "video/*"]ã¯ç»åãšåç»ã®äž¡æ¹ãåãå ¥ããŸãã
å ±æã¿ãŒã²ãããã³ãã©ã¯ãæå®ãããã¹ãŠã®ã¿ã€ããåŠçã§ããããã«èšè¿°ããå¿ èŠããããŸãããã³ãã©ããã¹ãŠã®å ±æã¿ã€ããåŠçããªãå Žåãå ±æã¢ããªãæ£ããæ©èœããªãå¯èœæ§ããããŸãããã¡ã€ã«ã¿ã€ãããšã«é©åã«åŠçããããã®ããžãã¯ã远å ããå¿ èŠããããŸããäŸãã°ãã¢ããããŒãããããã¡ã€ã«ã®çš®é¡ã«åºã¥ããŠç°ãªãã©ã€ãã©ãªã䜿çšããããšãèããããŸãã
é«åºŠãªãã¯ããã¯ãšèæ ®äºé
ãšã©ãŒãã³ããªã³ã°
åžžã«å ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŠãã ãããå ±æã¿ãŒã²ããæäœã¯ããããã¯ãŒã¯ã®åé¡ãäžæ£ãªããŒã¿ãäºæããªããã¡ã€ã«åœ¢åŒãªã©ãåå ã§å€±æããå¯èœæ§ããããŸãããŠãŒã¶ãŒã«æçãªãšã©ãŒã¡ãã»ãŒãžãæäŸããé害ãé©åã«åŠçããŠãã ããããµãŒãã¹ã¯ãŒã«ãŒããµãŒããŒãµã€ãã®ã³ãŒãã§`try...catch`ãããã¯ã䜿çšããŠãæœåšçãªãšã©ãŒã管çããŸãããããã°ç®çã§ã³ã³ãœãŒã«ã«ãšã©ãŒãèšé²ããŸãã
ã»ãã¥ãªãã£ã«é¢ããèæ ®äºé
- ããŒã¿æ€èšŒ: å ±æãªã¯ãšã¹ãããåãåã£ãããŒã¿ã¯åžžã«æ€èšŒããŠãã ãããã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒæ»æãªã©ã®ã»ãã¥ãªãã£è匱æ§ãé²ããããå ¥åããµãã¿ã€ãºããã³ãã£ã«ã¿ãªã³ã°ããŸãã
- ãã¡ã€ã«ãµã€ãºã®å¶é: ä¹±çšããªãœãŒã¹ã®æ¯æžãé²ãããããã¡ã€ã«ãµã€ãºã®å¶éãå®è£ ããŸãããµãŒããŒãµã€ãã®ã³ãŒãããµãŒãã¹ã¯ãŒã«ãŒã§ãã¡ã€ã«ãµã€ãºã®å¶éãèšå®ããŸãã
- ã¢ã¯ã»ã¹å¶åŸ¡: PWAãæ©å¯ããŒã¿ãæ±ãå Žåã¯ã誰ãããŒã¿ãå ±æã§ããã©ã®ããã«åŠçãããããå¶éããããã«ãé©åãªã¢ã¯ã»ã¹å¶åŸ¡ã¡ã«ããºã ãå®è£ ããŸãããŠãŒã¶ãŒèªèšŒãèŠæ±ããããšãæ€èšããŠãã ããã
ãŠãŒã¶ãŒãã©ã€ãã·ãŒ
ãŠãŒã¶ãŒã®ãã©ã€ãã·ãŒã«é æ ®ããŠãã ãããå¿ èŠãªããŒã¿ã®ã¿ãèŠæ±ããå ±ææ å ±ã®äœ¿ç𿹿³ã«ã€ããŠéææ§ãä¿ã¡ãŸããå¿ èŠã«å¿ããŠãŠãŒã¶ãŒã®åæãåŸãŠãé¢é£ããããŒã¿ãã©ã€ãã·ãŒèŠå¶ïŒäŸïŒGDPRãCCPAïŒãéµå®ããŸãã
ããŒã«ã©ã€ãŒãŒã·ã§ã³ãšåœéåïŒi18nïŒ
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ãèæ ®ããŠãã ãããPWAãè€æ°ã®èšèªãšå°åèšå®ããµããŒãããããã«ããŸããJavaScriptã®`Intl` APIãªã©ã®åœéåæè¡ã䜿çšããŠãæ¥ä»ãæ°å€ãéè²šãæ£ããåŠçããŸãããšã©ãŒã¡ãã»ãŒãžã確èªããã³ãããå«ããã¢ããªå ã®ãã¹ãŠã®ãŠãŒã¶ãŒåãããã¹ãã翻蚳ããŸãã
ãã¹ããšãããã°
- ããã€ã¹ãšãã©ãŠã¶éã§ã®ãã¹ã: äºææ§ãšäžè²«ããåäœãä¿èšŒããããã«ãããŸããŸãªããã€ã¹ãšãã©ãŠã¶ã§å ±æã¿ãŒã²ãããã³ãã©ã培åºçã«ãã¹ãããŸãã
- ãã©ãŠã¶éçºè ããŒã«: ãã©ãŠã¶ã®éçºè ããŒã«ã䜿çšããŠããããã¯ãŒã¯ãªã¯ãšã¹ãã®æ€æ»ãJavaScriptã³ãŒãã®ãããã°ãåé¡ã®ç¹å®ãè¡ããŸãã
- ãµãŒãã¹ã¯ãŒã«ãŒã®ãããã°: ãã©ãŠã¶ã®éçºè ããŒã«ã«ãããµãŒãã¹ã¯ãŒã«ãŒãããã¬ã䜿çšããŠããµãŒãã¹ã¯ãŒã«ãŒã®ã¢ã¯ãã£ããã£ãæ€æ»ããã¡ãã»ãŒãžããã°ã«èšé²ããåé¡ããã©ãã«ã·ã¥ãŒãã£ã³ã°ããŸãã
- ãããã§ã¹ãã®æ€èšŒ: ãããã§ã¹ããã¡ã€ã«ãæ£ãããã©ãŒããããããŠããããšã確èªããããã«æ€èšŒããŸãããªã³ã©ã€ã³ã§å©çšã§ããå€ãã®ãããã§ã¹ãæ€èšŒããŒã«ããããŸãã
äžçäžã®äœ¿çšäŸ
- ã¯ãªãšã€ãã£ããããã§ãã·ã§ãã«åãã®ç»åå ±æïŒæ¥æ¬ïŒ: åçç·šéPWAã¯ãåçå®¶ãã«ã¡ã©ããŒã«ããçŽæ¥ãšãã£ã¿ã«ç»åãå ±æã§ããããã«ãããã£ã«ã¿ããã°ããé©çšããããä»ã®èª¿æŽãè¡ã£ããã§ããããã«ããŸãã
- èªè ã®ããã®èšäºä¿åïŒã€ã³ãïŒ: ãã¥ãŒã¹ã¢ã°ãªã²ãŒã¿ãŒPWAã¯ããŠãŒã¶ãŒããŠã§ããã©ãŠã¶ããçŽæ¥ãªãŒãã£ã³ã°ãªã¹ãã«èšäºãå ±æã§ããããã«ãããªãã©ã€ã³ã§é²èЧã§ããããã«ããŸãã
- æè²çŸå Žã§ã®ã¯ã€ãã¯ã¡ã¢åãïŒãã€ãïŒ: ã¡ã¢åãPWAã¯ãåŠçãè¬çŸ©äžã«ä»ã®ã¢ããªã±ãŒã·ã§ã³ããããã¹ãã¹ããããããŠã§ããµã€ãã®ãªã³ã¯ãå ±æããŠããã°ããã¡ã¢ãäœæã§ããããã«ããŸãã
- ããã¥ã¡ã³ãã§ã®ã³ã©ãã¬ãŒã·ã§ã³ïŒãã©ãžã«ïŒ: å ±åããã¥ã¡ã³ãç·šéPWAã¯ããŠãŒã¶ãŒãä»ã®ã¢ããªã±ãŒã·ã§ã³ããããã¹ããç»åãå ±æããŠãè¿ éãªã³ã©ãã¬ãŒã·ã§ã³ãå¯èœã«ããŸãã
çµè«
PWAã«å ±æã¿ãŒã²ãããã³ãã©ãå®è£ ããããšã¯ããŠãŒã¶ãŒãšã³ã²ãŒãžã¡ã³ãã匷åãããŠãŒã¶ãŒã®ããã€ã¹ã®ãã€ãã£ããªå ±ææ©èœãšã·ãŒã ã¬ã¹ã«çµ±åããããã®åŒ·åãªæ¹æ³ã§ããæäŸãããã¬ã€ãã©ã€ã³ãšäŸã«åŸãããšã§ãäžçäžã®ããŸããŸãªããã€ã¹ããã©ãããã©ãŒã ã§ããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããPWAãæ§ç¯ã§ããŸãããããã®æ©èœãå®è£ ããéã«ã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãã»ãã¥ãªãã£ããã©ã€ãã·ãŒãèæ ®ããããšãå¿ããªãã§ãã ããããŠãŒã¶ãŒã®ãã£ãŒãããã¯ã«åºã¥ããç¶ç¶çãªãã¹ããšæ¹åããæåããå®è£ ã®éµãšãªããŸãã
Web Share Target APIãæŽ»çšããããšã§ãæ··éããããžã¿ã«ç°å¢ã§éç«ã€ãçã«é åçã§äœ¿ããããPWAãäœæã§ããŸãã幞éãç¥ããŸãããããŠã楜ããã³ãŒãã£ã³ã°ãïŒ