【问题标题】:launching app or opening link in safari from ios framework从 ios 框架在 Safari 中启动应用程序或打开链接
【发布时间】:2016-10-14 15:48:01
【问题描述】:

我正在开发一个 ios 框架(可以使用 cocoapods 安装)。当调用这个框架的一个方法时,它会在 safari 上打开一个 url。如果其他应用程序能够使用通用链接处理该 url,那么它将启动该应用程序。

我试图调用(在目标部署 ios 8.0 的 ios 9.3 模拟器中

[[UIApplication sharedApplication] openURL:url];

以上代码在任何 ios 应用程序中都能完美运行。但是,当我将相同的代码放在另一个应用程序中包含的框架中时,它会出现异常和应用程序崩溃。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString scheme]: unrecognized selector sent to instance 0x7fc070717e00'

框架内部的工作方式是否不同?什么是正确的方法。在此示例中,我尝试打开常规 https 链接。

谢谢

【问题讨论】:

  • 您的目标平台和部署目标是什么?第二种方法从 iOS 10 开始可用。
  • 目标部署是 ios 8.0,我在模拟器 ios 9.3 中运行它。我先尝试过第一个。两者都不起作用。
  • 那么请使用第一种方法显示确切的用法和确切的错误信息。
  • 谢谢!我已经更新了问题。
  • 看起来您调用的参数有误。可能你在请求 NSURL 的地方传递了一个 NSString。

标签: ios objective-c cocoapods ios-frameworks


【解决方案1】:

由于这可能对其他人有用,这似乎是导致问题的原因:

[[UIApplication sharedApplication] openURL:url];

被调用的参数实际上不是NSURL,而是NSString,因此在此过程中抛出了NSInvalidArgumentException - 在描述中提示错误类型。

不过,编译器至少应该在此处发出警告。

在编辑之前,提到了另一种方法:

[[UIApplication sharedApplication] openURL:url options:nil completionHandler:^(BOOL success) {
    NSLog(@"opened url %d", success);
}];

失败的原因不同:该方法仅在 iOS 10 之后可用,因此在运行 iOS 9.3 的测试环境中抛出了 NSInvalidArgumentException

【讨论】:

  • 可以在任何线程中调用还是只能在主线程中调用?
  • 我不确定,也找不到答案。从概念上讲,我认为无论如何我都会在主线程上安排这些调用,因为它很可能会与应用程序生命周期交互(这应该发生在主线程上)。但这里没有确凿的证据。
  • 感谢您的见解!会努力寻找答案
猜你喜欢
  • 2020-04-12
  • 2023-03-04
  • 2015-09-17
  • 2012-09-07
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
相关资源
最近更新 更多