使用sharedApplication openURL方法在Safari中使用POST方法托管的Open Url

时间:2012-11-02 13:27:52

标签: iphone objective-c ios xcode uiapplication

我有一种情况,我使用POST方法在模拟器中的safari浏览器中托管网址。 在模拟器中启动我的iOS应用程序后,在safari中打开该网页。为了启动safari,我使用了[[UIApplication sharedApplication] openURL:...

post方法如下:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://***some client url***.jsp"]];

NSString *post = [NSString stringWithFormat:@"username=%@&password=%@", userName, password];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];`

NSURLConnection * _urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];   [_urlConnection start];

这段代码在使用UIWebView时工作正常。但我想使用此“请求”启动Safari,该请求附加了用户名& POST方法的密码数据。

要启动Safari,我必须调用此代码:

[[UIApplication sharedApplication] openURL:request];

但是这显然会引发警告,因为“request”属于NSMutableURLRequest类型。 “语义问题:不兼容的指针类型将'NSMutableURLRequest *'发送到'NSURL *'类型的参数..

我甚至无法使用[[UIApplication sharedApplication] openURL:request.URL];,因为这会给我一个未附加用户名和附加信息的网址。密码(没有POST方法)。

我想知道如何对此请求进行类型转换/转换(NSMutableURLRequest),以便我可以在[[UIApplication sharedApplication] openURL ....

中容纳它。

希望我对我的问题非常清楚。任何帮助将受到高度赞赏。在此先感谢!!

3 个答案:

答案 0 :(得分:5)

建议的方法是在您的应用中使用UIWebView,并使用NSURLRequestNSURLConnection创建发布请求。创建一个post请求并触发请求非常容易。既然你已经想出了这个并且你不想使用这种方法,那么只有通过创建一个临时html文件mentioned here 来替代。您可以尝试使用他们遵循的方法,并检查它是否适用于您的情况。

根据该链接,您必须编写一个临时的html文件。这个html文件将有一个onLoad() javascript立即发送POST,并为没有启用javascript的用户提供一个按钮。您可以从此文件中将NSURL对象创建为[NSURL fileURLWithPath:path];

另一种解决方案是从网络服务器创建one time key并通过HTTPS请求as mentioned here将其传递给safari。

答案 1 :(得分:2)

从浏览器中,您无法在向Body中添加数据时发出POST请求。如果是URL请求,您可以在其中添加身份验证作为请求标头中的参数,您可以在Safari中打开该URL。

希望我很清楚。

答案 2 :(得分:2)

通过openURL方法启动safari时无法传递POST数据,但是如果您在应用程序中使用自己的UIWebView,则可以传递POST数据,如下所示:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://***some client url***.jsp"]];

NSString *post = [NSString stringWithFormat:@"username=%@&password=%@", userName, password];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];`

[myUIWebView loadRequest:request];