2012-11-15 12 views
12

मैं चाहता हूं कि ऐप एक अधिसूचना पर क्लिक करके लॉन्च होने पर विशिष्ट चीजें करे। मैं इन विशिष्ट चीजों को करना चाहता हूं जब ऐप पृष्ठभूमि में पहले से चल रहा है लेकिन जब भी ऐप अधिसूचना पर क्लिक करके स्क्रैच (पृष्ठभूमि में नहीं चल रहा है) से शुरू होता है।एक्सकोड: क्यों लॉन्चऑप्शन में किया गया FinishLaunchingWithOptions हमेशा शून्य?

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 

=> कोई समस्या नहीं:

जब एप्लिकेशन अधिसूचना पर एक क्लिक से पृष्ठभूमि से शुरू कर दिया है, मैं के माध्यम से सूचना मिलती है!

जब एप्लिकेशन अधिसूचना पर एक क्लिक करके शुरू से शुरू कर दिया है, मैं के माध्यम से अधिसूचना प्राप्त करना चाहते हैं:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 

} 

लेकिन launchOptions हमेशा नहीं के बराबर है !! यह ऐप है जब ऐप ऐप आइकन (सामान्य) पर क्लिक के माध्यम से स्क्रैच से शुरू किया जाता है, लेकिन जब ऐप अधिसूचना (सामान्य नहीं) पर क्लिक के माध्यम से स्क्रैच से शुरू होता है।

कोई भी इस मुद्दे को हल करने के बारे में जानता है?

धन्यवाद !!!

संपादित करें 1

यहाँ कैसे मेरी सूचनाएं बनाई गई हैं है (जो प्रश्न): (! मेरे सवाल का जवाब :))

NSDictionary *userInfo = [NSDictionary dictionaryWithObjects: 
[NSArray arrayWithObjects:notifText,latitudeString,longitudeString,nil] 
forKeys:[NSArray arrayWithObjects:@"notifText",@"latitude",@"longitude", nil]]; 

    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
    localNotif.fireDate = itemDate; 
    localNotif.timeZone = [NSTimeZone defaultTimeZone]; 
    localNotif.alertBody =msg; 
    localNotif.alertAction = @"Ok"; 
    localNotif.soundName = UILocalNotificationDefaultSoundName; 
    localNotif.applicationIconBadgeNumber = 1; 
    localNotif.userInfo = userInfo; 

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 
    [localNotif release]; 

संपादित 2

यहाँ प्रक्रिया है मैं अपने ऐप को डीबग करता था लेकिन ... यह प्रक्रिया गलत है !!

  1. मैं "संपादन योजना" मेनू मैं XCode के साथ अपने अनुप्रयोग एक पहली बार शुरू की
  2. में विकल्प "MyApp.app लांच करने के लिए प्रतीक्षा करें" (खरोंच से लांच) XCode प्रदर्शित करता है के साथ अपने डिबगर की स्थापना "मेरे MyApp लांच करने के लिए प्रतीक्षा कर रहा है" => मैं पर मेरी ऐप्लिकेशन आइकन एप्लिकेशन लॉन्च करने के लिए क्लिक
  3. एप्लिकेशन शुरू की है => मैं घर बटन => अधिसूचना
  4. मैं स्टॉप बटन पर क्लिक किया प्रदर्शित किया जाता है पर क्लिक किया एक्सकोड में ऐप को बंद करने के लिए मैंने इसे एक्सकोड => एक्सकोड के साथ फिर से लॉन्च किया है "संदेश को लॉन्च करने के लिए मेरे MyApp के लिए प्रतीक्षा कर रहा है" संदेश => मैंने पर अधिसूचना जारी की ऐप लॉन्च करने के लिए स्टेटस बार
  5. => लॉन्चऑप्शन शून्य है!

launchOptions शून्य के बराबर तथ्य यह है कि XCode के साथ एप्लिकेशन (विकल्प "शुरू करने के लिए मेरी MyApp के लिए प्रतीक्षारत" के साथ इस मामले में) को दोबारा लॉन्च सूचनाएं हटा देता है, भले ही यह अभी भी स्थिति पट्टी में प्रदर्शित किया जाता है की वजह से है ...

