التحميل الجانبي للتطبيقات
يتيح لك التحميل الجانبي تثبيت برامج مصغرة خارج سجل متجر التطبيقات الرسمي. هذه هي سير العمل الرئيسية أثناء التطوير وكيف يثبّت المستخدمون التطبيقات التي يشاركها المطورون مباشرة.
هناك ثلاث طرق للتحميل الجانبي:
| الطريقة | المدخلات | الأفضل لـ |
|---|---|---|
| تثبيت URL | URL البيان | التطبيقات المستضافة، التطوير مع خادم محلي |
| رفع HTML | ملف .html واحد | النماذج الأولية السريعة، التطبيقات ذات الملف الواحد |
| حزمة .ais | ملف ZIP (امتداد .ais) | التطبيقات متعددة الملفات، التوزيع دون اتصال |
جميع الطرق الثلاث متاحة في قسم التحميل الجانبي في لوحة التطبيقات.
تثبيت URL
الطريقة القياسية لتثبيت برنامج مصغر من مصدر مستضاف.
كيف تعمل
- توفر URL يشير إلى ملف
manifest.json - تجلب المنصة البيان وتتحقق منه
- يتم جلب ملف HTML المدخل من
{base_url}{entry} - يعرض مربع حوار الأذونات اسم التطبيق والوصف والأذونات المطلوبة
- عند الموافقة، يُخزّن البيان وHTML المخزن مؤقتاً في IndexedDB
- يظهر التطبيق في شبكة التطبيقات المثبتة
الخطوات
- افتح لوحة التطبيقات (انقر أيقونة التطبيقات في الشريط الجانبي الأيسر)
- انتقل للتمرير إلى قسم التحميل الجانبي
- الصق URL البيان في حقل النص:
https://example.com/my-app/manifest.json - انقر تثبيت
- راجع الأذونات وانقر سماح
التطوير مع Localhost
أثناء التطوير، قدّم تطبيقك محلياً وثبّت من localhost:
cd my-app
python3 -m http.server 8080
ثم ثبّت من: http://localhost:8080/manifest.json
معظم خوادم HTTP المحلية تقدم الملفات برؤوس CORS متساهلة افتراضياً. إذا حصلت على أخطاء "فشل جلب البيان"، تأكد من أن خادمك يتضمن Access-Control-Allow-Origin: * في استجاباته.
تحديث تطبيق محمّل جانبياً
تخزّن المنصة HTML المدخل مؤقتاً وقت التثبيت. لالتقاط تغييرات الكود:
- ألغِ تثبيت التطبيق (انقر زر X على بطاقة التطبيق)
- أعد التثبيت من نفس URL
لا توجد آلية تحديث تلقائية للتطبيقات المحمّلة جانبياً. تطبيقات السجل تتحقق من التحديثات باستخدام مقارنة الإصدار خلال دورة تحديث السجل.
رفع HTML
أسرع طريقة لاختبار برنامج مصغر. ارفع ملف HTML واحد وتنشئ المنصة بياناً اصطناعياً تلقائياً.
كيف تعمل
- تختار ملف
.htmlأو.htmمن جهازك - تقرأ المنصة محتوى الملف (حد أقصى 5 ميجابايت)
- يُنشأ بيان اصطناعي:
name: مُشتق من اسم الملف (أحرف صغيرة، واصلات، حد أقصى 64 حرفاً)version:1.0.0entry:index.htmlbase_url:local://permissions:["storage"](الحد الأدنى)description:"Sideloaded from {filename}"
- يُعرض مربع حوار الأذونات
- يُخزّن HTML مؤقتاً كمحتوى المدخل
الخطوات
- افتح لوحة التطبيقات
- في قسم التحميل الجانبي، انقر رفع تطبيق
- اختر ملف
.htmlالخاص بك - راجع الأذونات وانقر سماح
القيود
- ملف واحد فقط -- CSS و JS والصور الخارجية المُشار إليها بعناوين URL نسبية لن تُحمّل لأن iframe لديه أصل null و
base_urlمضبوط علىlocal:// - أذونات دنيا -- البيان الاصطناعي يمنح
storageفقط. إذا كان تطبيقك يحتاجchat:readأو أذونات أخرى، استخدم تثبيت URL أو حزمة.aisبدلاً من ذلك - حد أقصى 5 ميجابايت -- الملفات الأكبر من 5 ميجابايت تُرفض
- لا تخصيص للبيان -- لا يمكنك تعيين وصف مخصص أو أيقونة أو أذونات
رفع HTML مصمم للنماذج الأولية السريعة. للتطبيقات التي تحتاج ملفات متعددة أو أذونات محددة، استخدم حزمة .ais أو تثبيت URL.
جعل التطبيقات ذات الملف الواحد تعمل
للاستفادة القصوى من رفع HTML، ابقِ كل شيء مضمناً في HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
/* ضمّن كل CSS هنا */
body {
font-family: system-ui;
padding: 16px;
color: #e0e0e0;
background: #1a1a2e;
}
</style>
</head>
<body>
<h1>تطبيقي</h1>
<script>
// ضمّن كل JavaScript هنا
ais.ready(function () {
ais.ui.toast("تم تحميل التطبيق!");
});
</script>
</body>
</html>
يمكن تضمين الصور كـ data URIs:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
حزمة .ais
حزمة .ais هي أرشيف ZIP قياسي بامتداد ملف .ais. تحتوي على البيان و HTML المدخل وجميع الأصول. تستخرج المنصة الـ ZIP وتضمن جميع الأصول المُشار إليها في مستند HTML واحد وقت التثبيت.
كيف تعمل
- ترفع ملف
.ais(حد أقصى 50 ميجابايت) - تحلل المنصة الـ ZIP باستخدام
DecompressionStreamالأصلي - يُستخرج
manifest.jsonويُتحقق منه من جذر الـ ZIP - يُستخرج ملف HTML المدخل (المُشار إليه بواسطة
entryفي البيان) - جميع الملفات الأخرى في الـ ZIP متاحة كأصول للتضمين
- يحوّل تضمين الأصول HTML:
<link rel="stylesheet" href="style.css">تصبح<style>{محتوى CSS}</style><script src="app.js"></script>تصبح<script>{محتوى JS}</script><img src="icon.png">تصبح<img src="data:image/png;base64,{base64}">url(bg.png)في الأنماط المضمنة تصبحurl(data:image/png;base64,...)
- يعرض مربع حوار الأذونات أذونات البيان
- يُخزّن HTML المضمن مؤقتاً في IndexedDB
هيكل الحزمة
my-app.ais (أرشيف ZIP)
|-- manifest.json (مطلوب، في الجذر)
|-- index.html (مطلوب، مُشار إليه بواسطة "entry" في البيان)
|-- style.css (اختياري، مضمن في <style>)
|-- app.js (اختياري، مضمن في <script>)
|-- icon.png (اختياري، مضمن كـ data URI)
|-- images/
| |-- logo.svg (اختياري، مضمن كـ data URI)
|-- fonts/
|-- custom.woff2 (اختياري، مضمن كـ data URI)
إنشاء حزمة
# انتقل إلى دليل تطبيقك
cd my-app
# تحقق من ملفاتك
ls
# manifest.json index.html style.css app.js icon.png
# أنشئ الحزمة
zip -r ../my-app.ais manifest.json index.html style.css app.js icon.png
أو اضغط الدليل بأكمله:
cd my-app
zip -r ../my-app.ais .
يجب أن يكون manifest.json في جذر الـ ZIP، وليس داخل دليل فرعي. إذا كان لديك هيكل ZIP مثل my-app/manifest.json، لن تجده المنصة.
ما يُضمّن
يعالج مضمن الأصول HTML المدخل ويستبدل المراجع النسبية بمحتوى مضمن:
| النمط | الاستبدال |
|---|---|
<link rel="stylesheet" href="X"> | <style>{محتوى X}</style> |
<script src="X"></script> | <script>{محتوى X}</script> |
<img src="X"> | <img src="data:{mime};base64,{data}"> |
<audio src="X"> | <audio src="data:{mime};base64,{data}"> |
<video src="X"> | <video src="data:{mime};base64,{data}"> |
<source src="X"> | <source src="data:{mime};base64,{data}"> |
url(X) في الأنماط المضمنة | url(data:{mime};base64,{data}) |
المراجع التي تبدأ بـ data: أو http:// أو https:// أو // تُترك دون تغيير -- فقط المسارات النسبية تُضمّن.
أنواع MIME المدعومة
تكشف المنصة أنواع MIME من امتدادات الملفات:
| الامتداد | نوع MIME |
|---|---|
.css | text/css |
.js, .mjs | text/javascript |
.json | application/json |
.png | image/png |
.jpg, .jpeg | image/jpeg |
.gif | image/gif |
.svg | image/svg+xml |
.webp | image/webp |
.ico | image/x-icon |
.woff | font/woff |
.woff2 | font/woff2 |
.ttf | font/ttf |
.mp3 | audio/mpeg |
.mp4 | video/mp4 |
.webm | video/webm |
.ogg | audio/ogg |
.wav | audio/wav |
مثال: حزمة تطبيق متعدد الملفات
manifest.json:
{
"name": "dashboard",
"version": "1.0.0",
"abi": 1,
"type": "mini-program",
"title": "لوحة التحكم",
"description": "لوحة تحكم تحليلات المحادثات",
"entry": "index.html",
"base_url": "local://",
"permissions": ["storage", "chat:read", "auth:read", "ui:toast"]
}
index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>لوحة التحكم</h1>
<img src="logo.svg" alt="Logo" width="64" />
<div id="stats"></div>
<script src="app.js"></script>
</body>
</html>
style.css:
body {
font-family: system-ui;
padding: 16px;
color: #e0e0e0;
background: #1a1a2e;
}
h1 {
font-size: 22px;
}
#stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
app.js:
ais.ready(async function () {
var history = await ais.chat.getHistory(100);
document.getElementById("stats").textContent = history.length + " رسالة";
});
بعد تثبيت الحزمة، تنتج المنصة HTML مضمناً واحداً:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
body {
font-family: system-ui;
padding: 16px;
color: #e0e0e0;
background: #1a1a2e;
}
h1 {
font-size: 22px;
}
#stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
</style>
</head>
<body>
<h1>لوحة التحكم</h1>
<img src="data:image/svg+xml;base64,..." alt="Logo" width="64" />
<div id="stats"></div>
<script>
ais.ready(async function () {
var history = await ais.chat.getHistory(100);
document.getElementById("stats").textContent =
history.length + " رسالة";
});
</script>
</body>
</html>
حدود حجم الملف
| الطريقة | الحد الأقصى |
|---|---|
| رفع HTML | 5 ميجابايت |
| حزمة .ais | 50 ميجابايت |
| تثبيت URL | لا حد صارم (مقيد بذاكرة المتصفح) |
الحزم الكبيرة مع العديد من الصور أو ملفات الوسائط المضمنة يمكن أن تنتج سلسلة HTML مخزنة مؤقتاً كبيرة جداً في IndexedDB. ابقِ الحزم خفيفة -- اضغط الصور قبل تضمينها، وفكر في استخدام عناوين URL خارجية للأصول الإعلامية الكبيرة.
الأمان
التطبيقات المحمّلة جانبياً تحصل على نفس صندوق الحماية تماماً مثل تطبيقات السجل:
sandbox="allow-scripts allow-forms"(أصل null)- لا وصول إلى DOM الأب أو localStorage أو ملفات تعريف الارتباط
- التواصل حصرياً عبر جسر
window.aispostMessage - الأذونات يفرضها المضيف (وليس iframe)
الفرق الوحيد عن تطبيقات السجل هو غياب شارة الثقة (Community أو AI Verified أو Verified) في شبكة التطبيقات. التطبيقات المحمّلة جانبياً ليس لها شارة.
التحميل الجانبي هو مستوى "التثبيت المباشر" في نموذج توزيع السوق. إنها آلية التوزيع الأصلية للويب -- ثبّت أي تطبيق من أي URL، مع توفير صندوق الحماية للأمان الأساسي.
واجهة المستخدم للتحميل الجانبي
يوفر قسم التحميل الجانبي في لوحة التطبيقات:
- حقل إدخال URL -- الصق URL بيان وانقر تثبيت
- فاصل "أو"
- زر رفع تطبيق -- يفتح منتقي ملفات يقبل ملفات
.htmlو.htmو.aisو.zip - نص مساعدة -- "يقبل تطبيقات .html ذات الملف الواحد أو حزم .ais (ZIP مع manifest.json)"
جميع الطرق الثلاث تحفز مربع حوار الأذونات القياسي قبل إتمام التثبيت. تظهر التطبيقات المثبتة في قسم المثبتة أعلاه، مع أزرار فتح وإلغاء التثبيت.