Автоматическое открытие отладчика Safari при запуске симулятора iPhone
веб-отладчик iOS в Safari-это колени пчелы, но он закрывается каждый раз, когда симулятор перезапускается. Не только раздражает повторно открывать его из меню после каждой сборки, но и усложняет отладку любого поведения, которое происходит во время запуска.
есть ли способ настроить триггер в Xcode для автоматического открытия отладчика Safari после каждой сборки или, возможно, способ создания сценария оболочки или действия автомата для выполнения сборки и немедленного открытия отладчик?
5 ответов
это частичное решение. Это открывает окно отладки Safari одним щелчком мыши, что намного лучше, но не автоматически.
открыть Script Editor
на вашем mac (команда + пробел и введите редактор скриптов)
вставить в этот код:
-- `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's 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's 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)'s ¬
(menu bar 1)'s (menu bar item topMenu)'s (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's length > 1 then set r to (items 2 through (mList's length) of mList)
-- either actually click the menu item, or recurse again
tell application "System Events"
if mList's length is 1 then
click parentObject's menu item f
else
my menu_click_recurse(r, (parentObject's (menu item f)'s (menu f)))
end if
end tell
end menu_click_recurse
menu_click({"Safari", "Develop", "Simulator", "index.html"})
после открытия симулятора нажмите "Выполнить сценарий" (возможно, Вам потребуется разрешить редактор сценариев в настройках в первый раз).
(необязательно) вы можете сохранить скрипты в качестве приложения, чтобы вам не обязательно открывать редактор сценариев.
здесь вопрос, который должен быть отмечен дубликат это описывает использование setTimeout (), чтобы дать вам достаточно времени, чтобы переключить окна на Safari и установить точку останова.
что-то вроде этого, где startMyApp является функцией начальной загрузки вашего приложения:
setTimeout(function () {
startMyApp();
}, 20000);
Это супер гетто, но работает. Я подала запрос через http://www.apple.com/feedback/safari.html Слишком, чтобы закрыть петлю.
расширяя ответ @ 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
ошибка добавить следующее расширение (из этого так ответ)
extension UIAlertController {
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait
}
public override func shouldAutorotate() -> Bool {
return false
}
}
комбинируя ответ Тома с моим решением, сначала сделайте следующее:
- создать приложение, как Том описывает выше
- в "Системные настройки - > безопасность и конфиденциальность - > конфиденциальность - > доступность" добавьте новый скрипт 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 / на соответствующий путь к месту сохранения скрипта.