Расширение приложения iOS Build на основе существующего приложения. Как избежать дублирования кода?

У меня есть приложение для iOS, которое добавляет Sound FX к видео. Теперь я хочу создать целевое расширение приложения для поддержки имеющегося приложения Photo. Однако мне приходится дублировать почти все коды из приложения для iOS. И мое решение, которое у меня есть до сих пор, состоит в том, чтобы поместить общие функции в общие файлы и использовать их для обеих целей, потому что некоторые коды в приложении связаны с AppDelegate, и я не могу использовать его в расширении приложения. Есть ли лучший способ избежать дублирования кода в этом случае?

Еще один вопрос: большинство расширений, которые я видел в AppStore, имеют только 1 экран, есть ли какие-то правила для этого?

В моем приложении я должен позволить пользователям выбирать звуки из папки и библиотеки, и для этого требуется контроллер навигации. Но контроллер навигации нельзя использовать в расширении приложения, должен ли я создать свой собственный контроллер навигации или есть лучший способ?


person Hoang Trung    schedule 28.12.2016    source источник


Ответы (1)


Пока вам не нужно ориентироваться на iOS 7 или более раннюю версию, вы можете поместить общие классы в общую платформу и загрузить эту платформу из обеих целей. Это позволяет избежать наличия двух экземпляров кода на диске.

В качестве дополнительного бонуса, из-за того, как ОС обрабатывает загрузку общей библиотеки, все фактические кодовые страницы распределяются между приложением и расширением, поэтому вы также не тратите ОЗУ.

person dgatwood    schedule 28.12.2016
comment
Большинство моих классов — это View Controller, и в классах я ссылаюсь на App Delegate, который нельзя использовать в расширении приложения. - person Hoang Trung; 28.12.2016
comment
Одним из решений является добавление уровня абстракции. Например, вы можете создать одноэлементный класс, в котором будут храниться интересные данные, вместо того, чтобы хранить их в делегате приложения, или вы можете создать два класса с одинаковым именем — один в приложении, где вызов метода делает что-то в делегат приложения и еще один в расширении, чьи методы делают что-то другое. - person dgatwood; 28.12.2016
comment
Другой подход, если вам на самом деле не нужны некоторые функции в расширении, будет заключаться в слабой ссылке на класс делегата приложения, а затем проверить, является ли сам класс нулевым, и если это так, вы работаете в расширении, и вы пропускаете рассматриваемое поведение. - person dgatwood; 28.12.2016
comment
Но наиболее распространенный подход заключается в том, чтобы включить только те части, которые действительно являются общими в этой общей структуре, и добавить оставшиеся методы (вещи, которые зависят от делегата приложения) с использованием категорий (или расширений в Swift). - person dgatwood; 28.12.2016
comment
Не могли бы вы объяснить, как это сделать: было бы слабой ссылкой на класс делегата приложения, а затем проверить, является ли сам класс нулевым, - person Hoang Trung; 28.12.2016
comment
Прочитайте этот документ Apple: developer.apple.com /библиотека/контент/документация/MacOSX/ - person dgatwood; 28.12.2016
comment
Спасибо. Позволь мне проверить. Другой вопрос: я использую аналитическую структуру MixPanel (какао-боб), и в своем коде она ссылается на App Delegate, что мне нужно сделать, чтобы она работала в App Extension? - person Hoang Trung; 28.12.2016
comment
Вам также придется изменить его код, чтобы использовать какой-либо другой класс в отсутствие делегата приложения. - person dgatwood; 28.12.2016