7

openUrl:启动一个应该回调我的应用程序的应用程序(如根据x-callback-url规范运行的应用程序)之前,如何在调用另一个应用程序之前以编程方式检查我的应用程序回调是否正常工作?

4

3 回答 3

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

限制是我们正在检查该应用程序是否注册了该方案,并且某些应用程序响应了该 url。

AFAIK 这并不能保证您的应用程序是该方案的实际响应者(在另一个应用程序也注册该方案的情况下)。

从我的尝试来看,iOS 似乎为每个唯一的 url 方案打开了第一个安装的应用程序。

于 2011-08-30T13:58:36.057 回答
0

这是我在 Swift 中解决它的方法:

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)
于 2015-09-02T11:32:10.710 回答
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];
}
于 2016-06-03T01:31:48.667 回答