Избранное Все заметки GitHub icon Мой Github Обо мне
22 заметки с тегом

ios

Unity Mobile Input

Выложил на Github плагин нативного ввода для мобильных устройств. Это небольшая надстройка над стандартным Unity InputField UI. Работает на iOS и Android.

Зачем он нужен:

  1. Нативное поле ввода и клавиатура
  2. Отсутствует раздражающее дополнительное поле над клавиатурой в Android
  3. Для iOS можно добавить кнопку «Готово»
  4. Настройка кнопки Return для клавиатуры: стандартная, далее, готово, поиск
  5. Для работы нужно просто повестить скрипт MobileInput на родной InputField UI

До этого, было временное решение, которое не обладало необходимыми опциями, да и ошибки были. Собственно, на то оно и временное :) Но в Unity до сих пор нет таких возможностей для ввода, поэтому пришлось сделать такой плагин.

В моей версии исправлены ошибки и отрефакторен почти весь код от старого и неподдерживаемого плагина UnityNativeEdit.

Исходники на Github

10 апреля   android   git   ios   plugin   unity   интерфейс   проекты

Как добавить фреймворк в секцию Embedded в XCode

Этой возможности не было до Unity 2017. Надо было вручную или сторонними средствами после билда проекта добавлять нужные фреймворки. ORLY?
Теперь же, с помощью AddCopyFilesBuildPhase это сделать можно. Последний параметр говорит об этом:

The «subfolder spec». The following usages are known: «10» for embedding frameworks; «13» for embedding app extension content; «16» for embedding watch content.

Готовый пример

А ещё можно подключить UnityEditor.iOS.Xcode.Extensions и использовать AddFileToEmbedFrameworks.

Но, они до сих пор так и сделали возможность добавлять нужные локализации в XCode проект... :(

2018   ios   iphone   unity

iPhone X & Edge Protection

С выходом iPhone X и отказом от физической кнопки Home, Apple доставила некоторые неудобства разработчикам. И хотя для нативных приложений всё прошло более-менее гладко (неадаптированные приложения просто получили черные рамки), то для других — пришлось делать оптимизацию.

Так, в одной из наших игр на Unity, расположение элементов управления находилось в самом нижу экрана, его нужно было поднять вверх, чтобы не задевал Home Indicator. Собственно, с этим никаких проблем не возникло.

Но почему-то в тестах на iPhone 7 с установленной iOS 11.1.1, приложение стало вести себя как-будто это iPhone X — на нижних и верхних гранях экрана перестал работать тач, точнее, он срабатывал, но некорректно. Видимо это баг iOS или Unity, пока не разобрался, но исправить надо было.


Оказывается, можно скрыть Home Indicator и включить т. н. Edge Protection. Это когда первый свайп показывает Home Indicator, а второй скрывает приложение. Пока из коробки Unity не умеет так делать, пишут что в одном из следующих обновлений добавят. Кто на старых версиях 5.5+ (как я), нужно патчить XCode проект. Как это сделать, я уже писал. Раз, два.

Чтобы включить Edge Protection нужно добавить пару строчек кода в два файла:

// UnityViewControllerBaseiOS.h
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures; 

// UnityViewControllerBaseiOS.mm
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}

Ветка на форуме Unity
Статья на Medium

2017   ios   iphone   разработка

ARKit и Unity

ARKit от Apple сделал то, что не смог Google в своё время. Хотя все эти технологии уже несколько лет как известны и работают, Apple смогли всё это упаковать, выдать за инновацию (их!) и красиво продать — как обычно.

И я думаю, что будущее как раз за дополненной реальностью (AR), а не за виртуальной (VR). Потому что AR позволяет взаимодействовать с реальным миром: обучаться рисованию/медицине, управлять каким-нибудь девайсом, делать путешествия и экскурсии более интерактивными, и т. д.


Чтобы проверить ARKit на Unity, потестить демки и сделать что-то своё, вам потребуется:

  • iPhone 6S+ с iOS 11
  • Unity 5.6+
  • плагин ARKit
  • скорее всего обновить XCode, потому что старый не даст запустить приложение на iOS 11

Плагин кстати опенсорсный, можно посмотреть внутренности и поразбираться как всё устроено. В ветке на форуме можно спросить совета или узнать про последний апдейты.

Ну и несколько видео, что можно сделать с помощью ARKit.

2017   ar   ios   unity   ссылки

Отправка письма из Unity

Ничего особенного конечно, ничем не отличается от самого обычного плагина для iOS или Android, но кто-то у меня спрашивал про это.
Весь код умещается на одном экране, дольше демку делал :)

Исходники на Github

Вообще, надо бы собрать все плагины, мелочуху и выложить на гитхаб: синхронизация с iCloud, in-app покупки (не доверяю я Unity IAP :), буфер обмена, получение изображения с камеры и галереи, сохранение в галерею, push уведомления, запись в keychain, авторизация через Google Sign-in, встроенный браузер и прочее.
Если что-то заинтересовало — пишите в комменты или mail@mopsicus.ru.

2017   android   git   ios   plugin   unity

Работа в фоне в iOS и Unity

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

