كيف شاركت الموقع من خلال VK API

قررت مؤخرًا محاولة تطبيق فكرة كيفية مشاركة موقع عبر واجهة VK API مع الأصدقاء في وضع الوقت الفعلي القريب. كان الإخراج عبارة عن تطبيق Qt عبر النظام الأساسي لنظام iOS / Android ، وهو تطبيق ويب لـ VKontakte وعدد من طلبات السحب لـ VK API. في هذه المقالة ، أود أن أشارك بعض نقاط التنفيذ غير الواضحة التي قد تهم شخصًا ما. لذلك ، مهتمة يرجى السؤال عن القط.

لماذا أحتاجه على الإطلاق


عاجلاً أم آجلاً ، يكبر الأطفال. الحقيقة عاديا. هكذا قالت ذات يوم ابنتي البالغة من العمر عشر سنوات: "أبي ، لم تعد تأخذني بالسيارة بعد الآن ، أريد الذهاب إلى المدرسة بمفردي!" حسنًا ، إذن ، وجدت المطالبة عادلة ، وطلبت فترة سماح مدتها أسبوعين ، وبدأت الاستعدادات.

نظرًا لأن لديّ بعض تطبيقات الكتابة ، ولديّ ابنتي باستمرار في جيب iPhone SE ، كإعداد ، فقد تقرر بسرعة كتابة تطبيق يُظهر مكان ابنته في هذه اللحظة بالذات. نعم ، أعلم أنه يوجد الآن الكثير من هذه التطبيقات (حتى ظهور وظائف مماثلة في خرائط Google مؤخرًا) ، وكان من الممكن استخدام بعض الحلول الجاهزة ، لكنني كنت مهتمًا بكتابة شيء خاص بي.

لماذا فكونتاكتي؟


نظرًا لأنني لا أرغب في ربط معالجة وتخزين البيانات الشخصية للأشخاص الآخرين (في احتمال محتمل) على أجهزتي بكل "السحر" الناتج عن ذلك ، فكرت في كيفية الاستغناء عن جزء الخادم الخاص بي. وبعد ذلك بزغ فجر علي - بعد كل شيء ، هناك وحش مثل فكونتاكتي! إنه عصري ، قوي ومعه واجهة برمجة التطبيقات المتقدمة ، والأهم من ذلك ، أن جميع أطفالنا ظلوا يجلسون فيه لفترة طويلة وكانوا متشددين (لا أستطيع أن أقول أنني أعجبتني ، لكنها حقيقة واقعة). لكن الجحيم ، هولمز ، كيف يمكنني إدخال بيانات الموقع فيها ، أولاً ، لا تظهر في الأماكن التي لا تكون فيها ضرورية ، وثانياً ، بحيث يمكنك التحكم في الوصول إلى هذه البيانات بحيث يتم التحكم في البيانات السيئة لهم لم تصل إلى هناك؟

وجاءت الملاحظات لانقاذ. نعم ، تلاحظ ويكيبيديا نفسها أنه ذات مرة (وفقًا للشائعات) كانت شائعة جدًا وأصبحت الآن في القلم ، فقد توقف معظمها عن الوميض في الأشرطة وانتقلت إلى قسم منفصل من الموقع ، وهو ما لن تحصل عليه في عنزة عرجاء. يمكن أن تحتوي على بيانات نصية اعتباطية ، ولكن الشيء الرئيسي هو أنه يمكن تعيين قوائم وصول لها تدرج أسماء الأشخاص والمجموعات الذين يمكنهم رؤية هذه الملاحظة والتعليق عليها.

بدأ المخطط العام للتطبيق في عيني لتبدو كما يلي:

  • إنشاء قائمة بالأصدقاء الذين تريد مشاركة بيانات الموقع معهم (أطلق عليها "الأصدقاء الموثوقون") ؛
  • نقوم بإنشاء ملاحظة تحمل اسمًا محددًا ، ونمنح حقوقًا لعرضها على القائمة أعلاه ، وكتابة بيانات الموقع هناك وتحديثها بشكل دوري ؛
  • نحن ندير بانتظام قائمة الأصدقاء الموثوق بهم ، ونتحقق مما إذا كان لديهم أيضًا ملاحظة بهذا الاسم المحدد ، وإذا كان كذلك ، فسنحاول استخراج البيانات حول موقع الصديق من محتوياته ، وإذا نجح ، نعرضها على الخريطة ؛
  • ؟؟؟
  • الربح!

لذلك ، هناك فكرة ، الأمر متروك لتحقيق الشيء الصغير.

iOS


