【问题标题】:iOS: Is it possible to open NSURLRequest directly in Safari?iOS:是否可以直接在 Safari 中打开 NSURLRequest?
【发布时间】:2012-04-10 11:25:10
【问题描述】:

我不是在谈论 UIWebView,我想使用 NSURLRequest 打开移动 Safari 应用程序。

为什么?在我的应用程序中,用户已经登录到我们的网络服务器。我想为用户提供启动网页的选项,而无需重新输入他们的凭据。但是,我不能使用 GET,因为这会将他们的凭据放在 URL 中。

那么,我可以使用NSURLRequestPOST 以其他形式从我的应用程序中打开Safari 应用程序(不是UIWebView)吗?

【问题讨论】:

  • 您使用什么形式的会话管理?而且,就此而言,为什么让用户跨凭据边界重新进行身份验证代价高昂?
  • 我从来没有说过它很昂贵,但主要原因是因为这是我们的客户想要的。至于会话管理,webservice MVC 3 .NET,我相信它只是一个 cookie(出于与密码相同的原因,我们不想通过 url 发送它)。
  • 我明白了。最终,您必须通过网络发送某种形式的凭证以确保其安全。如果您提供 HTTPS 并允许 Safari 正确验证证书,我建议您的客户端通过网络发送会话标识符或身份验证优惠券的概念。这还不够吗?
  • 我不明白。您说“用户已经登录到我们的 Web 服务器”,但“GET”会“将他们的凭据放入 URL”。他们最初是如何登录的?为什么 GET 会公开他们的凭据?
  • @mtmurdock 至于登录和会话优惠券:您需要提供某种形式的保证,即客户端发送并被服务器接受的数据很可能来自请求方。一个可靠的方法是提供某种形式的public key authentication,这样你的加密函数的数学保证使得其他人正在使用连接变得非常难以置信,没有妥协。

标签: ios post mobile-safari nsurlrequest


【解决方案1】:

我会拼命拒绝——没有办法将NSURLRequest 直接传递给 Safari。 iOS 上的(主要)应用程序间通信媒介是访问 URL;没有将对象从一个应用程序传递到另一个应用程序的通用机制。

我认为您能做的最好的事情就是在应用程序中从您的网络服务器获取one-time key,然后在 URL 中使用该地址进入 Safari。并且,如果可以,请通过 HTTPS 执行此操作,以便 URL 路径和查询组件仅在 TLS 协商成功后可见。这应该会阻止其他任何人查看相关凭据并阻止它们发挥作用,即使它们是通过其他方式获得的(例如您旁边的人从您的屏幕上复制 URL)。

【讨论】:

  • 这是一个有趣的解决方案。我不确定我是否可以保证 https 连接,但如果可以的话,这可能会起作用。
  • 我对这个答案持中立态度。我想支持它,但它遗漏了很多有趣的细节,见 how to generate a strong one-time key 和 HTTPS 协商的技术细节,保证路径形凭据不会泄露给世界。否则,我同意。 :)
  • @MrGomez 它忽略了细节,因为我对细节的了解非常不精确。我已将答案标记为社区 wiki,因此希望有好心人能够填写这些内容?
  • @Tommy 完成。感谢您允许我这样做!
【解决方案2】:

使用NSURL 或仅使用NSString 或仅使用char* 会更简单。 我不确定这是否适用于 iPhone,它应该,因为 iPhone 像 OSX 一样与 Darwin 并行运行,但在 iPhone 上有一些限制。 不过,这绝对适用于 mac。

NSString *url = @"http://www.apple.com";
NSURL *myURL = [NSURL URLWithString:url];
system([ [NSString 
          stringWithFormat:@"Open -a Safari %@", 
          [NSString stringWithContentsOfURL:myURL encoding:NSUTF8StringEncoding error:NULL] ]
          cStringUsingEncoding:NSUTF8StringEncoding]);

另外,我可能会建议这是一个坏主意(如果可以避免的话)。作为 iPhone 用户,当开发人员将我从我目前使用的应用程序中带走时,我确信并不是唯一一个感到非常恼火的人。

【讨论】:

  • 重读您的问题,我想我可能误解了它。对不起,无用的答案。
  • 在 iPhone 上,您将使用 [[UIApplication sharedApplication] openURL:myURL] 而不是进行系统调用来打开。根据 Apple 关于第三方复制内置功能的规则,您将获得 Safari,因此它与 OS X 上的[[NSWorkspace sharedWorkspace] openURL:myURL] 基本相同,只是您可以确信您将获得 Safari,正如原始海报所规定的那样。跨度>
  • 很高兴知道,谢谢。我是这个网站的新手,我想知道我应该删除这篇文章还是保持原样?
  • 大富奇?!介意我建议阅读更多关于NSWorkspace 和/或UIApplication 的信息吗?您的代码就像驾驶安装在火箭上的坦克,而火箭本身安装在一艘大型宇宙飞船上,进入您最好的朋友家,而不仅仅是按门铃。编辑:该死,太多时间花在夸张上......
  • @MichaelDorst 是否要删除答案取决于您。有时错误的答案有助于增加知识的整体,有时它们会分散注意力。另外,我认为 JustSid 指的是您的编码风格,而不是代码的准确性。每当您在此站点上发布任何内容时,您都希望确保它尽可能干净、清晰(和准确),而不添加任何无关的细节。感谢您的贡献! :D
猜你喜欢
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多