السلوك لتغيير كبير في الموقع واجهة برمجة تطبيقات عند إنهاء/تعليق؟

StackOverflow https://stackoverflow.com/questions/3421242

سؤال

هذا هو القسم من CllocationManager الوثائق التي تصف سلوك التطبيق مع startMonitoringSignIngAntLocationChanges:

إذا بدأت هذه الخدمة وتم إنهاء التطبيق الخاص بك لاحقًا ، يقوم النظام تلقائيًا بإعادة تشغيل التطبيق إلى الخلفية في حالة وصول حدث جديد. في مثل هذه الحالة ، تم تمرير قاموس الخيارات إلى التطبيق: DidFinishLaunchingWithOptions: طريقة مندوب التطبيق الخاص بك يحتوي على uiapplicationLaunchoptionSlocationKey الرئيسية للإشارة إلى أن التطبيق الخاص بك قد تم إطلاقه بسبب حدث الموقع. عند إعادة التشغيل ، لا يزال يتعين عليك تكوين كائن مدير الموقع والاتصال بهذه الطريقة لمواصلة استلام أحداث الموقع. عند إعادة تشغيل خدمات الموقع ، يتم تسليم الحدث الحالي إلى مندوبتك على الفور. بالإضافة إلى ذلك ، يتم ملء خاصية الموقع لكائن Manager الخاص بك مع أحدث كائن الموقع حتى قبل بدء خدمات الموقع.

لذا أفهم أنه إذا انتهى تطبيقك (وأفترض إذا لم تتصل stopMonitoringSignificAntLocationChanges من عند applicationwillterminate) سوف تستيقظ مع أ UiapplicationLaunchOptionSlocationKey المعلمة ل التطبيق: didfinishlaunchingwithoptions. في تلك المرحلة ، تقوم بإنشاء الخاص بك CllocationManager, ، يتصل startMonitoringSignIngAntLocationChanges والقيام معالجة موقع الخلفية الخاص بك ل وقت محدود. لذلك أنا بخير مع هذا الشيء.

تتحدث الفقرة السابقة فقط عما يحدث عند إنهاء التطبيق ، لا يقترح ما تفعله عند تعليق التطبيق. الوثائق ل didfinishlaunchingwithoptions يقول:

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

مما يشير إلى أنك ستتلقى هذه المكالمة فقط عند إطلاق التطبيق الخاص بك (بسبب تغيير الموقع) بعد إنهاءك.

ومع ذلك الفقرة على خدمة تغيير كبيرة في ال دليل برمجة الوعي بالموقع لديه ما يلي ليقول:

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

هذا يشير إلى أنك تستيقظ مع بيانات الموقع إذا تم تعليق تطبيقك ، لكنه فشل في ذكر كيف تستيقظ:

  • هل UiapplicationDelegate الحصول على رد اتصال يخبرني أنني أستأنف من حالة مع وقف التنفيذ في حالة خلفية؟
  • هل يبدأ مدير الموقع (الذي تم تجفيفه عندما تم تعليق التطبيق) في الاستلام LocationManager: DidupDatetOlocation: FromOlcing عمليات الاسترجاعات؟
  • هل أنا فقط بحاجة إلى تنفيذ التعليمات البرمجية في بلدي didupdatetOlocation الرسالة التي تتحقق من حالة التطبيق وتفعل الحد الأدنى من المعالجة إذا كان في وضع الخلفية؟

في عملية كتابة هذا الأمر ، أعتقد أنني ربما أجبت للتو على سؤالي ، ولكن سيكون من الرائع أن أكد هذا من قبل شخص أكثر دراية.

هل كانت مفيدة؟

المحلول

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

أي أن تطبيقك المعلق قد استيقظ ، لا تتلقى أي عمليات اتصال على مندوب التطبيق الخاص بك ، وبدلاً من ذلك ، تتلقى تحديثات موقعك من خلال موجودك CllocationManagerDelegate. يمكنك اكتشاف أنك تعمل في الخلفية عن طريق التحقق من ApplicationState, ، وقم بعمل محدود للحالة التي تستيقظ فيها من ولاية معلقة للقيام بمعالجة الموقع.

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