نظرًا لأن ابنتها تستخدم جهاز iPhone ، فمن المنطقي البدء في التنفيذ باستخدام إصدار iOS. من أجل النظام الأساسي المشترك ، تم اختيار Qt كإطار عمل ، لأنني كنت على دراية به منذ فترة طويلة ، وتم اختيار خريطة الشارع المفتوح القديمة الجيدة ، والتي يوجد مكون إضافي لها في Qt Location ، كمحرك للخريطة. منذ أن تم إنشاء التطبيق في الأصل كمصدر مفتوح ، لم تخيفني قيود ترخيص كيو تي.

تمت كتابة واجهة المستخدم الرسومية في QML ، للعمل مع VK ، لقد قمت بالاتصال واستخدمت VK iOS SDK العادية ، وهو مكتوب في Objective-C ، وبالتالي فإن تكامله لم يسبب أي مشاكل. يتم تنفيذ العمل في الخلفية على iOS من خلال خدمة تغيير الموقع الهامة. لتقليل استهلاك الطاقة ، يراقب التطبيق نشاط الحركات ، وإذا كان يدرك أن الشخص يجلس في مكان واحد تقريبًا لفترة طويلة (على سبيل المثال ، فقد جاء إلى المدرسة أو المكتب) ، ثم خفض الدقة المطلوبة لتحديد الموقع الجغرافي ، مما اضطر نظام التشغيل إلى التبديل إلى طرق أقل كثافة في استهلاك الطاقة (كيف كقاعدة عامة ، على أبراج الخلية). إذا كان التطبيق يدرك أن الشخص قد بدأ يتحرك بنشاط ، فإن الدقة ترتفع مرة أخرى.

يتوفر رمز المصدر الكامل لإصدار iOS على GitHub . إليك بعض النقاط غير الواضحة التي واجهتها في عملية التنفيذ:

تجاوز أساليب NSApplicationDelegate في تطبيق Qt

يتطلب VKontakte iOS SDK إضافة مكالمات إلى بعض وظائفه في التطبيق: didFinishLaunchingWithOptions: والتطبيق: openURL: options: methods. قبل إصدار من Qt (في رأيي ، قبل 5.11) ، كان يكفي إنشاء فئة لـ QIOSApplicationDelegate مثل هذا:

@interface QIOSApplicationDelegate : UIResponder <UIApplicationDelegate> @end @interface QIOSApplicationDelegate (QIOSApplicationDelegateVKGeoCategory) @end @implementation QIOSApplicationDelegate (QIOSApplicationDelegateVKGeoCategory) - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [...] } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { [...] } @end 

ولكن في الإصدارات الأخيرة من Qt ، QIOSApplicationDelegate بالفعل تطبيق للتطبيق: openURL: خيارات: ، وبالتالي فإن الخيار مع فئات لم تعد القوائم. اضطررت إلى عمل وريث من QIOSApplicationDelegate وتعيين مفوض عبر setDelegate:

 @interface VKGeoApplicationDelegate : QIOSApplicationDelegate @end @implementation VKGeoApplicationDelegate - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { [...] } @end void InitializeVKGeoApplicationDelegate() { [[UIApplication sharedApplication] setDelegate:[[VKGeoApplicationDelegate alloc] init]]; } int main(int argc, char *argv[]) { [...] InitializeVKGeoApplicationDelegate(); [...] } 

خطأ في معالجة من VKRequest

واجه أن VKRequest على خطأ عاد فارغة (فارغة) NSError. لقد قمت بعمل تصحيح يرقع التصحيح السابق لشخص ما ويسحب طلب هذا التصحيح ، لكنه لا يزال معلقًا في تصحيحات لم تتم مراجعتها.

أندرويد


فيما يلي إصدار Android. تمت إعادة استخدام رمز واجهة المستخدم الرسومية من نظام التشغيل iOS بشكل كامل تقريبًا ، للتفاعل مع VK ، تم استخدام VK Android SDK العادي مرة أخرى ، والتفاعل الذي يحدث من خلال JNI ، يتم تنفيذ العمل في الخلفية وفقًا لعهود Google لمثل هذه التطبيقات - أي من خلال خدمة المقدمة. بالطبع ، يتم أيضًا تنفيذ منطق تقليل استهلاك الطاقة ، على غرار المنطق المستخدم في نظام التشغيل iOS.

تتوفر مجموعة التعليمات البرمجية المصدر الكاملة لإصدار Android مرة أخرى على GitHub ، وإليك بعض النقاط غير الواضحة التي صادفتها في عملية تنفيذ هذا الإصدار:

كيفية إنشاء خدمة أندرويد على كيو تي

