Ошибка при получении URL / пути приложения с использованием LSCopyApplicationURLsForBundleIdentifier и CFArrayGetValueAtIndex - PullRequest
0 голосов
/ 19 марта 2019

Я использую LSCopyApplicationURLsForBundleIdentifier для получения URL-адресов установленного стороннего приложения в целевой системе на основе идентификатора пакета. Однако при попытке получить первый URL-адрес из возвращенного CFArray я получаю следующую ошибку в отладчике по адресу CFArrayGetValueAtIndex:

Поток 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0)

Вот раздел моего кода Swift:

let urls = LSCopyApplicationURLsForBundleIdentifier("com.aa.bb" as CFString, nil)
if (urls != nil) {
     let url = unsafeBitCast(CFArrayGetValueAtIndex(urls as! CFArray, 0), to: CFString.self)
}
urls?.release()
url?.release()

Как правильно извлечь URL, желательно как String?

1 Ответ

1 голос
/ 19 марта 2019

Слишком сложно, возьмите pointee с takeRetainedValue() - который правильно обрабатывает управление памятью - и приведите его к [URL]

if let urls = LSCopyApplicationURLsForBundleIdentifier("com.aa.bb" as CFString, nil)?.takeRetainedValue() as? [URL],
   let url = urls.first {
     print(url)
}

unsafeBitCast от (CF)URL до (CF)String невозможно в любом случае, чтобы получить строковый путь, пишите

print(url.path)
...