डीबग करने में सक्षम होने के लिए कॉन्फ़िगरेशन पर क्लिक करके ऐप के पुन: लॉन्च होने के बाद लॉन्चऑप्शन की सामग्री क्या है, ऐसा लगता है कि इस सामग्री को यूआईएलर्ट में उल्लिखित करने का एकमात्र तरीका है टैमो फ्रीज़ द्वारा जवाब में। तो, यह विशिष्ट मामले में डिबग करने के लिए निम्नलिखित का उपयोग करें:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alertView show]; 
    return YES; 
} 

सब तुम्हारी मदद के लिए धन्यवाद !!!!

+0

क्या आप अपनी अधिसूचना जोड़ सकते हैं अपने प्रश्न पर पेलोड? – Joe

+0

आपके उत्तर जो के लिए धन्यवाद। मैंने जोड़ा कि मेरे प्रश्न में मेरी सूचनाएं कैसे बनाई गई हैं।उम्मीद है कि इससे आपको मेरी मदद करने में मदद मिलेगी :) –

+0

हाय @Regis_AG, "ऐप लॉन्च करने के लिए प्रतीक्षा करें" का उपयोग करते समय भी मुझे स्थानीय सूचनाएं मिल सकती हैं - नीचे दिए गए मेरे उत्तर का संपादन देखें। –

उत्तर

19

मैं कोड में कोई त्रुटि नहीं पा सके आप साझा की है। आम तौर पर यह सिम्युलेटर, और डिवाइस पर दोनों काम करना चाहिए। यहां एक उदाहरण दिया गया है जो मेरे लिए काम करता है: पहले एक नया सिंगल व्यू आईफोन ऐप (एआरसी और स्टोरीबोर्ड ऑन) उत्पन्न करें। इस प्रकार तो AppDelegate में दो तरीकों को बदलने:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alertView show]; 
    return YES; 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
    localNotif.fireDate = [NSDate dateWithTimeInterval:10.0 sinceDate:[NSDate date]]; 
    localNotif.timeZone = [NSTimeZone defaultTimeZone]; 
    localNotif.alertBody = @"Just some text"; 
    localNotif.alertAction = @"OK"; 
    localNotif.soundName = UILocalNotificationDefaultSoundName; 
    localNotif.applicationIconBadgeNumber = 1; 
    localNotif.userInfo = @{@"test": @YES}; 

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 
} 

फिर इस एप्लिकेशन को शुरू करते हैं,, घर बटन दबाएँ और फिर ऐप बंद करो। आप जो घर बटन दबाने के बाद 10 सेकंड में आता है स्थानीय नोटिफिकेशन पर टैप करें, तो आप कुछ इस तरह है, जो दिखाता स्थानीय अधिसूचना -application:didFinishLaunchingWithOptions: को पारित किया गया है देखना चाहिए:

screenshot of the iPhone Simulator showing an alert view that displays a local notification

मेरी सलाह है: सबसे पहले यह सुनिश्चित करने के लिए कि मैंने आपके सेटअप के साथ कुछ भी नहीं किया है, यह सुनिश्चित करने के लिए ऊपर पोस्ट किया गया उदाहरण प्राप्त करें, फिर जांचें कि आप अपने कोड में अलग-अलग क्या कर रहे हैं।

संपादित

इस सवाल के 2 संपादित करने के लिए लागू होता है: स्थानीय सूचनाएं भी जब के लिए एप्लिकेशन (, सिम्युलेटर में डिवाइस पर नहीं) शुरू करने के लिए इंतजार कर मेरे लिए काम करने लगते हैं। इसे आज़माएं:

  1. ऊपर वर्णित नमूना ऐप इंस्टॉल करें और इसे "लॉन्च करने के लिए MyApp.app के लिए प्रतीक्षा करें" अक्षम करें।
  2. होम बटन पर क्लिक करें, फिर ऐप को एक्सकोड या टास्क बार के माध्यम से रोकें।
  3. "लॉन्च करने के लिए MyApp.app के लिए प्रतीक्षा करें" सक्षम करें।
  4. यदि अब आप अधिसूचना केंद्र में अधिसूचना टैप करते हैं, तो यह अलर्ट व्यू में दिखाया गया है।
