如果网站在ipad safari中运行或在应用程序WebView中运行,是否有办法通过javascript进行区分?
我正在编写一个使用表单身份验证的Asp.net MVC 2应用程序,目前我的iPhone应用程序在通过Web进行身份验证/登录时遇到问题.我们开发了一个使用UIWebView控件的简单iPhone应用程序.在这个阶段,所有应用程序都会导航到我们的Asp.Net网站.简单吧?问题是,用户无法通过登录页面.重复步骤是:
但是用户然后被重定向到BACK登录屏幕!
我已经对此进行了一些广泛的调试,我所知道的是:
cookie被发送到客户端,客户端正在存储cookie.在iPhone调试器中验证了这一点,并使用Javsascript在页面上显示cookie数据.cookie正被发送回服务器.在Visual Studio调试器中验证了这一点.它是正确的cookie(它与设置的相同).User.Identity.IsAuthenticated属性由于某种原因返回false,即使auth cookie包含在Request对象中.我已经确认iPhone应用程序已设置为接受cookie,并且它们在客户端上.
这是有趣的事情:如果您在iPhone上打开Safari浏览器并直接访问我们的网站,它可以正常工作.
它在iPad上也具有相同的行为,因为它没有通过登录屏幕.这种模拟器和设备上的重复.
这个网站已经通过IE 7-8,Safari(适用于Windows),Blackberry,IEMobile 6.5,Phone 7进行了测试,可以找到它.唯一不适用的情况是iPhone应用程序中的UIWebView.
如何在iOS 5中更改UIWebView的用户代理?
到目前为止我做了什么: 使用委托回调,拦截NSURLRequest,创建一个新的url请求并将其用户代理设置为我想要的任何内容,然后下载数据并使用"loadData:MIMEType:...重新加载UIWebView" ".
问题: 这会导致无限递归,我加载数据,调用代理返回,实习生调用委托....
这是委托方法:
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
dispatch_async(kBgQueue, ^{
NSURLResponse *response = nil;
NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[request URL]];
NSDictionary *headers = [NSDictionary dictionaryWithObject:
@"custom_test_agent" forKey:@"User-Agent"];
[newRequest setAllHTTPHeaderFields:headers];
[self setCurrentReqest:newRequest];
NSData *data = [NSURLConnection sendSynchronousRequest:newRequest
returningResponse:&response
error:nil];
dispatch_sync(dispatch_get_main_queue(), ^{
[webView loadData:data
MIMEType:[response MIMEType]
textEncodingName:[response textEncodingName]
baseURL:[request URL]];
});
});
return YES;
}
Run Code Online (Sandbox Code Playgroud) 如何在WKWebView中设置自定义的useragent字符串?我正在尝试嵌入我的应用程序版本,以便我的服务器端可以看到可用的功能.我找到了以下方法:
let userAgent = "MyApp/1.33.7"
request.setValue(userAgent, forHTTPHeaderField: "User-Agent")
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
let content = NSString(data: data, encoding: NSUTF8StringEncoding)
self.web!.loadHTMLString(content!, baseURL: url)
}
self.web!.loadRequest(request);
Run Code Online (Sandbox Code Playgroud)
但这意味着仅为该单个请求设置了useragent.第一个其他请求(例如转发)将意味着再次将useragent重置为默认值.如何更永久地配置wkwebview以使用我的自定义useragent字符串?
我在使用一台远程服务器时遇到问题.我的应用程序使用[NSData initWithContentsOfURL:]方法向服务器发出请求,作为响应,我得到了我打开的网站的网址UIWebView.
问题是这些请求具有不同的User-Agent,并且服务器无法正确地为我服务,因为它期望我使用相同的User-Agent发送所有请求.我知道如何更改用户代理(例如,在UIWebView(iPhone SDK)中更改用户代理)但我真正想要的是以某种方式获取UIWebView用户代理并将其设置为[NSData initWithContentsOfURL:]以避免服务器端出现问题
我为iOS和Android开发了一个应用程序,它使用应用程序内浏览器(Webview)从我的网络服务器访问HTML文件.
我不希望用户在不使用该应用程序的情况下访问此文件.如果用户使用应用程序访问文件或直接通过智能手机/平板电脑/计算机上的浏览器,是否有可能检测到?我认为使用PHP的解决方案要好得多,因为可以关闭Javascript.至少Google Analytics可以区分Safari和Safari(应用内).它应该适用于iOS和Android的每个版本.
谢谢你的帮助.
解
经过多次尝试,我终于找到了适合我的解决方案!
iOS: 您可以使用用户代理检测Safari和应用内浏览器之间的差异.可能有一个更好的解决方案,但它的工作原理.
// Safari (in-app)
if ((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false) {
echo 'Safari (in-app)';
}
Run Code Online (Sandbox Code Playgroud)
Android:
应用程序中的包名称存储在PHP变量中$_SERVER['HTTP_X_REQUESTED_WITH'].
// Android (in-app)
if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app") {
echo 'Android (in-app)';
}
Run Code Online (Sandbox Code Playgroud)
正如Tim van Elsloo已经注意到HTTP标头可以伪造,这不是绝对安全的.
直到几天前它运行良好:在iPad/UIWebView中打开facebook.com作为标准网络呈现.现在Facebook被强制呈现为触摸 - 就像URL是http://touch.facebook.com一样.无论UIWebView框架大小如何,都会发生这种情况.这是一个简单的代码,主视图控制器可以看到问题:
UIWebView *wv = [[UIWebView alloc] initWithFrame:self.view.frame];
NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.facebook.com"]];
[wv loadRequest: req];
[self.view addSubview: wv];
Run Code Online (Sandbox Code Playgroud)
我尝试按照此处的建议更改用户代理- 没有用.
我[NSUserDefaults registerDefaults:]在应用程序启动时通过调用注册了一堆首选项值.我需要在某个阶段用新的替换它们,但新值范围(键设置)小于初始值.所以在我[NSUserDefaults registerDefaults:]再次打电话之后,我有一些新的价值观,其中一些旧的未被替换.是否有可能删除以前注册的值?
如果我单击 UIWebView 显示的网页中的视频链接,则视频会播放,但会弹出一个对话框,显示“插件已处理负载”。
有谁知道为什么会发生这种情况以及如何阻止它发生?
这不是以下内容的重复:
因为我没有创建具有零大小框架的 UIWebView,这被描述为原因。
(我使用的是 iOS 5)
如何在使用UIWebView窗口的iPhone应用程序中启用cookie,以便我的登录系统能够正常工作?
我需要传递一些额外的信息,UIWebView loadRequest:以便它达到我的实现NSURLProtocol.信息不能绑定,NSURLRequest因为信息也必须保留NSURLRequest mainDocumentURL.所以我用它进行了子类化NSURL和构造NSURLRequest.我已经知道NSURLRequest到达NSURLProtocol startLoading的不是我所提供的实例UIWebView loadRequest,所以我也实现NSURL copyWithZone了,天真地期望URL加载系统将使用它.
现在,NSURLProtocol canInitWithRequest不是人们合理预期的,而是至少4次startLoading.前两次,传入NSURLRequest仍然包含我的自定义NSURL实现.然后叫一个不幸的内部代码CFURLCopyAbsoluteURL询问了absoluteURL我的定制NSURL和下canInitWithRequest(以及随后的startLoading)已经得到了全新的NSURLRequest新鲜NSURL的吧.copyWithZone永远不会被调用,我的子类NSURL丢失了.
在我放弃并实现一个低级且易碎的解决方案并将内容直接附加到URL字符串之前,我想问更高级别的向导,他们是否看到了如何捕获NSURLProtocol雷达上的初始闪烁或如何CFURLCopyAbsoluteURL进入的方法携带我的自定义实例.我试图NSURL absoluteURL通过再次返回我的自定义NSURL类的新实例来破解,但它没有帮助.我已经在NSURLProtocol setProperty功能上看到了一些承诺,但现在看起来很无用.URL加载系统快乐地创建所有内容的新实例,并且NSURLRequest到达时NSURLProtocol似乎与UIWebView仅偶然输入的内容相同.
更新:好的我想保持帖子尽可能短,但即使是第一个回复是要求技术背景,所以我们去:我UIWebView在应用程序中有多个s.这些视图可以同时运行请求,绝对可以运行相同URL的请求.这就像桌面浏览器中的标签.但我需要区分哪个UIWebView是NSURLRequest到达的每个特定的起源NSURLProtocol …
我有一个简单的iOS应用程序,它只显示一个UIWebView需要登录的特定网站.如果我运行我的应用程序并尝试登录该站点只需重新显示登录页面(没有错误消息).如果我使用Safari,我可以登录同一个网站.我的错在哪里UIWebView?如果重要,该网站使用SSL/https.
我有一个想要访问Amazon.com的UIwebview,当我加载amazon.com时,它的格式与我从iphone safari那里去的格式不同.什么告诉像amamzon这样的网站重绘iphone?这是我的代码:
- (void)viewDidLoad {
NSString *urlAddress = @"http://www.amazon.com/Inventive-Gadgets-Inc-PQFan-Professionally/dp/B000V8ASR6";
//Create a URL object.
NSURL *url = [NSURL URLWithString:urlAddress];
//URL Requst Object
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
//Load the request in the UIWebView.
[webView loadRequest:requestObj];
}
- (IBAction) gotofourth{
[self dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
任何帮助都会很棒.
谢谢
ios ×8
uiwebview ×7
iphone ×5
cookies ×2
javascript ×2
user-agent ×2
android ×1
asp.net ×1
asp.net-mvc ×1
cocoa ×1
cocoa-touch ×1
facebook ×1
iad ×1
ios4 ×1
ios5 ×1
ipad ×1
nsurl ×1
nsurlrequest ×1
objective-c ×1
php ×1
quicktime ×1
typo3 ×1
webview ×1
wkwebview ×1
xcode ×1