Как отладить приложение iOS при открытии из TodayExtension с помощью openUrl? - PullRequest
0 голосов
/ 05 января 2020

У меня есть мини-приложение с расширением Today, и я создал собственную схему URL. Затем, щелкнув UIB-кнопку в расширении, я вызвал функцию open, например

extensionContext?.open(URL(string: "todayextensionexample://inform")!, completionHandler: nil)

Приложение успешно запустилось, но я не могу его отладить.

Я пробую 3 разных подхода.

Прежде всего для открытой отладки Edit Scheme -> Info -> Wait for executable to be launched для запуска исполняемого файла в схеме приложения, но приложение ожидает и не запускается, поэтому нет отладки.

Моя (open url: URL) функция как показано ниже:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

    NotificationCenter.default.post(name: NSNotification.Name.urlOpenedNotification, object: nil, userInfo: nil)

    return true

}

в методе viewDidLoad ViewController;

override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(notificationHandler(_:)), name: NSNotification.Name.urlOpenedNotification, object: nil)

    }

Это был мой второй подход.

3. Подход состоит в том, чтобы использовать синтаксический анализ параметров URL и регистрировать его, как показано ниже:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {


let sendingAppID = options[.sourceApplication];
print("source application = \(sendingAppID ?? "Unknown") ")

guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true),
    let path = components.path,
    let params = components.queryItems else {
        print("Invalid URL or album path missing")
        return false
}



print("components > ", components)
print("path > ", path)
print("params >", params)

var param: [String: Any] = ["components": components, "path": path, "params": params];

NotificationCenter.default.post(name: NSNotification.Name.urlOpenedNotification,
                                object: nil,
                                userInfo: param)


return true
}

В подходе 3. я попытался уведомить и напечатать некоторые переменные.

Перед моими вопросами; Я изменяю некоторые из print() на NSLog(), но в Device -> Show Logs ничего не работает.

Приложение открылось с openUrl, но я не могу отладить его, потому что, если я запускаю целевое приложение TodayExtension не отлаживать и другие, если я запускаю цель приложения, когда я нажимаю кнопку TodayExtension, затем снова открываю приложение, когда функция фона

func application(_ app: UIApplication, open url: URL ...)

не работает. Я видел отладки реального устройства, но там ничего не видно.

Есть ли способ, после нажатия кнопки на расширении Today, тогда Xcode запустил цель основного приложения, и я смогу увидеть все из журналов?

Как я могу отладить его и проверить, успешно ли он работает?

1 Ответ

1 голос
/ 06 января 2020

1) Переопределите инициализатор в вашем делегате приложения и добавьте туда спящий вызов.

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    override init() {
        sleep(10000)
    }
    ...
}

2) Установите это приложение на ваше устройство или симулятор.

3) Установите точку останова в вашем коде.

4) С внутреннего номера активируйте глубокую ссылку.

5) Когда приложение открыто и находится в спящем режиме, подключите отладчик Xcode к своему приложению через меню приложения Xcode (Debug -> Attach To Process -> < your app name >). Это мгновенно разбудит ваше приложение, и оно сразу же попадет в точку останова.

...