Получить выделенный текст в Safari и использовать его в расширении действия

Я делаю расширение действия для сафари, и мне нужно получить выделенный текст для использования внутри расширения.

Обычно в iOS я использую этот код для получения выделенного текста в веб-просмотре.

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

Но внутри расширения я не знаю, как мне быть!

Для полноты это должно быть расширение с IU, и я просто включил NSExtensionActivationSupportsWebURLWithMaxCount, чтобы сделать расширение доступным в Safari.

заранее спасибо


person Ragazzetto    schedule 07.12.2014    source источник


Ответы (2)


Как объясняет Apple в своем Руководство по программированию расширения приложения, вам необходимо включить файл JavaScript в расширение, чтобы выполнить любую предварительную обработку. Результаты этой предварительной обработки доступны через NSExtensionItem в расширении.

Простой пример этого файла включен в мой проект Демонстрация расширения iOS на GitHub и выглядит следующим образом:

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;

Это просто извлекает различные сведения о текущей странице и передает их completionFunction. Переменная ExtensionPreprocessingJS в конце — это хук, который ищет фреймворк расширения.

В расширении вы можете получить эти значения в словаре, запросив элемент типа 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...
person Tom Harrington    schedule 11.12.2014
comment
Большой !! Ваш проект невероятно всеобъемлющий и заставил меня решить мою проблему !! Большое спасибо !! - person Ragazzetto; 12.12.2014
comment
@Tom Привет, я пытался извлечь document.body, но это не работает. Я пытаюсь получить снимок экрана. Подскажите, заранее спасибо. - person William Ku; 15.10.2015
comment
@WilliamKu не работает, не имеет никакой информации о том, какие у вас проблемы. Если у вас возникли проблемы, опубликуйте новый вопрос с некоторыми подробностями. - person Tom Harrington; 15.10.2015
comment
Привет, @TomHarrington, мой вопрос находится по адресу Сделайте скриншот хоста приложение, использующее расширения общего доступа/действия iOS? - person William Ku; 15.10.2015

Вам может потребоваться выполнить файл .js для выполнения этой операции.

Я предлагаю вам обратиться к этому учебнику по расширению, он почти соответствует вашим требованиям.

person HarshIT    schedule 10.12.2014
comment
Спасибо HarshIT за ссылку! Учебник также очень хорошо работает как расширение без пользовательского интерфейса, но у меня возникают проблемы с запуском расширений файлов js с пользовательским интерфейсом, в конечном итоге я не могу установить текст UITextView внутри интерфейса расширения! Есть ли у вас какие-либо предложения? - person Ragazzetto; 12.12.2014
comment
В том же учебнике есть функция itemLoadCompletedWithPreprocessingResults в этой функции; см. строку №. 25 -> переменная text имеет значение выбранного текста из java-скрипта. Таким образом, вы можете использовать эту переменную для назначения в вашем TextView... - person HarshIT; 12.12.2014