تنزيل Markdownالوثيقة الأصلية على GitHub
دليل التكامل بالتطوير اليدوي (9 لغات، دون AI)
ينطبق هذا الدليل على موفّر Licentivo. يمكن للتجار الذين لديهم نظام ترخيص آخر اختيار الخدمة المخصصة في «اختيار الترخيص وتخصيصه» بلوحة الإدارة، والتكامل وفق واجهة API للترخيص المخصص وعملية الربط، ومواصلة استخدام SDK نظام الترخيص الخاص بهم.
تستخدم التغييرات الحالية غير المنشورة تبادل هوية الحساب؛ راجع حدود مدة الشراء وSDK الحساب لمعرفة المسؤوليات وقيود الترحيل. يحسب Launch مدة الشراء؛ وينفذ Licentivo SDK الترخيص.
ثبّت حزمة تكامل Launch للغة المقابلة فقط. تتضمن حزمة Launch SDK الرسمي والمحول الافتراضي وإعداد الربط؛ وعنوان الترخيص الرسمي ثابت وهو https://www.licentivo.com. يستخدم التطبيق حساب المشتري المسجل في متجر Launch الحالي لتسجيل الدخول.
الحصول على رمز التهيئة المعبأ
- اربط البرنامج وخطة البيع وسياسة ترخيص Licentivo في لوحة إدارة Launch، ثم انشرها في البيئة المقابلة.
- افتح تكامل التطبيق → فحص التكامل والرمز، واختر البرنامج واللغة وبيئة الاختبار/الإنتاج.
- انقر «قراءة معلومات المنتج وإنشاء رمز التكامل». يقرأ Launch تلقائيًا العنوان العام الحالي للموقع وتعيين المنتج الموجود ومفتاح التوقيع العام.
- انسخ دالة الاتصال من الصفحة إلى مشروعك، واكتب الواجهة واستدعاءات الأعمال يدويًا وفق ما يلي. ويمكنك أيضًا مراجعة المعلمات المعبأة تلقائيًا واستدعاء
Connect/connectللغة المقابلة بنفسك.
لا حاجة لإدخال معرّفي المنتج الداخليين يدويًا أو إنشاء launch-config.json أو product.json. ما يمكن حفظه من الصفحة هو دالة الاتصال في المصدر. ملف الخادم الخاص config.yaml مخصص لبدء خدمة Launch فقط ولا يجوز توزيعه مع برنامج العميل.
يأتي عنوان الموقع من العنوان العام الصالح للمثيل الحالي (public_url في إعداد بدء التشغيل، أو العنوان العام الصالح في إعدادات الموقع بلوحة الإدارة). يمكن أن يكون اسم نطاق أو عنوان IP يتضمن منفذًا، لكن يجب أن يتضمن البروتوكول؛ ويستخدم التكامل الإنتاجي HTTPS صالحًا. عنوان الاستماع http_addr ليس عنوان وصول العميل. بعد تغيير عنوان الموقع أو تعيين المنتج أو البيئة، احصل على دالة الاتصال مجددًا من الموقع الحالي؛ ولا يجوز استخدام جلسات الموقع القديم وذاكرته المؤقتة لترخيص الموقع الجديد.
رقما المنتج يمثلان العلاقة الداخلية الموجودة في النظام: منتج برنامج Launch ومنتج ترخيص Licentivo. تملؤهما صفحة التكامل تلقائيًا حسب البرنامج المحدد؛ ولا يدخل المشتري إلا حساب المتجر. يقرأ الخادم مفتاح التوقيع العام باستخدام اتصال Licentivo المهيأ؛ ولا تدخل مفاتيح الإدارة وبيانات ترخيص العميل إلى المصدر.
وظيفة Connect/connect
Connect/connect هو اسم عملية «إنشاء عميل تطبيق Launch» في اللغات المختلفة. تستخدم Go وC# وبعض الواجهات الأصلية Connect بحرف أول كبير، بينما تستخدم Python وJavaScript وRuby وغيرها connect وفق أسلوب كل لغة. الدوال connectLaunch() أو connect_launch() أو LaunchConnection.Open() التي تنشئها لوحة الإدارة هي دوال مشروع تُملأ فيها المعلمات العامة مسبقًا، وتستدعي داخليًا مدخل اللغة المقابل.
يقتصر الاتصال على التهيئة: يتحقق من عنوان المتجر وتعيين المنتج والبيئة ومفتاح التوقيع العام، وينشئ عميل Launch، ويهيئ Licentivo SDK الرسمي داخل الحزمة. لا يتحقق من هوية العميل ولا يفتح الميزات المدفوعة مباشرة. التسلسل الكامل هو:
Connect/connect → Login or Restore → RunFeature → Logout / Close
└──────────→ ReleaseDevice (explicit device unlink only)
احتفظ بكائن العميل نفسه طوال تشغيل التطبيق كي يعالج SDK ضربات القلب والمقاعد العائمة بصورة صحيحة. يحافظ الإغلاق العادي على ربط الجهاز؛ ويستدعي خروج العميل الصريح ومدخل التوافق ReleaseDevice عملية الخروج نفسها في SDK الرسمي.
مداخل التثبيت والتهيئة
اجتازت عمليات التحقق من التثبيت العام للإصدار 0.1.6 جميع اللغات التسع (9/9)، وقد تم التحقق من طرق التثبيت في الجدول أدناه. يوفر GitHub Release أيضًا حزمًا أصلية وملفات دون اتصال؛ راجع تعليمات تثبيت الحزمة المنزلة.
| اللغة | تثبيت Launch فقط | دالة الاتصال التي توفرها الصفحة | واجهة API للتهيئة المباشرة داخل الحزمة |
|---|---|---|---|
| Go | go get github.com/spf86/licentivo-launch-sdk/pkg/launchclient@v0.1.6 |
connectLaunch() |
launchclient.Connect |
| Python 3.10+ | python -m pip install licentivo-launch==0.1.6 |
connect_launch() |
Application.connect |
| C# / .NET 8+ | dotnet add package Licentivo.Launch --version 0.1.6 |
LaunchConnection.Open() |
Application.Connect |
| Java 17+ | Maven/Gradle:com.licentivo.launch:launch-client:0.1.6 |
LaunchConnection.open() |
Launch.connect |
| Node.js 20.3+ | npm install @licentivo/launch@0.1.6 |
connectLaunch() |
Application.connect |
| Rust 1.85+ | cargo add licentivo-launch@=0.1.6 |
connect_launch() |
Application::connect |
| Ruby 3.1+ | gem install licentivo-launch --version 0.1.6 |
connect_launch |
Application.connect |
| C11 | نزّل الحزمة الأصلية من GitHub Release، ثم استوردها باستخدام CMake | connect_launch() |
launch_application_connect |
| C++17 | استخدم حزمة Launch الأصلية نفسها | connectLaunch() |
Application::Connect |
المصدر العام وملفات README لكل لغة في مستودع Launch SDK، والحزم الأصلية والملفات دون اتصال في v0.1.6 Release، ونتائج التثبيت العام في التحقق من سجل اللغات التسع. يوفر README كل حزمة أوامر التثبيت وAPI. تتضمن حزمة JavaScript تصريحات TypeScript. يحل مدير الحزم الاعتماديات اللغوية العادية، مثل cryptography لـ Python وBouncyCastle لـ C# وbase64 لـ Ruby؛ ولا يلزم تثبيت حزمة SDK الرسمية.
اسم وحدة Go العامة هو github.com/spf86/licentivo-launch-sdk ومسار الاستيراد github.com/spf86/licentivo-launch-sdk/pkg/launchclient؛ ولا يحتاج التطبيق إلى replace محلي. تستخدم حزمة Windows الأصلية amd64 GNU/MinGW، وتتوفر أيضًا حزمة Linux amd64 أصلية. تتضمن حزمة منصة Ruby وتوزيعات Windows لـ Rust/native مكتبة curl؛ ويتطلب بناء المصدر للمنصات الأخرى اعتماديات تطوير C11 وcurl/OpenSSL المعتادة. راجع README كل حزمة لتفاصيل سلسلة أدوات المنصة.
تسجيل الدخول والعمليات المحمية
تستخدم المقاطع التالية دالة الاتصال المنسوخة في الخطوة السابقة. يأتي email وpassword من واجهة تسجيل الدخول الخاصة بك؛ ولا يجوز كتابة كلمة المرور في المصدر أو الإعداد. يجب استبدال export باسم ميزة موجود فعليًا في سياسة الخطة.
Go
app, err := connectLaunch()
if err != nil { return err }
defer app.Close()
if _, err := app.Login(ctx, email, password); err != nil { return err }
return app.RunFeature("export", func() error {
return exportReport()
})
يستخدم ctx سياق دورة حياة التطبيق؛ ولا يجوز إلغاء ضربات القلب فور انتهاء طلب تسجيل الدخول. ضع عمليات الشبكة في خيط عمل خلفي. استدعِ Restore(ctx) للاستعادة وLogout(ctx) للخروج من الحساب وReleaseDevice(ctx) لتحرير الجهاز.
Python
with connect_launch() as app:
app.login(email, password)
result = app.run_feature("export", export_report)
تستعيد restore() جلسة آمنة موجودة؛ وعند عدم وجود جلسة اعرض واجهة الدخول. تنظف logout() الحساب؛ وتحرر release_device() الجهاز صراحة. لا تدع عمليات الشبكة المتزامنة تحجب حلقة أحداث سطح المكتب.
C# / .NET
await using var app = LaunchConnection.Open();
await app.Login(email, password);
await app.RunFeature("export", async () => {
await ExportReport();
});
استخدم await Restore() وawait Logout() وawait ReleaseDevice(). حافظ على دورة حياة SDK طوال تشغيل التطبيق واستخدم تدفق واجهة غير متزامن.
Java
try (var app = LaunchConnection.open()) {
app.login(email, passwordChars);
app.runFeature("export", () -> exportReport());
}
استخدم char[] لكلمة المرور. تعيد restore() فشل NO_SESSION عند عدم وجود جلسة، وعندها يجب عرض واجهة الدخول؛ ولا يجوز اعتبار حالات الفشل الأخرى ترخيصًا. logout() وreleaseDevice() عمليتان مختلفتان. تتولى try-with-resources الإغلاق.
JavaScript / Node.js / TypeScript
const app = connectLaunch();
try {
await app.login(email, password);
const result = await app.runFeature('export', () => exportReport());
} finally {
await app.close();
}
تعيد restore() القيمة null عند عدم وجود جلسة؛ ولا يُسمح بتنفيذ الأعمال إلا بعد الاستعادة الناجحة. تشير القيمة المنطقية التي تعيدها logout() إلى تأكيد الخروج عن بُعد، ويجب عرض خطأ عند فشل تحرير الجهاز. يعمل الرمز في Node.js أو عملية Electron الرئيسية أو خلفية موثوقة؛ ولا يخزن المتصفح وعملية العرض في Electron بيانات الترخيص السرية.
Rust
let mut app = connect_launch()?;
app.login(&email, &password)?;
let result = app.run_feature("export", || {
export_report()?;
Ok(())
})?;
app.close();
يعيد رد النداء Result<T, Failure>. تعيد restore() وlogout() وrelease_device() نتائج يجب التعامل مع فشلها. يتولى Drop أيضًا إغلاق بيئة التشغيل. يترجم build.rs النواة الأصلية الافتراضية ويربطها؛ ولا تحتاج إلى ربط SDK الرسمي بنفسك.
Ruby
app = connect_launch
begin
app.login(email, password)
result = app.run_feature('export') { export_report }
ensure
app.close
end
تستعيد restore الجلسة، وتخرج logout من الحساب، وتحرر release_device الجهاز. تستخدم العمليات المحمية كتل التعليمات البرمجية؛ ولا يجوز تحويل الاستثناء إلى نجاح.
C
static int export_action(void *context) {
return export_report(context); /* Return 1 only on success. */
}
launch_application *app = connect_launch();
if (!app) return 0;
int ok = launch_application_login(app, email, password);
if (ok) ok = launch_application_run_feature(app, "export", export_action, context);
/* Check launch_application_error(app) on failure; never log credentials. */
launch_application_close(app);
return ok;
تحتوي launch_application_restore على ثلاث حالات: 1 تمت الاستعادة، و0 لا توجد جلسة، و-1 فشل. لا تُعرض واجهة الدخول بصورة عادية إلا عند عدم وجود جلسة؛ ولا يجوز اعتبار الرفض أو الاستثناء نجاحًا. يجب أيضًا فحص القيم المعادة من logout وrelease_device.
يستورد CMake حزمة Launch فقط:
find_package(LicentivoLaunch CONFIG REQUIRED)
add_executable(myapp main.c)
licentivo_launch_link(myapp)
C++
auto app = connectLaunch();
app.Login(email.c_str(), password.c_str());
app.RunFeature("export", [&] { exportReport(); });
تتبع Restore() وLogout() وReleaseDevice() دلالات استثناءات C++. يتولى مدمّر RAII الإغلاق. يستخدم CMake licentivo_launch_link(myapp CXX)، ويتولى Launch تلقائيًا ربط SDK ومكتبات التشغيل في حزمة التوزيع.
دورة الحياة والتخزين الآمن والأخطاء
إنشاء كائن الاتصال لا يكمل سوى التهيئة. يجب أن يسجل التطبيق الدخول أو يستعيد الجلسة بنجاح ويستخدم رد نداء حماية الميزة في كل عملية عمل. لا يحل دفع الطلب أو وجود جلسة أو إمكانية النقر على الزر محل تحقق SDK.
تُحفظ الجلسة افتراضيًا في الذاكرة فقط. يتطلب تذكر تسجيل الدخول تخزينًا آمنًا: توفر Go وPython وC# وC/C++ الأصلية Windows DPAPI للمستخدم الحالي؛ وتوفر Java وNode وRust وRuby تخزين AES-GCM بمفتاح يديره المستدعي. يجب أن تتكامل التطبيقات متعددة المنصات مع مخزن بيانات اعتماد النظام. لا يجوز وضع المفتاح والنص المشفر في الدليل العادي نفسه.
يحافظ الإغلاق العادي على الجلسة التي اختار المستخدم تذكرها ويوقف بيئة التشغيل. يستدعي الخروج من الحساب أولًا خروج SDK الرسمي الموحد، ثم ينظف سجل حساب Launch الخاص. ReleaseDevice مدخل توافق للعملية نفسها؛ ولا يجوز الإبلاغ عن نجاح التحرير ما دام الإلغاء عن بُعد معلقًا. لا تنظف دليل ذاكرة SDK الرسمي المؤقتة أو سجل استعادة الخروج. حماية جلسة Launch لا تعني تشفير جميع ملفات الأجهزة في SDK الرسمي؛ ويجب تقييد أذونات دليل الذاكرة المؤقتة.
| الحالة | معالجة التطبيق |
|---|---|
| فشل الحساب أو كلمة المرور | اعرض فشل دخول عامًا دون كشف وجود الحساب |
| EMAIL_VERIFICATION_REQUIRED | وجّه المستخدم لإكمال التحقق من بريد المتجر |
| ENTITLEMENT_PENDING | اعرض أن المزامنة جارية وانتظر وفق إعادة المحاولة المحدودة للحزمة وRetry-After |
| ENTITLEMENT_NOT_PURCHASED | وجّه المستخدم للشراء أو تبديل الحساب |
| ENTITLEMENT_EXPIRED | وجّه المستخدم للتجديد ولا تستخدم بيانات اعتماد قديمة لتجاوز الرفض |
| ENTITLEMENT_SUSPENDED | أوقف الميزات المحمية واتصل بالتاجر |
| اكتمل عدد الأجهزة | وجّه المستخدم لإدارة الأجهزة أو تحرير جهاز صراحة |
| الشبكة/HTTP 5xx | لا يجوز إلا استخدام ترخيص دون اتصال تحقّق منه SDK وما زال ساريًا |
لا يجوز تحويل 401/403/404 الصريحة أو عدم تطابق الحساب أو الإلغاء أو تحديد المعدل إلى نجاح ترخيص دون اتصال. يتطلب التفعيل الأول والسياسات التي تمنع العمل دون اتصال شبكة. عند تعذر الوصول إلى نطاق/IP الخادم اعرض مشكلة الاتصال، ولا تتصل بموقع آخر خفية.
القبول والمراجع
تحقق من الدخول الفعلي وترخيص الحساب المعني والعمليات المحمية والاستعادة بعد إعادة التشغيل والعمل دون اتصال الصالح وانتهائه والعبث بالذاكرة المؤقتة والخروج وتبديل الحساب وتحرير الجهاز. لا تتطلب هذه الوثيقة استخدام AI. راجع acceptance.md لأدوات الاختبار وحدود القبول الخارجي، وintegration-packages.md للحزم المحلية وتعليمات البناء.
لا تثبت فحوص الإعداد وإنشاء الرمز والاختبارات المحلية تلقائيًا نجاح الدفع الفعلي أو إصدار الترخيص أو التفعيل على الموقع الرسمي. يجب إعداد المتاجر الخارجية وبيئة الدفع التجريبية وقبولها بصورة منفصلة.