我試圖嵌入在以同樣的方式在iOS應用程序,Facebook並鏈接預覽:預覽嵌入式鏈接Facebook一樣
我試圖找出一種方法來抓取最合適的圖像(並將網址返回給它),頁面標題,甚至是元描述,然後將其傳遞迴應用程序,但我不確定最佳方式。
有API可以做到這一點,大部分是爲了價格,但它似乎不應該是這麼難。有什麼想法嗎?
我試圖嵌入在以同樣的方式在iOS應用程序,Facebook並鏈接預覽:預覽嵌入式鏈接Facebook一樣
我試圖找出一種方法來抓取最合適的圖像(並將網址返回給它),頁面標題,甚至是元描述,然後將其傳遞迴應用程序,但我不確定最佳方式。
有API可以做到這一點,大部分是爲了價格,但它似乎不應該是這麼難。有什麼想法嗎?
你可以做這個服務器端或客戶端。
服務器端,您可以使用腳本(如您創建的腳本)來獲取HTML頁面的<head>
標記。
客戶端可以使用NSURLConnection或類似AFNetworking的庫以HTML格式(例如Mashable爲〜180KB)下載整個頁面,並使用XML解析器解析它以查找<head>
標籤。
我建議您創建一個服務器腳本,以便您可以在其他項目或其他平臺中重複使用它。
有沒有人有任何與此鏈接預覽相關的示例,我想使用它的一個我的聊天應用程序。提前致謝。 –
我想做同樣的事情... –
我去同一個目標,我做到了在客戶端
我用這些吊艙
pod 'HTMLReader'
pod 'AFNetworking'
然後我從AFHTTPResponseSerializer
繼承並返回一個包含鏈接的詳細信息的對象
#import <UIKit/UIKit.h>
@interface LinkDetails : NSObject
@property (nonatomic,strong) NSString *linkURL;
@property (nonatomic,strong) NSString *linkHOST;
@property (nonatomic,strong) NSString *linkTitle;
@property (nonatomic,strong) NSString *linkDescription;
@property (nonatomic,strong) NSString *linkWebSiteName;
@property (nonatomic,strong) NSString *linkImageUrl;
@property (nonatomic,strong) UIImage *linkImage;
@end
這是我的回覆標題序列化器
#import <AFNetworking/AFNetworking.h>
@interface HTMLResponseSerializer : AFHTTPResponseSerializer
@end
,這是實現我responseSerializer
#import "HTMLResponseSerializer.h"
#import <HTMLReader/HTMLReader.h>
#import "LinkDetails.h"
@implementation HTMLResponseSerializer
-(id)responseObjectForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing _Nullable *)error{
NSString *responseStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
LinkDetails *details = [[LinkDetails alloc] init];
HTMLDocument *document = [HTMLDocument documentWithString:responseStr];
NSArray *metaTags = [document nodesMatchingSelector:@"meta"];
for (HTMLElement *metaTag in metaTags) {
if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:url"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:url"]) {
NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]);
details.linkURL = [[metaTag attributes] objectForKey:@"content"];
}
if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:title"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:title"]) {
NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]);
details.linkTitle = [[metaTag attributes] objectForKey:@"content"];
}
if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:description"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:description"]) {
NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]);
details.linkDescription = [[metaTag attributes] objectForKey:@"content"];
}
if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:image"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:image"]) {
NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]);
details.linkImageUrl = [[metaTag attributes] objectForKey:@"content"];
}
if ([[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"og:site_name"] || [[[metaTag attributes] objectForKey:@"property"] isEqualToString:@"twitter:site_name"]) {
NSLog(@"%@",[[metaTag attributes] objectForKey:@"content"]);
details.linkWebSiteName = [[metaTag attributes] objectForKey:@"content"];
}
}
if(!details.linkTitle){
details.linkTitle = [document firstNodeMatchingSelector:@"title"].textContent;
}
if(!details.linkDescription){
details.linkTitle = [document firstNodeMatchingSelector:@"description"].textContent;
}
if (!details.linkHOST) {
details.linkHOST = [response.URL host];
}
if (!details.linkURL) {
details.linkURL = [response.URL absoluteString];
}
return details;
}
@end
不要忘記responseSerlializer分配給您的自定義一個
這個工作對我非常好
你試過_anything_? – Abizern
嗯,我在PHP中構建了一個非常基礎的鏈接預覽,它從給定的網頁中抽取某些數據,但這很粗糙 – d2burke
你有什麼發現? – Esqarrouth