+0

आपके उत्तर Tammo के लिए धन्यवाद! स्टार्टअप पर अधिसूचना की सामग्री देखने के लिए यूआईएलर्ट को प्रदर्शित करने के आपके विचार के लिए धन्यवाद, मैंने पाया कि मैंने गलत क्यों किया! :) समस्या यह है कि मैंने "योजना संपादित करें" मेनू में "लॉन्च करने के लिए प्रतीक्षा करें" के साथ अपना डीबगर स्थापित किया है। मैंने ऐसा किया कि अधिसूचना पर क्लिक के बाद इसे स्क्रैच से लॉन्च करते समय मेरे ऐप को डीबग करने में सक्षम होने के लिए ... लेकिन यह प्रक्रिया स्टार्टअप पर सभी अधिसूचनाओं को हटा देती है! मैं अपने प्रश्न को और स्पष्ट रूप से समझाने के लिए संपादित करने जा रहा हूं। आपकी सहायता के लिए धन्यवाद!! –

0

कृपया मुझे माफ़ कर दो, जब भी ऐप्पल की पुश अधिसूचना सेवा की बात आती है, तब भी मैं नया हूं, लेकिन मैंने अपने दस्तावेज के माध्यम से कुछ पढ़ा और मेरा अनुमान यह है कि आपकी स्थानीय अधिसूचना के निर्माण में कुछ ऐसा हो सकता है जो समस्या पैदा कर रहा है ।

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

+0

आपके उत्तर के लिए धन्यवाद। यह अधिसूचना तत्काल का सवाल नहीं था, लेकिन समस्या डीबग के तरीके के कारण थी। मेरा जवाब देखें फिर भी आपकी सहायता के लिए धन्यवाद। –

+0

आपका स्वागत है। सुनकर खुशी हुई कि आप इस मुद्दे को हल करने में सक्षम थे। चीयर्स। –

1

यह नहीं पता कि यह आपकी क्या तलाश है, लेकिन क्या आप 'वापसी YES;' खो रहे हैं? क्योंकि मैं इस का उपयोग किसी सूचना से कोई नया दृश्य के लिए एक segue प्रदर्शन करने के लिए है और यह ठीक काम करता है

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UINavigationController *navigation = (UINavigationController *) self.window.rootViewController; 

    [navigation.visibleViewController performSegueWithIdentifier:@"Ident" sender:nil]; 

    return YES; 
} 
+0

आपके उत्तर के लिए धन्यवाद। असल में, हाँ मेरे कोड में था (मुझे बस इसे अपने प्रश्न में कॉपी करने के लिए मिला है)। जिस तरह से मैंने डीबग किया था, वैसे ही समस्या आई थी। मेरा जवाब देखें फिर भी आपकी सहायता के लिए धन्यवाद। –

1

मेरा निष्कर्ष और सुझाव अगर यह, किसी को भी hep कर सकते हैं नीचे

उल्लेख हर बार जब आप अपने ऐप का परीक्षण करने के लिए नए निर्माण है, तो आप नवीनतम एप्लिकेशन द्वारा जनरेट सूचनाओं के साथ अधिसूचना क्लिक कार्रवाई का परीक्षण करना चाहिए। यदि आप पुरानी बिल्ड द्वारा उत्पन्न पुरानी अधिसूचनाओं के साथ क्लिक क्रियाओं का परीक्षण करते रहेंगे तो यह अप्रत्याशित रूप से व्यवहार करेगा (इसका मतलब है कि किसी भी तरह से ऐप लॉन्च करने में सक्षम है लेकिन यह आपको किसी भी वैध जानकारी को वापस नहीं करेगा फिनिशलांचिंगविथऑप्शन :)

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