Ответ 1
Я сосредоточен на том, как лучше всего использовать код между Android и iOS за последние несколько недель, и вот мои предложения, основанные на моем опыте:
a) В общем, вы можете делиться любыми вещами между платформами, которые не являются специфичными для платформы.
Я склонен использовать презентаторов или посредников, которые содержат ссылку на представление, которое определяется интерфейсом. Например, если бы у меня был вид входа в систему, у меня был бы мой iOS UIViewController и моя Android-активность реализовала бы интерфейс ILoginView. Этот интерфейс будет иметь следующие значения:
- Getters для имени пользователя и пароля
- Событие с именем LoginSubmitted
- Два метода ShowLoginFailed и GoNextScreen
Ведущий/медиатор будет отвечать за прослушивание входящего логина, получить имя пользователя/пароль и передать эти вещи на вызов или команду службы. Всякий раз, когда посредник получает результаты команды/службы, он будет отвечать за вызов ShowLoginFailed или GoNextScreen.
Я также использовал интерфейсы для определения моего SQLite Manager (https://github.com/praeclarum/sqlite-net/tree/master/src) или делегата, ответственного за создание веб-сайта Сервисный вызов API. Я обнаружил, что мне пришлось это сделать, потому что для диспетчера SQLite и RestSharp необходимо выполнить компиляцию конкретной платформы.
Короче говоря, интерфейсы - ваш друг, особенно когда вы связываете их с какой-то системой впрыскивания зависимостей.
b) Если вы хотите, чтобы ваш пользователь был запрошен с предупреждением, когда их устройство находится в спящем режиме или когда оно находится в другом приложении, я бы использовал AlarmManager для Android и LocalNotification для iOS.
c) Вы можете отчасти использовать PCL с Xamarin.Android и Xamarin.iOS. Проблема в том, что PCL не поддерживаются на 100%. Тем не менее, есть некоторые настройки, которые вы можете внести в среду своего разработчика, которая, надеюсь, доставит вас туда, где вы хотите:
-
Переключитесь на бета-канал или альфа-канал в Xamarin Studio: "Xamarin Studio" → "Проверить наличие обновлений" → Измените канал в поле со списком в левом верхнем углу появившегося диалогового окна → Выберите "Перезагрузка и установка обновлений". Это позволит вам иметь проекты Android и iOS, чтобы иметь возможность ссылаться на один и тот же PCL в одном и том же решении.
-
После обновления XS закройте XS и следуйте инструкциям в этом сообщении, чтобы изменить вашу Mono-установку, чтобы PCLs правильно скомпилировали: MonoDevelop: можно ли переключить компилятор PCL?
-
Чтобы получить подсказку кода, чтобы лучше играть в вашем проекте PCL, вам нужно захватить mscorlib.dll из вашей установки Mono и поместить ее в папку DLL в каталоге проекта и добавить ссылку на нее в ваш проект PCL. Вы можете найти здесь dll:/Library/Frameworks/Mono.framework/Versions/3.0.10/lib/mono/4.0
Как только вы все это сделали, вы должны быть в хорошей форме, чтобы ваш PCL работал. Я обнаружил, что это стоило дополнительной работы, поскольку теперь я могу создать проект Unit Test в XS, связать его с PCL и запустить тесты из среды IDE. Кроме того, я могу использовать библиотеки, такие как Moq, чтобы издеваться над моими представлениями и выполнять интеграционные тесты.
Xamarin обещает, что полная поддержка PCL будет "скоро", и нам не придется беспокоиться об этих хаках.