Удаление одного конкретного пользовательского скрипта из WKUserContentController

#javascript #ios #iphone #wkwebview #wkuserscript

#javascript #iOS #iPhone #wkwebview #wkuserscript

Вопрос:

Я использую addUserScript () для добавления пользовательского скрипта в WKUserContentController моего WKWebView. Я заметил, что даже при вызове loadRequest() скрипт остается неизменным.

Для определенных вариантов использования мне может потребоваться удалить определенные скрипты и добавить другие. Однако, похоже, что единственный способ удалить скрипты — это removeAllUserScripts(). Это очень неудобно, поскольку означает, что мне пришлось бы удалить все скрипты, а затем повторно добавить обратно те, которые я хотел сохранить.

Если кто-нибудь знает какой-либо способ удалить конкретный скрипт (по имени, дескриптору и т.д.), Пожалуйста, дайте мне знать.

Ответ №1:

Я не думаю, что «удаление скрипта» является чем-то возможным (или даже значимым, если я правильно понимаю ваш вопрос).

«Скрипт» — это просто текст, который используется для предоставления среде Javascript определений элементов, таких как переменные, функции и т.д… Два скрипта вполне могут переопределять друг друга (например, определять одну и ту же функцию foo()), поэтому в зависимости от порядка, в котором вы их загрузили, у вас будет другая конечная среда (у вас есть только определение foo () последнего загруженного скрипта). Итак, что бы означало «удалить скрипт» в этом случае?

Если вы действительно хотите избавиться от элементов вашей среды Javascript, вы всегда можете переопределить их на что-то, что ничего не делает (например, переопределите foo() на {}). Но я думаю, что самый простой способ — просто больше не использовать foo () .

Комментарии:

1. Это возможно. Apple уже предоставляет функцию для удаления всех пользовательских скриптов: removeAllUserScripts. Я пытаюсь сделать это для одного скрипта, чтобы не мешать другим скриптам, которые могли быть добавлены.

Ответ №2:

Вы можете попробовать что-то вроде этого:

 -(bool)removeUserScriptByValue:(nonnull NSString*)scriptValue{
    bool retVal = false;
    NSMutableArray<WKUserScript*>* userscripts = [NSMutableArray arrayWithArray:self.configuration.userContentController.userScripts];
    for(int i=0; i<userscripts.count; i  ){
        WKUserScript* userScript = [userscripts objectAtIndex:i];
        if([userScript.source rangeOfString:scriptValue].location != NSNotFound){
            retVal = true;
            [userscripts removeObjectAtIndex:i];
            break;
        }
    }
    if(retVal){
        [self.configuration.userContentController removeAllUserScripts];
        for(WKUserScript* script in userscripts)
            [self.configuration.userContentController addUserScript:script];
    }
    return retVal;
}