2011-08-30 22 views
7

openUrl:を実行する前に、他のアプリを呼び出す前に、自分のアプリケーションのコールバックが機能していることをプログラムで確認するにはどうすればいいですか?(x-callback-url仕様に従って動作するアプリ)制限は、我々は、このアプリスキームの登録と一部アプリケーションがそのURLに応答ことを確認しているということである私のアプリはURLスキームに応答しますか?

- (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; 
} 

答えて

12

これは私の現在のソリューションです。

AFAIKこれは、あなたのアプリケーションがそのスキームの実際のレスポンダ(そのスキームに登録されている別のアプリがある場合)であるとは限りません。

私が試したところ、iOSは各ユニークなURLスキームの最初にインストールされたアプリを開きます。ここで

+0

ああ、今私は少し良く理解しています。 URLを開く前に、そのURLを開いたときに何が起きるかを特定する方法はありません。 iOSに照会するLaunchServicesインターフェースはありません。 –

+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]; 
} 
関連する問題