2012-04-24 21 views
18

मेरा ऐप प्रतिनिधि विधि applicationDidBecomeActive: एप्लिकेशन के पहले लॉन्च के लिए दो बार कॉल किया जा रहा है। मेरे पास कोड का कुछ हिस्सा है जिसे मैं केवल & निष्पादित करना चाहता हूं जिसे मैंने applicationDidBecomeActive:applicationDidBecomeActive को दो बार बुलाया जा रहा है

मुझे क्या करना चाहिए?

+2

क्या स्टैक ट्रेस जब आप applicationDidBecomeActive पर एक ब्रेकपाइंट सेट कैसा दिखता है :? क्या यह दोनों कॉल के लिए बिल्कुल वही है? यदि नहीं (और यह नहीं होना चाहिए), तो इससे आपको अपनी समस्या का सामना करना पड़ेगा। –

उत्तर

35

मुझे समस्या मिली। मैं स्थान सेवाओं का उपयोग कर रहा हूँ। जब मैं स्थान सेवा चेतावनी पर "ठीक" पर टैप करने के बाद पहली बार लॉन्च करता हूं, तो मेरे एप्लिकेशनडिडबैकएक्टिव को एक और समय कहा जाता है जो सामान्य आईओएस व्यवहार है।

+0

मेरे ऐप को सक्रिय होने पर हर बार प्रमाणीकरण की आवश्यकता होती है। इस स्थान की चेतावनी के साथ, अलर्ट पॉप अप होने के बाद उपयोगकर्ता को कुंजी-इन पासवर्ड की आवश्यकता होती है। मुझे उस स्थिति से होने से बचने की जरूरत है। –

+0

@LocPham: मेरा सुझाव ऐप प्रतिनिधि कार्यान्वयन फ़ाइल में एक इंस्टेंस वैरिएबल रखना होगा और जब भी एप्लीकेशनडिडबैकएक्टिव कहा जाता है तो वृद्धि होती है। जब इस चर के मान हैं तो अपना लॉगिन अलर्ट कोड निष्पादित न करें> 1. इसे रीसेट करना न भूलें। साथ ही, यह सुझाव पूरी तरह से आपकी कोड को देखे बिना आपकी आवश्यकता पर आधारित है। एक बेहतर तरीका भी हो सकता है। – Abhinav

0

क्या आपने संभवतः इंटरफ़ेस बिल्डर में और अपने ऐपडिलेगेट कोड में अपनी कक्षा का एक उदाहरण बनाया है?

+0

अच्छी जांच एनएसएलओजी (@ "% x", (int) स्वयं); उस प्रतिनिधि में, सुनिश्चित करें कि यह वही उदाहरण है ... –

+0

भले ही यह मामला हो, फिर भी एप्लिकेशन ऑब्जेक्ट में केवल एक प्रतिनिधि हो सकता है और केवल एक बार संदेश भेज देगा। –

+0

@ ग्रेडी: पॉइंटर्स के लिए एक प्रारूप विनिर्देशक है: 'एनएसएलओजी (@"% पी ", स्वयं);' –

0

आप कोड आप केवल एक बार कहा जाता है चाहता हूँ जब अनुप्रयोग प्रारंभ हो जाता है, तो

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

का उपयोग करने के बजाय।

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

+0

अनुप्रयोगों के बीच स्विचिंग ठीक है। मैं उस समय भी कोड निष्पादित करना चाहता हूं। लेकिन पहले लॉन्च पर, इसे दो बार बुलाया जा रहा है। – Abhinav

1

मुझे नहीं पता कि इससे मदद मिलेगी, लेकिन मुझे बस एक ही सरल ऐप के साथ एक ही समस्या थी जो स्थान सेवाओं का उपयोग नहीं करती है, और मुझे पता चला कि यह एक भ्रम है। लॉगिंग संदेशों को देखें:

2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 
2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 

बारीकी से देखें। बार पर देखें। पहले और तीसरे संदेशों में एक ही समय है। दूसरे और चौथे संदेशों में एक ही समय है। वे एक ही संदेश हैं! यह एक एक्सकोड बग है; मेरे कोड के साथ इसका कोई लेना-देना नहीं है। एक्सकोड एक ही लॉग संदेश दो बार रिपोर्ट कर रहा है।

मेरे मामले में, मैं रनिंग -> जेनरेट आउटपुट के लिए सभी व्यवहार बंद करके इसे रोकने में सक्षम था।

9

यह स्थान या पुश अधिसूचना चेतावनी के कारण है।

मूल स्थान/पुश अधिसूचना को खारिज कर दिए जाने के बाद, एप्लिकेशनडिडबैकएक्टिव को बुलाया जाएगा।

+2

हम "सत्य" एप्लिकेशन के बीच सही तरीके से अंतर कैसे करते हैं DidBecomeActive: जब हमारे ऐप वास्तव में पृष्ठभूमि अलर्ट के कारण पृष्ठभूमि में घुसपैठ कर दिया गया है तो स्थान अलर्ट के कारण पृष्ठभूमि में चला गया? –

+0

मेरे ऐप को सक्रिय होने पर हर बार प्रमाणीकरण की आवश्यकता होती है। इस स्थान की चेतावनी के साथ, अलर्ट पॉप अप होने के बाद उपयोगकर्ता को कुंजी-इन पासवर्ड की आवश्यकता होती है। मुझे उस स्थिति से होने से बचने की जरूरत है। –

2

एक्सकोड 6 के साथ ऐसा एक नया कारण हो सकता है: जब आप एक आकार बदलने योग्य सिम्युलेटर में ऐप लॉन्च करते हैं, तो एप्लीकेशनडिडबैक्टएक्टिव: दो बार कॉल किया जाएगा। यह ऐप को डिफ़ॉल्ट आकार वर्ग के साथ लॉन्च करता है, और तब उस आकार को लागू करता है जिसका आप पिछली बार उपयोग कर रहे थे-भले ही आप डिफ़ॉल्ट का उपयोग कर रहे हों। किसी भी समय आकार वर्ग में परिवर्तन लागू किया जाता है, applicationDidBecomeActive: कॉल हो जाता है।

7

यदि आप ऐप सक्रिय होने पर केवल एक बार अपना कोड कॉल करना चाहते हैं, तो इसे दो तरीकों से कॉल करने का प्रयास करें। 1. didFinishLaunchingWithOptions 2. एप्लिकेशनWillEnterForeground

केवल इसे एप्लिकेशनडिडकमएक्टिव से कॉल करने के बजाय।

+1

यह स्वीकार्य उत्तर होना चाहिए। – Darko

0

के बारे में क्या: अनुमति अनुरोधों या अन्य अलर्ट है कि एक और applicationDidBecomeActive को गति प्रदान जब बंद कर दिया की कॉलबैक घटनाओं पर applicationDidBecomeActive

  • घटते क्रम पर

    • वृद्धि।
  • 0

    एप्लिकेशन पहले समय यह क्रमिक रूप से कॉल की शुरूआत,

    1. didFinishLaunchingWithOptions
    2. applicationDidBecomeActive (दो बार)

    जब हम Control Center यह केवल कॉल खोलते हैं, तो

    applicationDidBecomeActive 
    

    एप्लिकेशन यह अग्रभूमि पृष्ठभूमि से आते हैं क्रमिक रूप से कहता है

    1. applicationWillEnterForeground
    2. applicationDidBecomeActive
    संबंधित मुद्दे