2011-10-03 25 views
7

के कारण ऐप को फोकस मिला है, तो मैं एक ऐप बना रहा हूं जो कुछ अनुस्मारक का ट्रैक रखता है जो उपयोगकर्ता परिभाषित अंतराल के साथ दोहराता है।पता लगाएं कि क्या UILocalNotification

जब मैंने चेतावनी प्रदर्शित की है तो मैंने इसे बनाया है, कार्रवाई शीर्षक "नवीनीकरण" कहता है। जब आप इसे क्लिक करते हैं, तो ऐप खुलता है, और यहां मैं अगली अनुस्मारक बनाना चाहता हूं, लेकिन समस्या यह है कि मुझे नहीं पता कि ऐप खुलता है क्योंकि अधिसूचना बटन टैप किया गया था या यदि ऐप चल रहा था तो अधिसूचना निकाल दी गई थी।

किसी को भी कोई विचार है?

उत्तर

13

'सही' जिस तरह से यह आपके NSApplication के applicationState जांच करने के लिए है करने के लिए launchOptions इस कुंजी को देख जांच करने के लिए एवेन्यू आवेदन में संपत्ति: didReceiveRemoteNotification: आपके प्रतिनिधि की विधि।

स्थानीय अधिसूचना से निपटने के लिए documentation से

:

आईओएस नोट: आईओएस में, आप तय कर सकते हैं एप्लिकेशन को उपयोगकर्ता कार्रवाई बटन या अधिसूचना दिया गया था दोहन की वजह से का शुभारंभ किया गया है या नहीं आवेदन स्थिति की जांच द्वारा पहले से चल रहे एप्लिकेशन के लिए। के प्रतिनिधि के कार्यान्वयन में आवेदन: didReceiveRemoteNotification: या एप्लिकेशन: didReceiveLocalNotification: विधि, एप्लिकेशनस्टेट गुण का मूल्य प्राप्त करें और इसका मूल्यांकन करें। यदि मान UIApplicationStateInactive है, तो उपयोगकर्ता ने एक्शन बटन टैप किया है; यदि मान UIAplplicationStateActive है, तो अनुप्रयोग सबसे महत्वपूर्ण था जब को अधिसूचना मिली।

यह एप्लिकेशन में सेट किए गए झंडे का उपयोग करके आपके समाधान के समान है। एप्लिकेशन एंटरप्राइज और एप्लिकेशनडिडबैक्टएक्टिव लेकिन सिस्टम समर्थन के साथ।

0

आप के लिए

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

या

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

Documentation

+0

हम्म, आपको नहीं पता कि आपका क्या मतलब है। यह पहली बार जब मैं ऐप खोलता हूं तो आग लगती है। यदि ऐप अभी भी पृष्ठभूमि में है, तो ऐसा कभी नहीं होगा। – oskob

+0

आह, अच्छा बिंदु ... मैंने सवाल को गलत तरीके से पढ़ा। मैं – filipe

0

UIApplication लांच विकल्प चाबी के लिए documentation को फिर से देखें देख रहे हैं। आपके आवेदन के लिए अंतिम पैरामीटर: didFinishLaunchingWithOptions: प्रतिनिधि विधि में आपकी आवश्यक जानकारी होती है।

इसके अलावा, application:didReceiveLocalNotification पर देखें।

+0

संपादित करूंगा यदि ऐप पृष्ठभूमि में है, तो यह संभव नहीं होगा। – oskob

+0

इसके अलावा, didReceiveLocalNotification यह नहीं बताता कि ऐप पहले से ही खुला था या अगर यह अधिसूचना – oskob

0

आपके आवेदन पहले से ही आप अनुप्रयोग प्रतिनिधि

application:didReceiveLocalNotification: 

पर इस प्रतिनिधि संदेश मिलेगा चल रहा है अगर यह नहीं चल रहा था आप का उपयोग करने के

application:didFinishLaunchingWithOptions: 

आप की जरूरत है दोनों तरीकों में उचित प्रतिक्रिया सभी मामलों

UPDATED कवर करने के लिए

यह पता लगाने के लिए कि क्या उपयोगकर्ता ने एक्शन बटन को सक्रिय किया है, थोड़ी अधिक जटिलता की आवश्यकता है। हम बता सकते हैं कि application:didFinishLaunchingWithOptions: में लॉन्च विकल्प के रूप में स्थानीय अधिसूचना होगी, लेकिन application:didReceiveLocalNotification: के साथ यह अधिक कठिन है।

चूंकि उपयोगकर्ता बटन को टैप करने के बाद एप्लिकेशन सक्रिय हो जाता है, इसलिए हमें उस संदेश को तब तक स्थगित करना होगा जब तक हम उस संदेश को नहीं देखते (या नहीं)। application:didReceiveLocalNotification में NSTimer सेट करें और इसे didBecomeActive में रद्द करें। इसका मतलब है कि उपयोगकर्ता ने एक्शन बटन दबाया। यदि टाइमर रद्द नहीं किया जाता है तो उपयोगकर्ता इसे निकालते समय ऐप के अंदर था।

+0

अधिसूचना द्वारा खोला गया था, और मैं यह नहीं बता सकता कि अधिसूचना के एक्शन बटन की वजह से ऐप खोला गया था या घटना को निकाल दिया गया था ऐप – oskob

+0

चला रहा था यह भी काम करेगा लेकिन मुझे लगता है कि मेरा समाधान क्लीनर है :) धन्यवाद हालांकि – oskob

+0

सहमत है, इस तरह के टाइमर का उपयोग करके हैकी लगता है :) –

13

अगर मेरे सवाल का स्पष्ट नहीं था, लेकिन ऐसा लगता है कि मैं 4 अलग जवाब है कि सभी मेरे सवाल का गलत मतलब निकाला मिला मैं नहीं जानता: पी

हालांकि, मुझे पता चला कि didReceiveLocalNotivication willEnterForeground और didBecomeActive के बीच होता है, तो मैंने किया था इस निर्धारित करने के लिए एप्लिकेशन पहले से ही खुला है या नहीं था:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    NSLog(@"Opened from notification? %@", wasInactive ? @"yes!" : @"no!"); 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    wasInactive = YES; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    wasInactive = NO; 

} 
+5

इससे सरल, 'एप्लिकेशनWillEnterForeground:' और 'applicationDidBecomeActive:' में सामान को स्क्रैप करें। पूरी तरह से और केवल 'application.applicationState' को 'एप्लिकेशन में जांचें: didReceiveLocalNotification:' इसके बजाए। यदि एप्लिकेशन स्थिति 'UIAplplicationStateActive' है, तो ऐप चल रहा था, आपको अधिसूचना मिली। यदि यह 'UIAplplicationStateInactive' या 'UIAplplicationStateBackground' है, तो ऐप फिर से शुरू होने पर आपको यह प्राप्त हुआ। वैसे, मुझे संदेह है कि पृष्ठभूमि कार्य के दौरान ऐप को अग्रभूमि में वापस लाने के दौरान आपका वर्तमान संस्करण विफल हो जाएगा, हालांकि मुझे इसका परीक्षण करने की आवश्यकता है। –

+0

मार्क के साथ सहमत हैं! यह AppDelegate.m में चमत्कार किया धन्यवाद! –

0

इस विधि में अपने ऐप्लिकेशन के प्रतिनिधि में:

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

आप ज

UIApplicationLaunchOptionsLocalNotificationKey

इस बुलाया जाएगा जब आप पहले से ही सक्रिय हैं:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
संबंधित मुद्दे