Автоматически откройте Safari Debugger при запуске iPhone Simulator - программирование
Подтвердить что ты не робот

Автоматически откройте Safari Debugger при запуске iPhone Simulator

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

Есть ли способ настроить триггер в Xcode для автоматического открытия отладчика Safari после каждой сборки или, возможно, для создания оболочки script или действия Automator для сборки и немедленного открытия отладчика?

4b9b3361

Ответ 1

Это частичное решение. Это открывает окно отладки Safari одним щелчком мыши, который намного лучше, но не автоматический.

Откройте Script Editor на вашем mac (Command + Space Bar и введите Script Editor)

Вставить в этот код:

-- `menu_click`, by Jacob Rus, September 2006
-- 
-- Accepts a list of form: `{"Finder", "View", "Arrange By", "Date"}`
-- Execute the specified menu item.  In this case, assuming the Finder 
-- is the active application, arranging the frontmost folder by date.

on menu_click(mList)
    local appName, topMenu, r

    -- Validate our input
    if mList length < 3 then error "Menu list is not long enough"

    -- Set these variables for clarity and brevity later on
    set {appName, topMenu} to (items 1 through 2 of mList)
    set r to (items 3 through (mList length) of mList)

    -- This overly-long line calls the menu_recurse function with
    -- two arguments: r, and a reference to the top-level menu
    tell application "System Events" to my menu_click_recurse(r, ((process appName) ¬
        (menu bar 1) (menu bar item topMenu) (menu topMenu)))
end menu_click

on menu_click_recurse(mList, parentObject)
    local f, r

    -- `f` = first item, `r` = rest of items
    set f to item 1 of mList
    if mList length > 1 then set r to (items 2 through (mList length) of mList)

    -- either actually click the menu item, or recurse again
    tell application "System Events"
        if mList length is 1 then
            click parentObject menu item f
        else
            my menu_click_recurse(r, (parentObject (menu item f) (menu f)))
        end if
    end tell
end menu_click_recurse

menu_click({"Safari", "Develop", "Simulator", "index.html"})

Как только симулятор откроется, запустите на своем Script (возможно, вам придется разрешить редактор Script в настройках в первый раз).

(Необязательно) Вы можете сохранить свои сценарии в качестве приложения, чтобы не открывать редактор Script.

Ответ 2

Существует вопрос который должен быть помечен как дубликат, который описывает использование setTimeout(), чтобы предоставить вам достаточно времени для переключения окон на Safari и установки точки останова.

Что-то вроде этого, где startMyApp - это функция начальной загрузки вашего приложения:

setTimeout(function () {
  startMyApp();
}, 20000);

Это супер гетто, но работает. Я отправил запрос функции через http://www.apple.com/feedback/safari.html, чтобы закрыть цикл.

Ответ 3

Расширение ответа @Prisoner, если вы используете WKWebView, вы можете:

    let contentController:WKUserContentController = WKUserContentController()


    let pauseForDebugScript = WKUserScript(source: "window.alert(\"Go, turn on Inspector, I'll hold them back!\")",
                                           injectionTime: WKUserScriptInjectionTime.AtDocumentStart,
                                           forMainFrameOnly: true)
    contentController.addUserScript(pauseForDebugScript)

    let config = WKWebViewConfiguration()
    config.userContentController = contentController
    //Init browser with configuration (our injected script)
    browser = WKWebView(frame: CGRect(x:0, y:0, width: view.frame.width, height: containerView.frame.height), configuration:config)

также важно реализовать обработчик предупреждений из протокола WKUIDelegate

//MARK: WKUIDelegate
func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String,
             initiatedByFrame frame: WKFrameInfo, completionHandler: () -> Void) {

    let alertController = UIAlertController(title: message, message: nil,
                                            preferredStyle: UIAlertControllerStyle.Alert);

    alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel) {
        _ in completionHandler()}
    );

    self.presentViewController(alertController, animated: true, completion: {});
}

и одна мелочь на всякий случай, если вы можете иметь ошибку UIAlertController:supportedInterfaceOrientations was invoked recursively добавить следующее расширение (От этого SO-ответа)

extension UIAlertController {     
    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
    public override func shouldAutorotate() -> Bool {
        return false
    }
}

Ответ 4

Объединяя Tom с моим решением, сначала сделайте следующее:

  • Создайте приложение, описанное выше.
  • В разделе "Системные настройки → Безопасность и конфиденциальность → Конфиденциальность → Доступность" добавьте новый Script Applicaiton и убедитесь, что ему разрешено управлять вашим компьютером.

Теперь я использую cordova и из командной строки следующие сборки, запускает эмулятор и открывает панель отладки Safari:

cordova build ios; cordova emulate ios; open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app; sleep 1 ; open /PATH/TO/OpenDevelop.app/

Обязательно замените/PATH/TO/на соответствующий путь туда, где вы сохранили script.

Ответ 5

Humm, я не думаю, что вы можете это сделать, но вы можете просто "CTRL + R" в веб-отладчике.