canOpenUrl失败,但openUrl成功

时间:2016-03-15 15:59:40

标签: ios

我面临一个奇怪的问题。 我正在使用xcode 7.2,iOS 9,在真实设备iphone 4S(不是模拟器)上工作。

我有2个应用,app1和app2。 app1应该使用url方案向app2发送数据。 app2很好地宣布了这个计划 app1在plist中引用了该方案(在iOS9中是必需的)

<key>LSApplicationQueriesSchemes</key>
    <array>
        <array>
            <string>OpenLinkMyData</string>
        </array>
    </array>

以下是我使用的代码:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) , ^{

            // build the url, using the scheme name, and the data
            // note that json is escaped from bad url chars.
            NSString * MyJsonDataWellEscaped = [[SomeClass getJSonDataToExport]   stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"OpenLinkMyData://%@",MyJsonDataWellEscaped]];

            // Next line should allow test if the app able to manage that scheme is installed.
            // BUT in our case, this allways returning false.
            bool can = [[UIApplication sharedApplication] canOpenURL:url];
            NSLog(@"canOpenUrl = %@", can?@"true":@"false");
         });
// code of the app that do stuff...
}

我找回了以下日志: -canOpenURL:URL失败:“OpenLinkMyData://(myJsonSuff)” - 错误:“此应用程序不允许查询方案OpenLinkMyData” canOpenUrl = false

但如果我使用以下代码:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) , ^{
            // build the url, using the scheme name, and the data
            // not that json is escaped from bad url chars.
            NSString * MyJsonDataWellEscaped = [[Move2MyMHelper getJSonDataToExport]   stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"OpenLinkMyData://%@",MyJsonDataWellEscaped]];

            if([[UIApplication sharedApplication] openURL:url])
                {
                NSLog(@"App launched OK");
                }
            else
                {
                NSLog(@"App not launched");
                }

        });

       // code of the app that do stuff...
}

如果我不检查方案是否可用并且我直接使用它,那么App2可以很好地打开并根据需要获取所有数据。 (如果没有安装app2,我会收到“App not started”日志)。

这里是用于接收数据的App2源(等待工作):

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
     NSString *prefixToRemove = @"OpenLinkMyData://";
    if(url != nil && [[url absoluteString] hasPrefix:prefixToRemove])
        {
         NSString * urlStr = [url absoluteString];
         NSString * json = [urlStr substringFromIndex:[prefixToRemove length]];
         json = [json stringByRemovingPercentEncoding];
         NSLog(@"OpenLinkMyData with json  : %@", json);
          }  
    return YES;
}

在我的情况下canOpenUrl有什么问题?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

使LSApplicationQueriesSchemes成为字符串数组而不是字符串数组数组:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>OpenLinkMyData</string>
</array>

答案 1 :(得分:0)

有关此主题的旁注...

未注册协议的请求限制为50。

In this discussion苹果公司提到,对于特定版本的应用程序,您只能查询canOpenUrl有限次,并且在50次未声明的调用之后将失败。我还看到,如果一旦进入此失败状态后添加了协议,它仍然会失败。

请注意这一点,可能对某人有用。