2012-09-19 28 views
11

Tôi đang cố gắng để nhúng một bản xem trước liên kết trong ứng dụng iOS trong cùng một cách mà Facebook không:Preview Embedded Liên kết trong ứng dụng iOS Giống như Facebook

enter image description here

Tôi đang cố gắng tìm một cách để lấy hình ảnh phù hợp nhất (và trả lại url cho nó), tiêu đề trang, và thậm chí có thể là một mô tả meta và chuyển nó trở lại ứng dụng, nhưng tôi không chắc chắn về cách tốt nhất.

Có API làm điều này, hầu hết cho một mức giá, nhưng có vẻ như nó không phải là điều này khó khăn. Có suy nghĩ gì không?

+4

Các bạn đã thử _anything_? – Abizern

+0

tốt, tôi đã xây dựng một bản xem trước liên kết rất cơ bản trong PHP để lấy dữ liệu nhất định từ một trang web cụ thể, nhưng nó khá thô – d2burke

+1

Bạn đã tìm thấy gì chưa? – Esqarrouth

Trả lời

3

Bạn có thể thực hiện phía máy chủ này hoặc phía máy khách.

Phía máy chủ, bạn có thể sử dụng tập lệnh (giống như tệp bạn đã tạo) để lấy thẻ <head> của trang HTML.

Phía máy khách, bạn có thể tải xuống toàn bộ trang dưới dạng HTML (ví dụ, Mashable là ~ 180KB) với NSURLConnection hoặc thư viện như AFNetworking và phân tích cú pháp bằng trình phân tích cú pháp XML để tìm thẻ <head>.

Tôi khuyên bạn nên tạo tập lệnh máy chủ để bạn có thể sử dụng lại nó trong các dự án khác hoặc các nền tảng khác.

+0

Có ai có bất kỳ mẫu liên quan đến xem trước liên kết này, tôi muốn sử dụng nó một trong các ứng dụng trò chuyện của tôi. Cảm ơn trước. –

+0

tôi muốn làm điều tương tự ... –

2

tôi sẽ cho cùng một mục tiêu và tôi đã làm điều đó trên các mặt hàng

tôi đã sử dụng những vỏ

pod 'HTMLReader' 
pod 'AFNetworking' 

Sau đó, tôi thừa hưởng từ AFHTTPResponseSerializer và trả về một đối tượng có chứa thông tin chi tiết liên kết

#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 

Đây là tiêu đề cho phản hồi của tôiSerializer

#import <AFNetworking/AFNetworking.h> 

@interface HTMLResponseSerializer : AFHTTPResponseSerializer 

@end 

và điều này là việc thực hiện cho responseSerializer tôi

#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 

Đừng quên để gán responseSerlializer để tùy chỉnh của bạn một

này làm việc cho tôi rất tốt

Các vấn đề liên quan