2014-12-07 15 views
6

Tôi đang tạo tiện ích mở rộng hành động cho safari và tôi cần phải chọn văn bản được chọn để sử dụng bên trong tiện ích.Nhận văn bản đã chọn trong Safari và sử dụng nó trong tiện ích mở rộng hành động

Thông thường trong iOS tôi sử dụng mã này để có được những văn bản đã chọn trong một webview

selectedText.text = [WebView stringByEvaluatingJavaScriptFromString: @ "window.getSelection(). toString()"]; 

Nhưng bên trong phần mở rộng tôi không biết làm thế nào tôi có thể làm!

Để hoàn thành, nó phải là một phần mở rộng với IU và tôi vừa mới bật NSExtensionActivationSupportsWebURLWithMaxCount để làm cho tiện ích có sẵn trong Safari.

Cảm ơn trước

Trả lời

7

Vì Apple giải thích trong số App Extension Programming Guide của mình, bạn cần bao gồm tệp JavaScript trong phần mở rộng để thực hiện bất kỳ quá trình tiền xử lý nào. Kết quả của quá trình tiền xử lý đó có sẵn thông qua số NSExtensionItem trong phần mở rộng.

Một ví dụ đơn giản của tập tin này được bao gồm trong dự án iOS Extension Demo tôi tại GitHub và trông như thế này:

var MyPreprocessor = function() {}; 

MyPreprocessor.prototype = { 
    run: function(arguments) { 
     arguments.completionFunction({"URL": document.URL, "pageSource": document.documentElement.outerHTML, "title": document.title, "selection": window.getSelection().toString()}); 
    } 
}; 

var ExtensionPreprocessingJS = new MyPreprocessor; 

Đó chỉ đơn giản là chiết xuất chi tiết khác nhau về trang hiện tại và vượt qua họ để completionFunction. Các ExtensionPreprocessingJS var ở cuối là móc mà khung mở rộng tìm kiếm.

Trong phần mở rộng bạn có thể lấy các giá trị trong một cuốn từ điển bằng cách yêu cầu một mục kiểu kUTTypePropertyList:

for (NSExtensionItem *item in self.extensionContext.inputItems) { 
    for (NSItemProvider *itemProvider in item.attachments) { 
     if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePropertyList]) { 
      [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePropertyList options:nil completionHandler:^(NSDictionary *jsDict, NSError *error) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        NSDictionary *jsPreprocessingResults = jsDict[NSExtensionJavaScriptPreprocessingResultsKey]; 
        // Continue with data returned from JS... 
+0

Tuyệt vời !! Dự án của bạn vô cùng toàn diện và giúp tôi giải quyết vấn đề của mình !! Cảm ơn bạn rất nhiều !! – Ragazzetto

+0

@Tom Xin chào, tôi đã cố trích xuất document.body nhưng nó không hoạt động. Tôi đang cố gắng để có được một hình ảnh chụp màn hình. Xin vui lòng tư vấn, cảm ơn trước. –

+1

@WilliamKu "không hoạt động" không có bất kỳ thông tin nào về loại vấn đề bạn đang gặp phải. Nếu bạn gặp sự cố, hãy đăng câu hỏi mới với một số chi tiết. –

0

Bạn có thể cần phải thực thi tệp .js để thực hiện thao tác đó.

Tôi đề nghị bạn tham khảo Extension's Tutorial này, nó gần như tương tự như yêu cầu của bạn.

+0

Cảm ơn HarshIT cho liên kết! Hướng dẫn cũng hoạt động rất tốt dưới dạng tiện ích mở rộng không có giao diện người dùng nhưng tôi gặp sự cố khi chạy phần mở rộng tệp js với giao diện người dùng, cuối cùng tôi không thể đặt văn bản của UITextView bên trong giao diện tiện ích! Bạn có đề xuất nào không? – Ragazzetto

+0

Trên cùng một hướng dẫn có một hàm, "itemLoadCompletedWithPreprocessingResults", trong hàm đó; xem dòng số. 25 -> biến "văn bản" có giá trị của văn bản được chọn từ tập lệnh java. Vì vậy, bạn có thể sử dụng biến đó để gán trong TextView của bạn ... – HarshIT

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