当用户长按链接时,会出现一个警报控制器,其中包含以下选项:
目前有两个问题:
如果用户在WKWebView完成导航之前执行长按,则会出现默认(Safari)警报控制器.
如果用户在弹出动画发生后抬起手指,WKWebView会将其注册为点击并导航到该链接,同时警报控制器仍显示在屏幕上.
这个机制有三个部分.
首先,
在WKWebView完成导航后,会向禁用默认警报控制器的页面注入javascript.
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
[_webView evaluateJavaScript:@"document.body.style.webkitTouchCallout='none';"
completionHandler:^(id result, NSError *error){
NSLog(@"Javascript: {%@, %@}", result, error.description);
}];
}
Run Code Online (Sandbox Code Playgroud)
其次,
UILongPressGestureRecognizer被添加到WKWebView并实现,以便根据触摸位置查找元素的属性.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
- (void)longPress:(UILongPressGestureRecognizer *)longPressGestureRecognizer
{
if (longPressGestureRecognizer.state == UIGestureRecognizerStateBegan) {
_shouldCancelNavigation = YES;
CGPoint touchLocation = [longPressGestureRecognizer locationInView:_webView];
NSString *javascript = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Javascript" ofType:@"js"]
encoding:NSUTF8StringEncoding
error:nil];
[_webView evaluateJavaScript:javascript
completionHandler:^(id result, NSError *error){
NSLog(@"Javascript: {%@, %@}", result, error.description);
}];
[_webView …
Run Code Online (Sandbox Code Playgroud) NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:self.webView forKey:@"webView"];
Run Code Online (Sandbox Code Playgroud)
上面的代码用于保存WKWebView对象,但是我收到了编译器错误:
2014-11-08 14:58:52.561恢复[2431:482391]属性列表格式无效:200(属性列表不能包含'CFType'类型的对象)2014-11-08 14:58:52.564恢复[2431:482391 ]尝试将非属性列表对象>设置为关键webView的NSUserDefaults/CFPreferences值2014-11-08 14:58:52.566恢复[2431:482391] *由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因: '尝试将非财产清单对象>重点webView的'*第一掷调用堆栈:(0x2c491c1f 0x39c78c8b 0x2c491b65 0x2c4cbe51 0x2c436599 0x2c4358d7 0x2c4cc0d1 0x2c4cb769 0x2c4ce95b 0x2c4ce875 0x2d0eab69 0x66bdf 0x2f981c2b 0x2f981bd1 0x2f96c863 0x2f98163d 0x2f981317 0x2f97abe1 0x2f9513dd 0x2fbc4c29 0x2f94fe39 0x2c458377 0x2c457787 0x2c455ded 0x2c3a4211 0x2c3a4023 0x3379d0a9 0x2f9b01d1 0x66ead 0x3a1f8aaf)libc ++ abi.dylib:以NSException类型的未捕获异常终止
如何保存WKWebView并将其恢复历史记录?
编辑:
8个月过去了,这个问题没有解决方案......
编辑2:
我正在创建一个Web浏览器,当用户重新启动应用程序时,Web视图(标签)要恢复,这是至关重要的,这样他就可以按下后退按钮然后返回.
如果我将以前的URL保存在一个简单的列表中,那么当应用程序重新启动时,我无法将它们放回到Web视图中.我只能加载第一页.因此,用户无法按回,因为没有要回的页面.如果它像保存URL列表一样简单,我就不会开始赏金.因为,Web浏览器是一个非常复杂的应用程序,我已经非常接近webViews的基础知识,我甚至提交了3个错误,其中只有2个已经解决.包括臭名昭着的截图bug.
standardUserDefaults方法可以与UIWebView一起使用,但Apple声明所有开发人员都应该在iOS 7发布之后使用WKWebView.我期望在不久的将来弃用UIWebView.
我不会使用官方 API(如果有的话),因为 Google 的所有这种性质的 API 都需要付款,相反,我将使用一个 URL,我相信在任何地方的许多小型应用程序和网站中都可以找到它。
当然,我将使用“Google Suggestions”标题来引用 Google,所有这些在点击时都会重定向到浏览器中的 Google 页面。
这是从 Chrome 网络浏览器反向工程的请求 URL:
http://google.com/complete/search?output=toolbar&client=chrome&q=SEARCHTERM
Run Code Online (Sandbox Code Playgroud)
它以 JSON 格式返回建议。
我会违反他们的使用条款/服务或指南吗?
我自己没有发现 URL,这是这里另一个问题的答案,我猜在小规模项目中它可能会被忽视,但法律方面呢?
对不起,我不知道该使用哪些标签。
我正在构建一个Web浏览器,在网络方面我真的很新手.
我想测试下面的代码示例,但我没有真实的例子可以使用:
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
{
CFDataRef exceptions = SecTrustCopyExceptions(challenge.protectionSpace.serverTrust);
SecTrustSetExceptions(challenge.protectionSpace.serverTrust, exceptions);
CFRelease(exceptions);
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供我可以测试上面代码的URL吗?
编辑:我开始赏金,因为我感到筋疲力尽.我正在完成我创建的应用程序,每天都会出现很多问题.我真的很感激你的帮助!
我需要一种在互联网上直观地表示随机网页的方法.
比方说这个网页就是这么说的.
目前,这些是我可以使用的标准资产:
我需要以一种非常有意义的方式直观地表示随机网站,并邀请其他人点击它.
我需要Facebook在共享链接时所做的事情:
它会废弃图像的链接,然后创建一个美丽的有意义的图块,邀请您点击.
我能以任何方式从网站上刮下图像和文字吗?我主要对Objective-C/JavaScript组合感兴趣,但任何事情都会做,并将被选为批准的答案.
编辑:重新写了帖子并更改了标题.
我正在构建一个网络浏览器,最近我在尝试使用我在网站上的Google帐户登录时遇到了错误.
这很奇怪,因为我检查了我的应用程序和Safari的用户代理,它们都是相同的.
有什么建议?
UPDATE
WKWebView嵌套在自定义UIViews树的3层深处.
这是初始化代码:
_webView = [[WKWebView alloc] init];
_webView.allowsBackForwardNavigationGestures = NO;
_webView.allowsLinkPreview = NO;
_webView.navigationDelegate = self;
_webView.UIDelegate = self;
_webView.frame = CGRectMake(0.0, 0.0, self.contentView.frame.size.width, self.contentView.frame.size.height);
[self.contentView addSubview:_webView];
Run Code Online (Sandbox Code Playgroud) 几个星期前我问了一个问题,我认为它可以解决谷歌登录/注册的问题,但它仍然存在问题.
当您输入电子邮件和密码并单击下一步时,页面将变为空白,并且没有任何反应.没有重定向,没有加载,没有.
在Safari中,页面重定向并成功登录.
我已尝试使用stackoverflow.com进行Google登录,但它确实有效!
但我相信它使用的是另一种方法,因为它不会向我询问任何内容,登录只会发生.它甚至没有要求我选择我想登录的帐户.一切都是自动发生的.
通常情况下,如果您输入了电子邮件和密码,Google会要求您选择要用于登录的帐户,而无需再次输入信息.
随着getpocket.com出现此屏幕,我点击我的帐户并冻结.橙色加载条动画播放没有尽头.
我无法理解这是什么问题.
它可能是用户代理吗?
有任何想法吗?
WKWebView的初始化非常基础:
_webView = [[WKWebView alloc] init];
_webView.allowsBackForwardNavigationGestures = NO;
_webView.allowsLinkPreview = NO;
_webView.navigationDelegate = self;
_webView.UIDelegate = self;
_webView.frame = CGRectMake(0.0, 0.0, self.contentView.frame.size.width, self.contentView.frame.size.height);
[self.contentView addSubview:_webView];
Run Code Online (Sandbox Code Playgroud)
我甚至尝试了一个流行的网络浏览器iCab Web浏览器,问题仍然存在于getpocket.com
我正在尝试捕获WKWebView的屏幕快照,但是我的方法无法正常工作,它返回纯色,好像图层树为空,而它似乎可以在其他视图上工作。
- (UIImage *)screenshot
{
UIImage *screenshot;
UIGraphicsBeginImageContext(self.frame.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return screenshot;
}
Run Code Online (Sandbox Code Playgroud) 我使用此方法拍摄快照:
UIView *snapshotView = [someView snapshotAfterScreenUpdates:NO];
Run Code Online (Sandbox Code Playgroud)
这给了我一个可以玩的UIView.
但是,我需要它的UIImage而不是UIView.
这是我用于将UIView转换为UIImage的方法:
- (UIImage *)snapshotOfView:(UIView *)view
{
UIImage *snapshot;
UIGraphicsBeginImageContext(view.frame.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
snapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return snapshot;
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,快照是一个空白的UIImage,因为snapshotView没有呈现.
显而易见的事情是直接拍摄视图的快照,而不是以UIView的形式拍摄快照然后转换它.
显而易见的方法的问题是我使用的WKWebView有一个巨大的错误,不允许你截取屏幕截图.这是真的,我甚至报告了这个错误,他们说他们正试图修复它.
那么,如何在不渲染的情况下拍摄snapshotView的快照(UIImage)呢?
我正在尝试将Google建议用于希腊语,但如果建议中包含英语以外的字符,则会收到错误消息.
如果查询是" magni ",例如响应将包含希腊词" μαγνήσιο "作为建议.试试吧
错误是:
Error Domain = NSCocoaErrorDomain Code = 261"无法使用Unicode(UTF-8)文本编码打开文件"search"." UserInfo = {NSURL = http://suggestqueries.google.com/complete/search?q=magni&client=toolbar&hl=el,NSStringEncoding = 4}
方法是:
+ (NSArray *)suggestionsForQuery:(NSString *)query
{
query = [query stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSString *URLString = [NSString stringWithFormat:@"http://suggestqueries.google.com/complete/search?q=%@&client=toolbar&hl=%@", query, @"el"]; // el is for greek
NSError *error = nil;
NSString *XMLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:URLString] encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"Error: %@", error.description);
}
else {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我试过了:
将编码设置为NSUTF16StringEncoding但我有一些中文字符.
NSJSONSerialization通过设置"toolbar = firefox"来获得JSON响应但我得到了同样的错误.
错误域= NSCocoaErrorDomain代码= 3840"无法将数据转换为字符40周围的字符串." …
ios ×8
objective-c ×7
wkwebview ×7
iphone ×3
google-oauth ×2
javascript ×2
uiview ×2
user-agent ×2
autocomplete ×1
encoding ×1
html ×1
nsstring ×1
uiimage ×1
unicode ×1