لإنشاء خدمة في Qt 5.10 ، ظهرت فئة QAndroidService ، والتي يجب استخدامها بدلاً من QGuiApplication. يمكنك تجميع .so بشكل منفصل للنشاط والخدمة ، أو يمكنك استخدام واحد .so لكل شيء ، ولكي يفهم الكود الوضع الذي يعمل فيه ، يمكنك تحديد هذا الوضع من خلال مفتاح سطر الأوامر ، شيء مثل هذا:

 <service android:name=".VKGeoService"> <meta-data android:name="android.app.arguments" android:value="-service"/> </service> 

 int main(int argc, char *argv[]) { if (argc == 1) { QGuiApplication app(argc, argv); [...] } else if (argc == 2 && QString(argv[1]) == "-service") { QAndroidService app(argc, argv); [...] } else { return 0; } } 

نشاط "معلق" غريب في onDestroy ()

في عملية تنفيذ الخدمة ، أصبحت مشكلة مضحكة واضحة - QtActivity "معلقة" في مكان ما في أحشاء onDestroy () ، رهنا بتوافر خدمة مقدمة العمل. على ما يبدو ، لا تتوقع شركة Qt أنه بعد اكتمال النشاط ، قد يبقى شيء آخر من التطبيق. تم حل المشكلة عن طريق تباعد النشاط والخدمة عبر عمليات مختلفة من خلال استخدام android: process in the البيان:

 <service android:name=".VKGeoService" android:process=":VKGeoService"> [...] </service> 

وتسمير العملية التي يتم فيها تشغيل النشاط ، في onDestroy () تجاوز:

 @Override public void onDestroy() { [...] /* * This call hangs when foreground service is running, * so we just kill activity process instead (service * is running in a different process). * * super.onDestroy(); */ Process.killProcess(Process.myPid()); } 

نعم ، أقسمها باستمرار ، لكن كيفية التعامل معها بطريقة مختلفة لم تكن واضحة لي ، لكن الحصول على QTBUG مع PoC حول هذا الموضوع لم يصل إلى أي شيء حتى الآن.

تحديث : في Qt 5.12.3 (ربما قبل ذلك بقليل - لم أقم بالتحقق) تم إصلاح الخلل مع تعليق QtActivity.onDestroy () عند بدء تشغيل الخدمة ، لم يعد هذا الحل البديل ضروريًا.

خطأ errorBlock المكالمة عند إلغاء VKBatchRequest

أستخدم طلبات الدُفعات على نطاق واسع لتخفيف التحميل على خوادم VKontakte ، ويوجد تحت نظام Android (كل شيء يعمل بشكل جيد بموجب iOS) أنني واجهت مشكلة إذا تم إلغاء VKBatchRequest ولم يتم استدعاء errorBlocks للطلبات التي تم إلغاؤها. لقد أصلحت هذه المشكلة في الإصدار المحلي من المكتبة ، وقمت بطلب التصحيح والتصحيح المناسب لهذا التصحيح ، ولكن مرة أخرى لا تزال معلقة في تلك التي لم تتم مراجعتها.

الخاتمة


تم وضع إصدار iOS من Apple بسهولة في App Store ، وهو لا يزال متاحًا هناك. لقد ظل إصدار Android يعمل على Google Play لفترة من الوقت حتى تم تشديد سياسة Google Play (التي تنص على أن تتبع تطبيقات تحديد الموقع الجغرافي يجب أن يكون صريحًا مخصص للاستخدام العائلي أو المؤسسي) ، وبعد ذلك تم حظر تطبيقي بأمان هناك. لمحاولتي الاستئناف ، أوضح موظف Google المسؤول (أو ربما كان روبوتًا ، وليس من الواضح الآن من الذي يجيب على أسئلتك بالضبط) أنه "حسنًا ، قد لا يتم استخدام هذا التطبيق فقط لتتبع العائلة أو الشركات" ، والتي لم أجد أي شيء أقوله - في الواقع ، باستخدام المطرقة ، لا يمكنك فقط مطرقة الأظافر ، ولكن أيضًا لكمة رؤوسك ... لقد وضعت إصدار Android في Yandex.Store و Amazon Appstore وكموقع APK على موقع المشروع.

سأكون سعيدًا إذا كان هذا التطبيق مفيدًا لشخص ما كوسيلة مساعدة مرئية لتوضيح بعض اللحظات غير الواضحة عند كتابة تطبيق Qt لنظام التشغيل iOS / Android ، خاصة تلك المتعلقة بتنفيذ خدمة Android على Qt (هذه الوظيفة جديدة نسبيًا ، أمثلة على التنفيذ ، وكم أنا لا أعرف الكثير). سأكون سعيدًا أيضًا بالإجابة على الأسئلة الواردة في التعليقات ، إن وجدت.

Source: https://habr.com/ru/post/ar434996/


All Articles