توصلت إلى هذا الاستنتاج مع تسخير اختبار الموقع الذي نرحب به تحميل وجرب. إنه تطبيق بسيط جدًا يتيح لك تشغيل تغيير كبير وتغيير GPS واجهات برمجة التطبيقات من خلال واجهة المستخدم وتسجيل جميع الردود التي تعود إليها.

NB النقطة السادسة في الإجابة السابقة غير صحيحة. تجميد تتلقى التطبيقات المعلقة CllocationManagerDelegate عمليات الاسترجاعات عندما يستيقظون من دولة مع وقف التنفيذ.

نصائح أخرى

ما يلي على النحو التالي (أنا بصدد كتابة تطبيق يعتمد على واجهة برمجة التطبيقات هذه ، لكن لم أكمل هذا المكون بما يكفي لبدء الاختبار):

  1. يتم تشغيل طلبك لأول مرة ، يمكنك التسجيل في startMonitoringSignIngAntLocationChanges, ، وتوفير وظيفة رد الاتصال. أثناء تشغيل التطبيق الخاص بك ، سيتصل بهذا رد الاتصال كلما تلقى تغييرًا كبيرًا.
  2. إذا تم طرح طلبك على الخلفية ، فسيتلقى UIApplication ApplicationWillResignactive, ، تليها ApplicationDidentErbackground.
  3. إذا تم قتل طلبك أثناء تعليقه في الخلفية ، فلن يتم إخطارك ؛ ومع ذلك ، إذا تم قتل طلبك أثناء تشغيله (المقدمة أو الخلفية على حد علمي) ، فسوف تحصل على لحظة مع applicationwillterminate. لا يمكنك طلب وقت خلفية إضافي من هذه الوظيفة.
  4. على الرغم من قتله في الخلفية ، فإن نظام التشغيل سيقوم بإعادة تشغيل طلبك. إذا تم إطلاق التطبيق الخاص بك ببساطة بواسطة نظام التشغيل للتغيير ، فستحصل على مكالمة إلى تطبيق didfinishlaunchingwithoptions:

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
    

    سوف تساعدك على تحديد ما إذا كنت قد عادت من تغيير موقع الخلفية.

  5. إذا ، بدلاً من ذلك ، كنت تعمل حاليًا في الخلفية ، ويتم إعادة تشغيل التطبيق يدويًا من قبل المستخدم ، فستتلقى ملف ApplicationWillenterforeground تليها ApplicationDidBecomeActive.
  6. بغض النظر عن كيفية حدوث ذلك ، عندما يتم إعادة تشغيل طلبك (ما لم يكن ما زال قيد التشغيل في الخلفية نتيجة لمهمة الخلفية وبدأت المهمة في مراقبة التغييرات) ، فأنت بحاجة إلى إخبارها بشكل صريح بذلك startMonitoringSignIngAntLocationChanges مرة أخرى لأن رد الاتصال لم يعد مرفقًا بعد "تجميد التجفيف". ونعم ، تحتاج فقط إلى تنفيذ التعليمات البرمجية في تحديد موقع DidupDateToLocation بمجرد إعادة توحيد معالج الموقع من نوع ما بمجرد العودة من الحالة المعلقة.

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

أوه ، وإذا كان من السكتة الدماغية من الحظ السيئ ، فأنت تطلق تطبيقًا يقوم بما أريد أن أفعله ، فقد أبكي :)

حظا طيبا وفقك الله!

إذا تم استحضار التطبيق من الحالة المعلقة نتيجة لتغيير الموقع ، فسيتم إطلاق تطبيق في حالة الخلفية.

ستكون جميع الكائنات حية وستتلقى تحديث الموقع في المندوب الحالي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top