2011-08-30 10 views
7

एक ऐप लॉन्च करने के लिए openUrl: करने से पहले एक ऐप लॉन्च करना चाहिए (जैसे एक ऐप जो x-callback-url विनिर्देश के अनुसार कार्य करता है), मैं अन्य एप्लिकेशन को कॉल करने से पहले प्रोग्राममैटिक रूप से कैसे जांच सकता हूं कि मेरा एप्लिकेशन कॉलबैक काम कर रहा है?क्या मेरा ऐप यूआरएल योजना का जवाब देगा?

उत्तर

12

यह मेरे वर्तमान समाधान है:

- (BOOL) respondsToUrl:url 
{ 
    BOOL schemeIsInPlist = NO; // find out if the sceme is in the plist file. 
    NSBundle* mainBundle = [NSBundle mainBundle]; 
    NSArray* cfBundleURLTypes = [mainBundle objectForInfoDictionaryKey:@"CFBundleURLTypes"]; 
    if ([cfBundleURLTypes isKindOfClass:[NSArray class]] && [cfBundleURLTypes lastObject]) { 
     NSDictionary* cfBundleURLTypes0 = [cfBundleURLTypes objectAtIndex:0]; 
     if ([cfBundleURLTypes0 isKindOfClass:[NSDictionary class]]) { 
      NSArray* cfBundleURLSchemes = [cfBundleURLTypes0 objectForKey:@"CFBundleURLSchemes"]; 
      if ([cfBundleURLSchemes isKindOfClass:[NSArray class]]) { 
       for (NSString* scheme in cfBundleURLSchemes) { 
        if ([scheme isKindOfClass:[NSString class]] && [url hasPrefix:scheme]) { 
         schemeIsInPlist = YES; 
         break; 
        } 
       } 
      } 
     } 
    } 

    BOOL canOpenUrl = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString: url]]; 

    return schemeIsInPlist && canOpenUrl; 
} 

सीमा यह है कि हम जाँच कर रहे हैं कि इस एप्लिकेशन योजना के लिए पंजीकृत है और कुछ अनुप्रयोग है कि यूआरएल का जवाब है।

AFAIK यह गारंटी नहीं देता है कि आपका आवेदन उस योजना के लिए वास्तविक उत्तरदाता है (जिस स्थिति में एक और ऐप भी उस योजना के लिए पंजीकृत है)।

मैंने जो कोशिश की, ऐसा लगता है कि आईओएस प्रत्येक अद्वितीय यूआरएल योजना के लिए पहला स्थापित ऐप खोलता है।

+0

आह, अब मैं थोड़ा बेहतर समझते हैं। यूआरएल खोलने से पहले कुछ जानने का कोई तरीका नहीं है जब आप उस यूआरएल को खोलेंगे तो क्या होगा। पूछताछ के लिए आईओएस पर कोई लॉन्च सर्विसेज इंटरफ़ेस नहीं है। –

+0

मैंने अपना जवाब स्वीकार करने का फैसला किया क्योंकि ऐसा लगता है कि यह उपलब्ध सर्वोत्तम तरीका है (हालांकि यह 100% विश्वसनीय नहीं है)। –

0

यहाँ कैसे मैं इसे स्विफ्ट में हल है:

var plistPath = NSBundle.mainBundle().pathForResource("Info", ofType: "plist") 

var urlStuff = NSMutableDictionary(contentsOfFile: plistPath!) 
var urlType = NSDictionary(objectsAndKeys: "com.appprefix.AppName", "CFBundleURLName", NSArray(object: "fb123456789"), "CFBundleURLSchemes") 
urlStuff?.setObject(NSArray(object: urlType), forKey: "CFBundleURLTypes") 
urlStuff?.writeToFile(plistPath!, atomically: true) 
0

एक अधिक आसान समाधान:

+ (BOOL)isBundleURL:(NSURL *)url 
{ 
    NSArray *urlTypes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"]; 
    NSArray *urlSchemes = [urlTypes.firstObject objectForKey:@"CFBundleURLSchemes"]; 
    return [urlSchemes containsObject:url.scheme]; 
} 

+ (BOOL)respondsToURL:(NSURL *)url 
{ 
    return [self isBundleURL:url] && [[UIApplication sharedApplication] canOpenURL:url]; 
} 
संबंधित मुद्दे