在 iOS 中获取特定网站 URL 的缩略图和标题?
Get Thumb image and title of particular Website URL in iOS?
我必须显示缩略图并获取 WEB 的标题 URL 与 iOS 中的 LinkedIN 应用程序和 Skype 应用程序相同?
有什么解决办法吗?
您需要下载站点的 html,然后解析它以获得 <title>
标记(它为您提供标题)
和 <link rel="icon" ... >
标签为您提供网站图标。
Wikipedia article on Favicon link
请注意,标题和网站图标都不能保证存在,尽管大多数网站确实提供了标题,而且大多数主要网站都提供了网站图标。
这是查找 URL
的网站图标的最简单方法
NSString *myURLString = @"http://www.google.com/s2/favicons?domain=www.facebook.com";
NSURL *myURL=[NSURL URLWithString: myURLString];
NSData *myData=[NSData dataWithContentsOfURL:myURL];
UIImage *myImage=[[UIImage alloc] initWithData:myData];
Swift版本:
let myURLString = "http://www.google.com/s2/favicons?domain=www.facebook.com"
let myURL = NSURL(string: myURLString)!
let myData = NSData.dataWithContentsOfURL(myURL)
let myImage = UIImage(data: myData)!
希望这对很多人有帮助
更新
下面是 swift 库,可帮助您按需加载图像。
- 下载主页
- 解析元属性
像 og:image 和 og:url
- 他们的内容就是你需要的。
其他答案是正确的,但值得注意的是,网站图标是 16x16 像素 或 32x32 像素。对于您希望达到的大小和分辨率,这可能不够。
教科书中没有实现此目的的方法,但一种方法是向 google 发送请求以获取 网站标题 +“图标”(例如"Facebook icon"), 并选择第一个结果。
至于网站的标题,如果您要查找进入网站时浏览器中显示的标题,则必须解析 html 以查找 <title> </title>
标记。
同时实现这两个目标可能具有挑战性,但这绝对不是不可能的。可能有某种服务可以提供这种服务,但据我所知不是。
你可以参考这个:"An NSURL extension for showing preview info of webpages"
https://www.cocoacontrols.com/controls/urlpreview
func fetchPageInfo(completion: ((title: String?, description: String?, previewImage: String?) -> Void), failure: ((errorMessage: String) -> Void)) {
let request = NSMutableURLRequest(URL: self)
let newUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36"
request.setValue(newUserAgent, forHTTPHeaderField: "User-Agent")
ValidationQueue.queue.cancelAllOperations()
NSURLConnection.sendAsynchronousRequest(request, queue: ValidationQueue.queue, completionHandler: { (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
if error != nil {
dispatch_async(dispatch_get_main_queue(), {
failure(errorMessage: "Url receive no response")
})
return
}
if let urlResponse = response as? NSHTTPURLResponse {
if urlResponse.statusCode >= 200 && urlResponse.statusCode < 400 {
if let data = data {
if let doc = Kanna.HTML(html: data, encoding: NSUTF8StringEncoding) {
let title = doc.title
var description: String? = nil
var previewImage: String? = nil
print("title: \(title)")
if let nodes = doc.head?.xpath("//meta").enumerate() {
for node in nodes {
if node.element["property"]?.containsString("description") == true ||
node.element["name"] == "description" {
print("description: \(node.element["content"])")
description = node.element["content"]
}
if node.element["property"]?.containsString("image") == true &&
node.element["content"]?.containsString("http") == true {
previewImage = node.element["content"]
}
}
}
dispatch_async(dispatch_get_main_queue(), {
completion(title: title, description: description, previewImage: previewImage)
})
}
}
} else {
dispatch_async(dispatch_get_main_queue(), {
failure(errorMessage: "Url received \(urlResponse.statusCode) response")
})
return
}
}
})
}
我试过这个库,它适用于 youtube、flipkart。
https://github.com/myell0w/MTDURLPreview
[MTDURLPreview loadPreviewWithURL:[NSURL URLWithString:@"http://www.flipkart.com"] completion:^(MTDURLPreview *preview, NSError *error) {
}];
Printing description of preview->_title:
Online Shopping India | Buy Mobiles, Electronics, Appliances, Clothing and More Online at Flipkart.com
Printing description of preview->_domain:
www.flipkart.com
Printing description of preview->_imageURL:
http://img1a.flixcart.com/www/promos/new/20160701_015447_730x300_monsoon.jpg
URLEmbeddedView写在Swift,但你可以在Objective-C.
中使用
This 是 Objective-C 示例代码。请查收。
#import <URLEmbeddedView/URLEmbeddedView-Swift.h>
#import <MisterFusion/MisterFusion-Swift.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (strong, nonatomic) URLEmbeddedView *embeddedView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.textView.text = @"https://github.com/";
[OGDataProvider sharedInstance].updateInterval = [NSNumber days:10];
self.embeddedView = [[URLEmbeddedView alloc] initWithUrl:@""];
[self.containerView addLayoutSubview:self.embeddedView andConstraints:@[
self.embeddedView.Top,
self.embeddedView.Right,
self.embeddedView.Left,
self.embeddedView.Bottom
]];
}
- (IBAction)didTapFetchButton:(id)sender {
[self.embeddedView loadURL:self.textView.text completion:nil];
}
@end
我必须显示缩略图并获取 WEB 的标题 URL 与 iOS 中的 LinkedIN 应用程序和 Skype 应用程序相同?
有什么解决办法吗?
您需要下载站点的 html,然后解析它以获得 <title>
标记(它为您提供标题)
和 <link rel="icon" ... >
标签为您提供网站图标。
Wikipedia article on Favicon link
请注意,标题和网站图标都不能保证存在,尽管大多数网站确实提供了标题,而且大多数主要网站都提供了网站图标。
这是查找 URL
的网站图标的最简单方法NSString *myURLString = @"http://www.google.com/s2/favicons?domain=www.facebook.com";
NSURL *myURL=[NSURL URLWithString: myURLString];
NSData *myData=[NSData dataWithContentsOfURL:myURL];
UIImage *myImage=[[UIImage alloc] initWithData:myData];
Swift版本:
let myURLString = "http://www.google.com/s2/favicons?domain=www.facebook.com"
let myURL = NSURL(string: myURLString)!
let myData = NSData.dataWithContentsOfURL(myURL)
let myImage = UIImage(data: myData)!
希望这对很多人有帮助
更新
下面是 swift 库,可帮助您按需加载图像。
- 下载主页
- 解析元属性 像 og:image 和 og:url
- 他们的内容就是你需要的。
其他答案是正确的,但值得注意的是,网站图标是 16x16 像素 或 32x32 像素。对于您希望达到的大小和分辨率,这可能不够。
教科书中没有实现此目的的方法,但一种方法是向 google 发送请求以获取 网站标题 +“图标”(例如"Facebook icon"), 并选择第一个结果。
至于网站的标题,如果您要查找进入网站时浏览器中显示的标题,则必须解析 html 以查找 <title> </title>
标记。
同时实现这两个目标可能具有挑战性,但这绝对不是不可能的。可能有某种服务可以提供这种服务,但据我所知不是。
你可以参考这个:"An NSURL extension for showing preview info of webpages" https://www.cocoacontrols.com/controls/urlpreview
func fetchPageInfo(completion: ((title: String?, description: String?, previewImage: String?) -> Void), failure: ((errorMessage: String) -> Void)) {
let request = NSMutableURLRequest(URL: self)
let newUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36"
request.setValue(newUserAgent, forHTTPHeaderField: "User-Agent")
ValidationQueue.queue.cancelAllOperations()
NSURLConnection.sendAsynchronousRequest(request, queue: ValidationQueue.queue, completionHandler: { (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
if error != nil {
dispatch_async(dispatch_get_main_queue(), {
failure(errorMessage: "Url receive no response")
})
return
}
if let urlResponse = response as? NSHTTPURLResponse {
if urlResponse.statusCode >= 200 && urlResponse.statusCode < 400 {
if let data = data {
if let doc = Kanna.HTML(html: data, encoding: NSUTF8StringEncoding) {
let title = doc.title
var description: String? = nil
var previewImage: String? = nil
print("title: \(title)")
if let nodes = doc.head?.xpath("//meta").enumerate() {
for node in nodes {
if node.element["property"]?.containsString("description") == true ||
node.element["name"] == "description" {
print("description: \(node.element["content"])")
description = node.element["content"]
}
if node.element["property"]?.containsString("image") == true &&
node.element["content"]?.containsString("http") == true {
previewImage = node.element["content"]
}
}
}
dispatch_async(dispatch_get_main_queue(), {
completion(title: title, description: description, previewImage: previewImage)
})
}
}
} else {
dispatch_async(dispatch_get_main_queue(), {
failure(errorMessage: "Url received \(urlResponse.statusCode) response")
})
return
}
}
})
}
我试过这个库,它适用于 youtube、flipkart。
https://github.com/myell0w/MTDURLPreview
[MTDURLPreview loadPreviewWithURL:[NSURL URLWithString:@"http://www.flipkart.com"] completion:^(MTDURLPreview *preview, NSError *error) {
}];
Printing description of preview->_title:
Online Shopping India | Buy Mobiles, Electronics, Appliances, Clothing and More Online at Flipkart.com
Printing description of preview->_domain:
www.flipkart.com
Printing description of preview->_imageURL:
http://img1a.flixcart.com/www/promos/new/20160701_015447_730x300_monsoon.jpg
URLEmbeddedView写在Swift,但你可以在Objective-C.
中使用This 是 Objective-C 示例代码。请查收。
#import <URLEmbeddedView/URLEmbeddedView-Swift.h>
#import <MisterFusion/MisterFusion-Swift.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (strong, nonatomic) URLEmbeddedView *embeddedView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.textView.text = @"https://github.com/";
[OGDataProvider sharedInstance].updateInterval = [NSNumber days:10];
self.embeddedView = [[URLEmbeddedView alloc] initWithUrl:@""];
[self.containerView addLayoutSubview:self.embeddedView andConstraints:@[
self.embeddedView.Top,
self.embeddedView.Right,
self.embeddedView.Left,
self.embeddedView.Bottom
]];
}
- (IBAction)didTapFetchButton:(id)sender {
[self.embeddedView loadURL:self.textView.text completion:nil];
}
@end