-(void) startTask {
    [self endTask];
    if (bgTask == UIBackgroundTaskInvalid) {
        bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            [[UIApplication sharedApplication] endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }];
    }
}

- (void) endTask {
    if (bgTask != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }
    [UIApplication sharedApplication].idleTimerDisabled = NO;
}

А в Unity это вызывается на OnApplicationFocus:

void OnApplicationFocus (bool focusStatus) {								
    if (focusStatus) 
        Background.StopTask();
    else 
        Background.StartTask();
}

Ссылка на Github

2017   git   ios   plugin   unity   разработка

Решение проблемы с 3DTouch в Unity

Обновлено 24.07.2017

В Unity, даже в последних версиях есть баг с 3DTouch (Force Touch) в iOS. Заключается он в том, что левый край дисплея плохо реагирует на нажатия, если 3DTouch включен. Если его выключить — все работает как должно. В трекере этот баг есть и пока он не исправлен.

К сожалению, программно отключить 3DTouch для приложения нельзя. Хотя было бы неплохо... Но временное решение этой проблемы есть! Нужно немного «пропатчить» xCode проект.

Мы добавим обработчик тачей, который срабатывает и с включенным 3DTouch, в нем будем определять край экрана и «прокидывать» дальше начало нажатия (touchesBegan). Да, решение немного костыльное, но другого пока не нашел.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([[self traitCollection] forceTouchCapability] == UIForceTouchCapabilityAvailable) {
        CGPoint point= [touch locationInView:touch.view];
        if (point.x < 35) { // <-- тут коэффициент можно поправить
            NSSet *set = [NSSet setWithObjects:touch, nil];
            UnitySendTouchesBegin(set, NULL);
        }
    }
}

На гитхаб выложил скрипт, который автоматически патчит нужные файлы после билда. Проверен в версии 5.5.3f1.

Ссылка на Github

2017   ios   unity   разработка

Запуск билда Unity в симуляторе iOS

Если у вас возникли проблемы с запуском билда в симуляторе iOS, в то время как на устройстве и редакторе все работает — следует проверить пару моментов:

  • Если у вас есть нативные плагины, которые используют сервисы недоступные в симуляторе (in-app, push, keychain, etc) — их нужно отключить/закомментировать.
  • Возможно, вы забыли поменять Target SDK при компиляции на Simulator SDK.
  • А еще, Unity мог неправильно выставить Build Settings в xCode проекте и их нужно поправить вручную, например так:

После этого, все должно заработать ;)

2017   ios   unity   инструменты

Публикация тормозит на «Authenticating with the iTunes store»

Эта довольно распространенная «проблема» известная уже несколько лет! На stackoverflow предложено куча вариантов: от просто подождать (что кстати иногда работает), до смены WiFi сети, запуска одновременно нескольких Application Loader’ов и другого шаманства.

Столкнулся с этим делом дважды. Первый раз как-то само разрешилось — подождал около 5 минут, второй раз ничего не помогало. Гугл подсказал, что наиболее часто работающий метод — это удалить и заново загрузить iTunes Store’s Transporter.

Для этого в терминале выполняем следующие команды:

cd ~
mv .itmstransporter/ .old_itmstransporter/ // сохраняем предыдущую версию, на всякий случай
rm -rf ~/.itmstransporter/ // или удаляем если не нужен 
"/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/itms/bin/iTMSTransporter"

Нужно будет подождать немного, но после обновления, все сработало и загрузилось очень быстро.

2017   ios   инструменты

Unity, iOS и IPv6

С 1 июня 2016 года, все отсылаемые приложения в AppStore должны уметь работать по IPv6.

Unity вроде как решили все эти вопросы еще в прошлом году. Но если погуглить, то оказывается, что некоторые получают отказы до сих пор, по тем или иным причинам связанным с IPv6. Чтобы проверить работает ли ваше приложение в сетях IPv6, Apple написали специальную статью с мануалом. Я ей воспользовался и обнаружил, что приложение не коннектится к серверу :(

Для соединения используются сокеты, поэтому код был очень простой:

...
private Socket _socket;
 
public static void Connect () {
    _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    _socket.BeginConnect("134.253.17.11", 10001, new AsyncCallback(OnEndConnect), null);
}
 
void OnEndConnect (IAsyncResult iar) {
    Debug.Log ("connected");
}
...

Собственно, сразу стало понятно в чем проблема — AddressFamily должен быть InterNetworkV6 если работаем по IPv6 или InterNetwork для IPv4.

Если подключаться к серверу по домену, то можно воспользоваться таким решением — передаем хост, указываем тип, в ответ получает IPv6 или «обычный» IP адрес.

Если же подключение осуществляется по IP адресу, то преобразование с помощью различных конвертеров в IPv6 (раз, два), не дало работающего результата — сокет просто не подключался.

Ответ был найден в том самом мануале от Apple (смотрим на подраздел Use System APIs to Synthesize IPv6 Addresses) и на одном китайском сайте :) Если все это объединить, то получится более-менее универсальное решение которое будет работать и по IPv6, и по IPv4, в iOS и Android.

Исходник на Github

2017   git   ios   plugin   unity   разработка
Ранее Ctrl + ↓