2010-08-31 3 views
11

मैं लागू कर दिया है UIApplicationDelegate केयूआरएल के साथ लॉन्च करते समय अनुप्रयोग (UIApplicationDelegate के handleOpenURL के माध्यम से) आईओएस 4 के तहत काम कर, लेकिन नहीं आईओएस के तहत 3.2

application:didFinishLaunchingWithOptions: 

और

application:handleOpenURL: 

विनिर्देश, यानी के अनुसार,

application:didFinishLaunchingWithOptions: 
returns YES 

और

application:handleOpenURL: opens the URL. 

कोड आईओएस 4 के तहत काम करता है (दोनों मामलों में, यानी, जब ऐप लॉन्च होता है और जब यह निलंबित राज्य से सक्रिय हो जाता है)। हालांकि, कोड आईओएस 3.2 के तहत काम नहीं करता है।

+0

3.2 में समस्या क्या है? त्रुटि संदेश? कोड की रेखाएं तोड़ती हैं? –

+0

ऐसा प्रतीत होता है कि प्रतिनिधि को संदेश हैंडल ओपनURL प्राप्त नहीं होता है, अगर उसने संदेश का जवाब दिया है तो फिनिशलांचिंगविथऑप्शन, भले ही वह विधि YES वापस आती है। एपीआई दस्तावेज ने मुझे एक अलग व्यवहार का सुझाव दिया। –

उत्तर

33

मैं अपने खुद के प्रश्न का उत्तर देता हूं। समाधान ढूंढने में मुझे थोड़ी देर लग गई और काफी निराशाजनक थी। यदि आप इंटरनेट खोज करते हैं तो आपको कुछ आंशिक उत्तर मिलते हैं, लेकिन मुझे अभी भी निम्नलिखित समाधान करने के लिए कुछ समय लगा और मुझे उम्मीद है कि इसमें कुछ स्पष्टता शामिल होगी।

तो सबसे पहले, आपके ऐप्स की सिफारिश व्यवहार निम्नलिखित (आईओएस रेफरी लिब में Opening Supported File Types देखें) प्रतीत होता है:

  • applicationDidFinishLaunching: को लागू न करें (UIApplicationDelegate पर टिप्पणी देखें)।
  • application:didFinishLaunchingWithOptions: लागू करें और यूआरएल की जांच करें, यदि आप इसे खोल सकते हैं तो हाँ वापस करें, अन्यथा नहीं, लेकिन इसे खोलें नहीं।
  • application:handleOpenURL: लागू करें और यूआरएल खोलें, सफल होने पर हाँ वापस करें, अन्यथा नहीं।

आईओएस 4 में, निम्न दो व्यवहार में से एक में एक एप्लिकेशन परिणाम के लिए एक यूआरएल गुजर:

  • एप्लिकेशन शुरू की है तो application:didFinishLaunchingWithOptions: कहा जाता है और अगर और application:didFinishLaunchingWithOptions: हाँ लौटे application:handleOpenURL: कहा जाता है।
  • यदि ऐप निलंबित राज्य से सक्रिय हो रहा है तो application:didFinishLaunchingWithOptions: नहीं कहा जाता है लेकिन application:handleOpenURL: कहा जाता है।

हालांकि, आईओएस 3.2 में ऐसा लगता है जैसे application:handleOpenURL: कभी नहीं कहा जाता है! एक संकेत है कि आईओएस 3.2 के तहत व्यवहार अलग है Handling URL Requests में पाया जा सकता है। वहां आपको लगता है कि application:handleOpenURL: कहा जाता है यदि application:didFinishLaunchingWithOptions: लागू नहीं किया गया है, लेकिन applicationDidFinishLaunching: लागू किया गया है। लेकिन application:handleOpenURL: को नहीं कहा जाता है यदि application:didFinishLaunchingWithOptions: लागू किया गया है।

इसलिए, एक समाधान 3.2 के तहत कोड काम करने के लिए और 4.0 है:

  • ओपन application:didFinishLaunchingWithOptions: में URL है, लेकिन फिर लौट नहीं कि application:handleOpenURL: कहा जाता है को रोकने के लिए।
  • application:handleOpenURL: में यूआरएल खोलें, यदि आप 4.0 वर्ष से कम हैं और ऐप निलंबित राज्य में है।

मैं एक और पोस्ट में इस समाधान नहीं मिला है, लेकिन मैं, उलझन में थी, क्योंकि यह आईओएस रेफरी लिब दस्तावेज में सिफारिश (अर्थात् हम application:didFinishLaunchingWithOptions: में हाँ लौटना चाहिए कि) का खण्डन किया। (उस समय मुझे एहसास नहीं हुआ कि प्रलेखन स्वयं को विरोधाभास करता है)।

