2012-04-12 22 views
37

से निपटने मैंपुश अधिसूचना

Handling Local and Remote Notifications

पर एप्पल डॉक्स पढ़ रहा हूँ और यह परस्पर विरोधी बयानों के लिए मेरे लिए लग रहा है। क्या कोई इन भ्रम बिंदुओं को साफ़ कर सकता है? चलो अब रिमोट अधिसूचना (बनाम स्थानीय) के बारे में सख्ती से बात करते हैं।

दस्तावेज़ कहते हैं कि अगर अधिसूचना पर कार्रवाई बटन दबाया जाता है, तो यह एप्लिकेशन को कॉल करता है: didFinishLaunchingWithOptions और अधिसूचना पेलोड में गुजरता है। बाद में यह कहता है कि यदि ऐप अग्रभूमि में चल रहा है, तो यह एप्लिकेशन के माध्यम से अधिसूचना प्रदान करता है: didReceiveRemoteNotification:। यह मेरा तात्पर्य है कि जब ऐप पृष्ठभूमि या नहीं चल रहा है, तो आवेदन: didFinishLaunchingWithOptions कहा जाता है। अन्यथा, आवेदन: didReceiveRemoteNotification: कहा जाता है।

बाद में, वहाँ एक iOS नोट कह निम्नलिखित:

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

यह मेरा तात्पर्य है कि आवेदन: didReceiveRemoteNotification: ऐप पहले से ही अग्रभूमि होने पर दोनों को बुलाया जाता है और यदि उपयोगकर्ता एक्शन बटन दबाता है (या आईओएस 5 में एक्शन स्लाइडर स्लाइड करता है) ऐप को अग्रभूमि/लॉन्च करने के लिए।

मेरे भ्रम का स्रोत पहले भाग के साथ हो सकता है जहां दस्तावेज़ों को अधिसूचना पेलोड को एप्लिकेशन के साथ भेजा जाता है: didFinishLaunchingWithOptions: विधि या "चल रहा" एप्लिकेशन क्या है इसकी गलतफहमी के साथ (एक पृष्ठभूमि वाला ऐप माना जाता है " चल रहा है "?)। आवेदन के लिए प्रलेखन: didReceiveRemoteNotification: कहता है कि इसे "चलने" अनुप्रयोगों के लिए बुलाया जाता है।

तो, संक्षेप में प्रस्तुत करने, मैं पर स्पष्टीकरण मिल सकता है:

1) है आवेदन: didReceiveRemoteNotification: हमेशा कहा जाता है जब एप्लिकेशन foregrounded या है उपयोगकर्ता अधिसूचना पर "क्रिया" के लिए चुनता है जब? यदि नहीं, तो आवेदन राज्य को सक्रिय या निष्क्रिय होने का निर्धारण करने पर हम आईओएस नोट का अर्थ कैसे बना सकते हैं?

2) कम से कम एक दस्तावेज ऐप "चल रहा है", कम से कम दस्तावेजों का दावा करने वाले दस्तावेज़ों के अर्थ में: didReceiveRemoteNotification को चलाने वाले ऐप्स के लिए बुलाया जाता है?

3) पूरा होने के लिए, एक पृष्ठभूमि वाला ऐप UIApplicationStateInactive या Active है?

+19

क्या मुझे एक चेकमार्क मिल सकता है? – ch3rryc0ke

उत्तर

91

यहां शब्द शब्द भ्रमित है, खासकर पृष्ठभूमि की पृष्ठभूमि के आसपास।

जब आवेदन सही मायने में स्मृति (उदा जब आप इसे लांच स्प्लैश स्क्रीन अप आदि को दर्शाता है।) में लोड नहीं है, तो आवेदन: didFinishLaunchingWithOptions कहा जाता है, और आप पुश अधिसूचना इस प्रकार प्राप्त कर सकते हैं:

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 

if(remoteNotif) 
{ 
    //Handle remote notification 
} 

यदि ऐप मेमोरी में लोड हो गया है और सक्रिय है (उदाहरण के लिए ऐप डिवाइस पर वर्तमान में खुला है) तो केवल application:didReceiveRemoteNotification: कहा जाता है।

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

आप इस प्रकार इस मामले पर कब्जा कर सकते हैं:

-(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    if([app applicationState] == UIApplicationStateInactive) 
    { 
     //If the application state was inactive, this means the user pressed an action button 
     // from a notification. 

    //Handle notification 
    } 
} 
+2

क्या आपने पहले मामले में 'didReceiveRemoteNotification' कहा है? क्या आपके कोड को आपके द्वारा लिखे गए दोनों तरीकों में लागू करने के लिए पर्याप्त है? कोड दो बार नहीं चलाएगा? धन्यवाद। –

+1

यह गलत है: उदाहरण के लिए यदि आपके पास अधिसूचना केंद्र दृश्यमान या नियंत्रण केंद्र है, तो ऐप को निष्क्रिय माना जाता है। क्या आपके पास "पृष्ठभूमि से सक्रिय होने" को निर्धारित करने के बारे में कोई सुझाव है? – dvkch

+0

यह भी ध्यान दें कि वही व्यवहार किया गया है RreceiveRemoteNotification: (NSDictionary *) userInfo fetchCompletionHandler: (शून्य (^) (UIBackgroundFetchResult परिणाम)) पूरा करने के लिए हैंडलर NS_AVAILABLE_IOS (7_0); – valvoline

2

प्रति आईओएस 9.1 परिदृश्य के रूप में मैं मार डालो मोड जहां अपने आवेदन उस समय किसी भी मोड में नहीं चल रहा है में पुश अधिसूचना का परीक्षण किया है अगर मैं धक्का नोटिफिकेशन पर टैप करें प्रणाली पहले फोन करेगा,

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ 

//your code execution will here. 

} 

और दूसरा विधि कॉल हो जाएगा की तुलना में,

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

//Your initial code execution. 

} 

इस परिदृश्य में मैंने अपने आवेदन में परीक्षण किया है।

+0

आपने इस परिदृश्य का परीक्षण कैसे किया, कृपया समझाएं? – Nico

+0

निको, मैंने लॉग इन दस्तावेज़ निर्देशिका फ़ाइल को जांचने के लिए प्रिंट किया है, पुश अधिसूचना के हत्या मोड में कौन सी विधि को बुलाया जाएगा। –

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