2013-02-14 7 views
6

आईफोन ऐप चैट का उपयोग कर आईएएम सर्वर के साथ संवाद करने के लिए सॉकेट कनेक्शन का उपयोग करता है। जब ऐप पृष्ठभूमि में ले जाया जाता है तो मैं देख सकता हूं कि सर्वर ऐप के साथ लगभग 5 मिनट तक संवाद करने में सक्षम है। लेकिन इस समय के बाद, सॉकेट कनेक्शन नष्ट हो गया है। लेकिन ऐप पृष्ठभूमि में जितनी जल्दी हो सके निष्पादित करना बंद कर देता है। यह क्यों है कि सॉकेट कनेक्शन 5 मिनट तक बनाए रखा जाता है लेकिन ऐप निष्पादन नहीं होता है। क्या सेब सही समय निर्दिष्ट करता है जिसके लिए कनेक्शन बनाए रखा जाएगा।आईओएस ऐप पृष्ठभूमि में जाने के बाद सॉकेट कनेक्शन मारे गए

+0

का उपयोग करके शेष समय भी प्राप्त कर सकते हैं क्या आपका ऐप वीओआईपी ऐप के रूप में पंजीकृत है? – trojanfoe

+0

नहीं। यह वीओआईपी के रूप में पंजीकृत नहीं है। – Chinta

उत्तर

9

आप applicationDidEnterBackground में निम्न कोड का इस्तेमाल कर रही का उपयोग करके 600 सेकंड (10 मिनट) की एक अधिकतम समय प्राप्त कर सकते हैं:

if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4 
if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking 
    UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance 
    __block UIBackgroundTaskIdentifier background_task; //Create a task object 
    background_task = [application beginBackgroundTaskWithExpirationHandler:^{ 
     [application endBackgroundTask: background_task]; //Tell the system that we are done with the tasks 
     background_task = UIBackgroundTaskInvalid; //Set the task to be invalid 
     //System will be shutting down the app at any point in time now 
    }]; 
    //Background tasks require you to use asyncrous tasks 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     //Perform your tasks that your application requires 
     NSLog(@"\n\nRunning in the background!\n\n"); 
     [application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform 
     background_task = UIBackgroundTaskInvalid; //Invalidate the background_task 
    }); 
    } 
} 

प्रलेखन यहां पाया जा सकता http://disanji.net/iOS_Doc/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

मैं सिर्फ backgroundTaskIdentifier वस्तु लागू किया और समय की जांच करने के लिए background_task को अमान्य करें, ऐप जीवित था और 600sec चला रहा था। आप इस

NSLog(@"Time remaining: %f", application.backgroundTimeRemaining); 
+1

यदि आप आईओएस 4.3 या बाद में लक्षित कर रहे हैं, तो दो शुरुआती 'if' कथनों की आवश्यकता नहीं है। – rmaddy

+0

@rmaddy आप सही हैं :) –

+0

@chinta पृष्ठभूमि के लिए वीओआईपी उपयोग के लिए सॉकेट कॉन्फ़िगर करना यहां पाया जा सकता है। बहुत जानकारीपूर्ण http://wiseman-safiq.blogspot.in/2010/11/ios-executing-code-in-background.html –

1

एप्पल के IOS Programming Guide

अधिकांश आवेदनों कि पृष्ठभूमि राज्य में प्रवेश से कुछ ही समय बाद निलंबित अवस्था में चले जाते हैं। इस स्थिति में, एप्लिकेशन किसी भी कोड को निष्पादित नहीं करता है और किसी भी समय स्मृति से हटाया जा सकता है। उपयोगकर्ता को विशिष्ट सेवाएं प्रदान करने वाले अनुप्रयोग उन सेवाओं को प्रदान करने के लिए पृष्ठभूमि निष्पादन समय का अनुरोध कर सकते हैं।

कम से कम बताता है कि ऐप निष्पादन क्यों बंद कर देता है। आपका सर्वर अभी भी 5 मिनट के लिए आपके ऐप के साथ संवाद करने में सक्षम क्यों हो सकता है, क्योंकि आप एक अतिरिक्त लंबा समय निर्धारित करते हैं और पृष्ठभूमि में प्रवेश करने वाले आपके ऐप पर सॉकेट कनेक्शन को बंद नहीं कर रहे हैं।

संबंधित मुद्दे