मेरे पास इस विषय के साथ एक बड़ा सिरदर्द है। मैं एक ऐसे एप्लिकेशन पर काम कर रहा हूं जिसे नए डेटा की जांच करने के लिए नियमित रूप से वेबसर्वर को मतदान करने की आवश्यकता है। लौटाई गई जानकारी के आधार पर, मैं उपयोगकर्ता को स्थानीय अधिसूचना को धक्का देना चाहता हूं।setKeepAliveTimeout और BackgroundTasks
मुझे पता है कि यह दृष्टिकोण ऐप्पल द्वारा चित्रित एक से थोड़ा अलग है, जिसमें एक दूरस्थ सर्वर काम करता है, एपीएनएस के आधार पर रिमोट अधिसूचना को दबाता है। हालांकि, ऐसे कई कारण हैं जिनके लिए मैं इस दृष्टिकोण को ध्यान में नहीं ले सकता। सभी के लिए, उपयोगकर्ता प्रमाणीकरण तंत्र है। सुरक्षा कारणों से दूरस्थ सर्वर, उपयोगकर्ता प्रमाण-पत्रों को ध्यान में रख सकता है। मैं जो कुछ कर सकता हूं वह क्लाइंट (आईफोन) में लॉगिन और कोर लाने के लिए है।
मैंने देखा कि ऐप्पल अनुप्रयोगों के लिए जागने और सॉकेट कनेक्शन खोलने का अवसर प्रदान करता है (यानी एक वीओआईपी आवेदन)।
तो, मैंने इस तरह से जांच शुरू कर दी। plist में आवश्यक जानकारी जोड़ा गया, मैं अपने आवेदन "जाग" करने में सक्षम हूँ, मेरे AppDelegate में कुछ इस तरह का उपयोग कर:
[[UIApplication sharedApplication] setKeepAliveTimeout:1200 handler:^{
NSLog(@"startingKeepAliveTimeout");
[self contentViewLog:@"startingKeepAliveTimeout"];
MyPushOperation *op = [[MyPushOperation alloc] initWithNotificationFlag:0 andDataSource:nil];
[queue addOperation:op];
[op release];
}];
NSOperation, उसके बाद निम्न ब्लॉक कोड का उपयोग कर एक पृष्ठभूमि कार्य शुरू होता है:
#pragma mark SyncRequests
-(void) main {
NSLog(@"startSyncRequest");
[self contentViewLog:@"startSyncRequest"];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"exipiration handler triggered");
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
[self cancel];
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSMutableURLRequest *anURLRequest;
NSURLResponse *outResponse;
NSError *exitError;
NSString *username;
NSString *password;
NSLog(@"FirstLogin");
anURLRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:webserverLogin, username, password]]];
[anURLRequest setHTTPMethod:@"GET"];
[anURLRequest setTimeoutInterval:120.00];
[anURLRequest setCachePolicy:NSURLRequestReloadIgnoringCacheData];
exitError = nil;
NSData *tmpData = [NSURLConnection sendSynchronousRequest:anURLRequest returningResponse:&outResponse error:&exitError];
[anURLRequest setTimeoutInterval:120.00];
if(exitError != nil) { //somethings goes wrong
NSLog(@"somethings goes wrong");
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
[self cancel];
return;
}
//do some stuff with NSData and prompt the user with a UILocalNotification
NSLog(@"AlltasksCompleted");
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
[self cancel];
});
}
}
ऊपर कोड काम करने के लिए (कभी कभी) लगता है, लेकिन कई अन्य इसे अपने आवेदन दुर्घटनाओं, निम्नलिखित लॉग जानकारी के साथ:
Exception Type: 00000020
Exception Codes: 0x8badf00d
Highlighted Thread: 3
Application Specific Information:
DemoBackApp[5977] has active assertions beyond permitted time:
{(
<SBProcessAssertion: 0xa9da0b0> identifier: UIKitBackgroundCompletionTask process: DemoBackApp[5977] permittedBackgroundDuration: 600.000000 reason: finishTask owner pid:5977 preventSuspend preventIdleSleep
)}
Elapsed total CPU time (seconds): 0.010 (user 0.010, system 0.000), 100% CPU
Elapsed application CPU time (seconds): 0.000, 0% CPU
जो पूछना के लिए, हाँ। मैंने Async NSURLConnection दृष्टिकोण भी कोशिश की है। कोई बात नहीं। यह वही दुर्घटनाग्रस्त है, भले ही मैं टाइमआउट हैंडलर के साथ एसिंक दृष्टिकोण का उपयोग करता हूं और कियाफिशिश लोडिंग: WithError।
मैं अटक गया हूँ। किसी भी संकेत की सराहना की जाती है।
आपके उत्तर के लिए बहुत धन्यवाद। सबसे पहले, अस्वीकार कोई मुद्दा नहीं है, क्योंकि ऐप ऐपस्टोर के लिए एक निजी ऐप नहीं है। 30secs के टाइमआउट के बारे में, मैंने इसके बारे में पढ़ा, लेकिन मुझे समझ में नहीं आ रहा है कि क्रैश लॉग मुझे 600.00secs टाइमआउट के बारे में बताता है, न कि 30.00secs। इसके अलावा, कभी-कभी विधियां काम करती हैं, अन्य वे नहीं करते हैं। – valvoline
@valvoline: जिस बार यह काम नहीं करता है, आप पृष्ठभूमि कार्य स्पष्ट रूप से बहुत अधिक समय ले रहे हैं। दस्तावेज़ 30 सेकंड कहते हैं, लेकिन शायद यह नरम संख्या है और ओएस वास्तव में आपको 10 मिनट देता है, मुझे यकीन नहीं है। हम जानते हैं कि, कुछ बिंदु पर कुछ अवरुद्ध हो रहा है और आपकी बात पूरी नहीं हो सकती है, और चूंकि VIOP को त्वरित जांच के लिए डिज़ाइन किया गया था, इसलिए यह संभव है कि ओएस से होने वाली त्रुटि उलझन में है (जैसे कि आपके रद्दीकरण ब्लॉक या कुछ को कॉल न करें) । –
@ जेसन: क्या आपके पास इस वीओआईपी विंडो में क्या आवश्यक है इसके बारे में कोई विशिष्ट जानकारी है? क्या यह कहता है कि कहीं भी सार्वजनिक? –