मुझे विश्वास है कि वर्तमान iOS 4.0 व्यवहार भविष्य के व्यवहार मैं निम्नलिखित समाधान पसंद हो जाएगा:

  • applicationDidFinishLaunching: को लागू न करें।
  • application:didFinishLaunchingWithOptions: लागू करें और यूआरएल की जांच करें, यदि आप इसे खोल सकते हैं तो हाँ वापस करें, अन्यथा नहीं, लेकिन इसे खोलें नहीं। अगर हम 3.2 पर हैं, तो यूआरएल खोलें।
  • application:handleOpenURL: लागू करें और यूआरएल खोलें, सफल होने पर हाँ वापस करें, अन्यथा नहीं।

तो सारांश में, मैं आईओएस 4 व्यवहार को लागू करने और application:didFinishLaunchingWithOptions:

 
    if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3.2"]) { 
     [self application:application handleOpenURL:url]; 
    } 

जो 3.2 के तहत कोड काम करने के लिए निम्न पंक्ति गयी।

+0

धन्यवाद, मुझे एक ही समस्या थी और इस जवाब ने मुझे बहुत समय बचाया। – bosmacs

+0

मैं अभी तक यह काम नहीं कर सका जब तक मुझे एहसास हुआ कि मेरे पास 3.2 की बेस एसडीके के साथ संकलन करने वाला प्रोजेक्ट था लेकिन 4.0 सिम्युलेटर पर चल रहा था। परिणाम? सक्रिय होने पर, उपर्युक्त तरीकों में से कोई भी नहीं कहा जाता है। एक बार जब मैं बेस एसडीके को 4.0 पर स्विच कर देता हूं, तो सबकुछ काम करता है। यह सुनिश्चित नहीं है कि इसे 3.2 आईपैड में कैसे काम करना है। –

+0

अच्छा बिंदु। इसके अलावा: सिम्युलेटर मेरे लिए एक बहुत ही विश्वसनीय परीक्षण वातावरण नहीं था। मैंने चीजों को एक सिम्युलेटर में काम करने के लिए पाया जो डिवाइस पर नहीं था और इसके विपरीत। एक उदाहरण: http://stackoverflow.com/questions/3616981 - लेकिन सिम्युलेटर अब सुधार हुआ है। –

2

मैंने ड्रॉपबॉक्स एपीआई का उपयोग करने वाले एप्लिकेशन को लिखना शुरू कर दिया। अवधारणा को समझने के लिए, मैंने ड्रॉपबॉक्स/डेवलपर documentation पर उल्लिखित मेरी कुंजी/गुप्त का उपयोग करके एक नमूना आवेदन चलाया। एक बार नमूना ऐप काम करना शुरू कर दिया, मैंने अपने आवेदन के लिए एक ही कुंजी/गुप्त मान का उपयोग किया।

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

दोनों के लिए सच था, मैंने इस पोस्ट सहित इंटरनेट पर सूचीबद्ध लगभग हर चीज की कोशिश की। धन्यवाद। हालांकि, कोई सफलता नहीं थी।

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

  • सिम्युलेटर पर, का चयन करें "आईओएस सिम्युलेटर -> सामग्री और सेटिंग रीसेट करें", और रीसेट।
  • डिवाइस पर, मैंने नमूना अनुप्रयोग से संबंधित निष्पादन योग्य हटा दिया और जो बदले में उससे जुड़े कैश को हटा देता है।
7

application:handleOpenURL: अब डिप्टीटेड है।

आईओएस 4 के रूप में।2, आप खोलने यूआरएल के लिए इसका उपयोग कर सकते हैं:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
     sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 

प्रलेखन:

https://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html

0

application:DidFinishLaunchingWithOptions के अंत में निम्नलिखित जोड़ें:

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

    ...  

    NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey]; 
    if (url != nil && [url isFileURL]) { 
     return YES; 
    } else return NO; 
} // End of application:didFinishLaunchingWithOptions: 

// New method starts 
-(BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    mvc = [nc.viewControllers objectAtIndex:0]; 
    if (url != nil && [url isFileURL]) { 
     [mvc handleOpenURL:url]; 
    } 
    return YES; 
} 

जहां MVC अपने मुख्य ViewController है , और एनसी मेरे नेविगेशन नियंत्रक। निश्चित रूप से ज में handleOpenURL घोषित करने के बाद

- (void)handleOpenURL:(NSURL *)url { 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

    // Next bit not relevant just left in as part of the example 
    NSData *jsonData = [NSData dataWithContentsOfURL:url];   
    NSError *error; 
    NSDictionary *dictionary = [[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error] objectAtIndex:0]; 
    [self managedObjectFromStructure:dictionary withManagedObjectContext:self.context]; 
    ... 
} 

:

फिर MainViewController में, कुछ इस तरह से करते हैं।

धन्यवाद इसके लिए प्रयास करने के लिए ईसाई के पास जाता है।

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