【问题标题】:Check if URL can be opened from an iOS today widget检查是否可以从 iOS Today 小部件打开 URL
【发布时间】:2015-10-08 09:01:56
【问题描述】:

我的问题是我无法确定是否可以从 iOS 小部件打开某个 URL。 canOpenURL: 方法在今天的小部件上不可用,因为没有 UIApplication 类。

此外,方法 openURL: of NSExtensionContext 为布尔“成功”返回 YES,即使 URL 无效。

下面的代码进入 else 条件(成功 BOOL 始终为 YES),但同时模拟器显示弹出错误,如附图所示。

NSURL* invalidURL = [NSURL URLWithString:@"fake://blablabla"];
[self.extensionContext  openURL:invalidURL completionHandler:^(BOOL success) {
    if (success == NO) {
        DDLogWarn(@"Can't open URL: %@", invalidURL);
    }
    else{
        DDLogInfo(@"Successfully opened URL: %@",invalidURL);
    }
}];

【问题讨论】:

  • 你在真机上试过了吗?行为可能不同。

标签: ios objective-c ios8-today-widget today-extension


【解决方案1】:

这是一个已知的错误。我去年在 iOS 8.0b5 发布时向 Apple 提交了这个问题 (rdar://18107612),但它仍然是一个悬而未决的问题。

通过http://bugreport.apple.com 向 Apple 提交您自己的错误,并希望一切顺利。

【讨论】:

  • 感谢您指出这一点。有没有可行的解决方法?那将不胜感激。
  • 不好。我能想到的最好的方法是让您的主应用程序检查 URL,然后将信息保存在用户默认值中以指示它是否有效。扩展程序可以读取。但是,如果用户添加或删除应用,信息可能不是最新的。
【解决方案2】:

您可以使用performSelector: 访问共享的UIApplication 实例,例如

UIApplication *sharedApplication = [[UIApplication class] performSelector:NSSelectorFromString(@"sharedApplication")];

【讨论】:

  • 我认为这不是一个公共API,所以Apple会拒绝任何使用这行代码的应用程序,不是吗?
  • 是的,如果你混淆了方法签名,你也许可以通过
  • 对其进行混淆并添加NSDate 检查以确保仅在预期的应用审核日期结束后进行调用。但说真的,我认为您不应该这样做。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 2018-09-23
  • 1970-01-01
相关资源
最近更新 更多