Использование LSApplicationWorkspace в Swift

Я добавил MobileCoreServices.framework в свой проект Xcode, и оператор import MobileCoreServices находится вверху моего файла.

У меня есть строка кода

let test = LSApplicationWorkspace.defaultWorkSpace()

И xcode сказал Unresolved Identifier LSApplicationWorkspace

Я попытался очистить и перестроить проект. Любые идеи?


person blee908    schedule 04.03.2016    source источник
comment
Вы нашли способ получить LSApplicationWorkspace?   -  person DàChún    schedule 12.10.2016


Ответы (2)


Пункт 1: LSApplicationWorkspace — это частный API, поэтому, если вы используете его и загружаете свое приложение в магазин приложений, оно будет отклонено.

Пункт 2. Если у вас есть внутреннее приложение и вы все еще хотите использовать его в своем приложении, ниже приведен способ его использования.

  1. Добавьте MobileCoreServices Framework в свой пакет
  2. Создайте файл LSApplicationWorkspace.h с точно таким же кодом, как приведенный здесь "https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/MobileCoreServices.framework/LSApplicationWorkspace.h".
  3. Теперь добавьте этот файл LSApplicationWorkspace.h в свой пакет.
  4. Создайте соединительный заголовок для вашего быстрого приложения
  5. Добавьте #import "LSApplicationWorkspace.h" в свой соединительный заголовок
  6. Теперь добавьте import MobileCoreServices в свой текущий файл и добавьте свой код let test = LSApplicationWorkspace.defaultWorkSpace(), он будет работать нормально.

ПРИМЕЧАНИЕ. Для использования любого закрытого заголовка вы должны включить его файл .h в свой код. Вы можете найти любые частные заголовки, выполнив поиск «заголовки времени выполнения» в Google. Вы получите все заголовки времени выполнения. И чтобы включить этот заголовок в свой быстрый код, вам нужно пройти через bridging-header.

person Mehul Thakkar    schedule 04.11.2016
comment
Большое спасибо за эту документацию! Я следовал вашим инструкциям, но после создания LSApplicationWorkspace.h и импорта кода получаю несколько ошибок, говоря: Unknown type name, а затем, например: "LSInstallProgressDelegate". Я ничего не забыл? - person user3191334; 02.01.2017
comment
На самом деле приведенное выше описание предназначено для iOS 8. После iOS 8 многие вещи были обновлены ... и в настоящее время я не работаю над этим ... поэтому я думаю, что вам нужно больше копать и нужно больше исследований и разработок, чтобы узнать подробнее - person Mehul Thakkar; 02.01.2017
comment
В iOS 12 даже нет MobileCoreServices.framework. Есть идеи? - person Bagusflyer; 01.11.2018

Компилятор Swift сообщает вам, что не имеет представления о классе с именем LSApplicationWorkspace. Это связано с тем, что это частный класс, не описанный ни в каких заголовках, доступных вам как стороннему разработчику. Если вас поймают на использовании API LSApplicationWorkspace во время проверки в App Store, ваша заявка будет отклонена. Учитывая, что этот класс содержит API-интерфейсы, которые меняются между версиями ОС (в силу того, что они недокументированы и закрыты), и API-интерфейсы, которые по соображениям конфиденциальности недоступны сторонним разработчикам, использование его почти наверняка является действительно плохой идеей, даже если вы технически сделать это одним из следующих способов.

  1. Создайте файл карты частного модуля , куда вы импортируете заголовок, который вы каким-то образом получили для частной платформы, содержащей LSApplicationWorkspace. Этот способ вызова LSApplicationWorkspace (или любой другой метод, включающий использование заголовков для Mobile CoreServices, т. е. любой метод, кроме метода PerformSelector, упомянутого ниже) почти наверняка приведет к тому, что ваше приложение будет загружено из обзора App Store, потому что этот метод (в конечном счете) Вызовы методов C будут видны методам статического анализа, которые Apple запускает в вашем коде в рамках проверки App Store.

  2. Используйте NSClassFromString:

let LSApplicationWorkspace_class:AnyObject = NSClassFromString("LSApplicationWorkspace")! as AnyObject
let workspace = LSApplicationWorkspace_class.perform(NSSelectorFromString("defaultWorkspace"))! as AnyObject 

С помощью приведенного выше кода вы теперь получаете экземпляр LSApplicationWorkspace, с помощью которого вы можете выполнять код с помощью PerformSelector — если вы знаете, на какие селекторы он отвечает (… в конкретной версии операционной системы, на которой вы работаете). Опять же, делать что-либо с LSApplicationWorkspace, вероятно, плохая идея.

person mz2    schedule 30.10.2016