ماذا يحدث لتطبيق iPhone عندما ينتقل iPhone إلى وضع الاستعداد؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

يستخدم تطبيقي NSTimer ويبدو أن NSTimer لا يعمل عندما ينتقل iPhone إلى وضع الاستعداد (إما عن طريق الضغط على زر الجهاز أو عن طريق مؤقت الخمول).

عندما أقوم بتنشيط iPhone مرة أخرى، يظل تطبيقي في المقدمة.ماذا يحدث لتطبيقات الطرف الثالث عندما يكون iPhone في وضع الاستعداد؟

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

المحلول

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

في حال كان لدى شخص آخر نفس السؤال ووجد الصفحة في المستقبل، فإليك ردًا مفيدًا تم نشره بواسطة شخص ما في منتدى Apple يُدعى "eskimo1" (والذي قمت بتحريره قليلاً بحيث يسهل قراءته دون الحاجة إلى السياق المقدمة من الموضوع الأصلي بأكمله):

  • فيما يتعلق بمصطلحات حالة تطبيقات iPhone، فإن كلمة "نشط" لا تعني "مستيقظًا"، بل تعني "مرفق بواجهة المستخدم الرسومية".فكر في الأمر على أنه مشابه لـ "الأمامية" في نظام التشغيل Mac OS X.عندما تقوم بقفل الجهاز، يتم إلغاء تنشيط التطبيق الخاص بك ولكن الجهاز قد يدخل أو لا يدخل في وضع السكون
  • نادرًا ما ينام نظام تشغيل iPhone إذا كان الجهاز متصلاً بمصدر الطاقة الرئيسي (أي عبر USB).ومع ذلك، يمكنه النوم إذا كان يعمل بالبطارية.
  • وبعد وقت قصير من قفل الشاشة (20 ثانية وفقًا لأوليفر دروبنيك)، يدخل الجهاز في وضع السكون.هذا يشبه إغلاق غطاء الكمبيوتر المحمول الخاص بك؛يتوقف كل النشاط على وحدة المعالجة المركزية الرئيسية.
  • لا يحدث هذا إذا كان الجهاز يقوم بتشغيل الصوت في جلسة الصوت الصحيحة.يرى DTS Q&A QA1626 "جلسة الصوت - ضمان استمرار تشغيل الصوت عند قفل الشاشة" للتفاصيل.
  • لاحظ أن خاصية idleTimerDisabled (والتي يمكن تشغيلها لمنع إيقاف تشغيل الشاشة أثناء تشغيل التطبيق) تتعلق بقفل الشاشة بعد عدم نشاط المستخدم.لا يرتبط ذلك بشكل مباشر بنوم النظام (يرتبط بشكل غير مباشر حيث قد ينام النظام بعد وقت قصير من قفله).

نصائح أخرى

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

ونصيحتي الأولى هي لا تعطيل مؤقت الخمول، وهذا هو مجرد الإختراق. إذا كنت تريد أن تبقي جهاز توقيت على قيد الحياة خلال الأحداث UI تشغيل الموقت على الحلقة المدى الحالية باستخدام NSCommonModes:

// create timer and add it to the current run loop using common modes

self.timer = [NSTimer timerWithTimeInterval:.1 target:self selector:@selector(handleTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

ولقد استخدمت معلومات عن هذا المنصب لعينة صغيرة كنت بناء. هذا هو رمز التي استعملتها عندما شرعت في قراءة لمنع الصوت من وقف:

AudioSession.Category = AudioSessionCategory.MediaPlayback;

وعندما يتم تطبيق مع تشغيل لإعادة إلى القيمة الأصلية:

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

والعينة الكاملة هنا:

http://github.com/migueldeicaza/monotouch-samples/ شجرة / سيد / StreamingAudio /

لقد واجهت هذه المشكلة مؤخرًا في أحد التطبيقات التي أعمل عليها والتي تستخدم عدة مؤقتات وتقوم بتشغيل بعض المطالبات الصوتية وإجراء تغييرين بسيطين نسبيًا:

  1. في ال AppDelegate لقد قمت بتنفيذ الطرق التالية ومجرد وجودها يسمح للتطبيق بالاستمرار عند قفل الشاشة

    // this receives the notification when the device is locked
    - (void)applicationWillResignActive:(UIApplication *)application
    { 
    }
    
    // this receives the notification that the application is about to become active again
    - (void)applicationWillBecomeActive:(NSNotification *)aNotification
    {
    }
    

    مراجع: مرجع بروتوكول UIApplicationDelegate & مرجع فئة NSApplication في مستند API (يمكن الوصول إليه عبر Xcode، ما عليك سوى البحث عن applicationWillBecomeActive).

  2. صنع الرئيسي viewcontroller فئة أ AVAudioPlayerDelegate واستخدمت هذا الرمز من نموذج "AddMusic" الخاص بشركة Apple لجعل التنبيهات الصوتية التي يشغلها التطبيق تمتزج بشكل جيد مع صوت iPod وما إلى ذلك...

    لقد قمت للتو بإسقاط هذا الرمز في طريقة يتم استدعاؤها أثناء viewDidLoad.إذا كان هذا يثير اهتمامك، فستقع ضمن فئة "من يجب عليه قراءة هذا المستند" لهذا: دليل برمجة الجلسة الصوتية

    // Registers this class as the delegate of the audio session.
    [[AVAudioSession sharedInstance] setDelegate: self];
    
    // The AmbientSound category allows application audio to mix with Media Player
    // audio. The category also indicates that application audio should stop playing 
    // if the Ring/Siilent switch is set to "silent" or the screen locks.
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
    
    // Activates the audio session.
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];
    

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

وتحقق لمعرفة ما إذا كان يتم deallocated الموقت الخاص بك بسبب وجهة نظركم يجري إخفاء أو بعض الأحداث الأخرى التي تحدث.

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