Доступ к вкладкам веб-браузера программно | Swift 3

#macos #google-chrome #safari #swift3 #macos-sierra

#macos #google-chrome #safari #swift3 #macos-sierra

Вопрос:

Можно ли получить доступ к открытым вкладкам Safari или Google Chrome? Подойдет URL-адрес или заголовок вкладки или оба?

Цель приложения затем пользователь может указать некоторые веб-сайты и добавить к ним ярлыки, и приложение будет измерять, сколько тратится на эти веб-сайты, приложение будет разрешено через доступность.

Ответ №1:

Используйте AppleScript для получения заголовка и URL-адреса каждой вкладки.

Вы можете использовать NSAppleScript в Swift для запуска AppleScript.

Пример (Safari)

 let myAppleScript = "set r to ""n"  
    "tell application "Safari"n"  
    "repeat with w in windowsn"  
    "if exists current tab of w thenn"  
    "repeat with t in tabs of wn"  
    "tell t to set r to r amp; "Title : " amp; name amp; ", URL : " amp; URL amp; linefeedn"  
    "end repeatn"  
    "end ifn"  
    "end repeatn"  
    "end telln"  
"return r"

var error: NSDictionary?
let scriptObject = NSAppleScript(source: myAppleScript)
if let output: NSAppleEventDescriptor = scriptObject?.executeAndReturnError(amp;error) {
    let titlesAndURLs = output.stringValue!
    print(titlesAndURLs)
} else if (error != nil) {
    print("error: (error)")
}
  

AppleScript возвращает строку, например:

 Title : the title of the first tab, URL : the url of the first tab
Title : the title of the second tab, URL : the url of the second tab
Title : the title of the third tab, URL : the url of the third tab
....
  

Пример (Google Chrome)

 let myAppleScript = "set r to ""n"  
    "tell application "Google Chrome"n"  
    "repeat with w in windowsn"  
    "repeat with t in tabs of wn"  
    "tell t to set r to r amp; "Title : " amp; title amp; ", URL : " amp; URL amp; linefeedn"  
    "end repeatn"  
    "end repeatn"  
    "end telln"  
"return r"
var error: NSDictionary?
let scriptObject = NSAppleScript(source: myAppleScript)
if let output: NSAppleEventDescriptor = scriptObject?.executeAndReturnError(amp;error) {
    let titlesAndURLs = output.stringValue!
    print(titlesAndURLs)
} else if (error != nil) {
    print("error: (error)")
}
  

Обновить:

Вот AppleScript с комментариями.

Вы можете запустить его в приложении «Редактор сценариев«.

 set r to "" -- an empty variable for appending a string
tell application "Safari"
    repeat with w in windows -- loop for each window, w is a variable which contain the window object
        if exists current tab of w then --  is a valid browser window
            repeat with t in tabs of w -- loop for each tab of this window, , t is a variable which contain the tab object
                -- get the title (name) of this tab and get the url of this tab
                tell t to set r to r amp; "Title : " amp; name amp; ", URL : " amp; URL amp; linefeed -- append a line to the variable (r)
                (*
                 'linefeed'  mean a line break
                 'tell t' mean a tab of w (window)
                 'amp;'  is for  concatenate strings, same as the   operator in Swift
                *)
            end repeat
        end if
    end repeat
end tell
return r -- return the string (each line contains a title and an URL)
  

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

1. Это здорово! Не могли бы вы дать мне небольшое объяснение кода, какая часть делает то, что …?

2. Я добавляю объяснения в свой ответ