Lync SDK 2013. Досвід розробки власного месенджера на основі Lync (Skype for Business)

Про що?

У цій статті я розповім про те, що пропонує нам компанія Microsoft у своєму Lync SDK для створення «красивих» інтерфейсів і нових можливостей для Lync-клієнта. Так само докладно зупинюся на взаємодії з Lync клієнтом у UI Suppression mode, з яким нам дуже щільно довелося мати справу в процесі розробки власного корпоративного месенджера на базі Skype for Business. І, найголовніше, постараюся докладно описати, з якими обмеженнями нам довелося зіткнутися.

З чого все почалося?

Навесні 2014-го року в нашій компанії народилася ідея створити корпоративний месенджер на основі Lync (тепер вже Skype for Business). Вірніше, спочатку мова про месенджері не йшла, ми просто допрацьовували Lync під себе для більш ефективної роботи. По суті, ми використовували Lync-клієнт в «штатному режимі», а наше додаток було просто доповненням для нього, яка керувала контактами. Воно дозволяло зручно розмістити свої обрані контакти по всій ширині екрану, що було зручно для роботи на десктопах, передбачала швидкий доступ до контактів та упорядочивало їх за групами. Додаток назвали EasyLy (від «Easy Lync») та розповсюдили серед «своїх».

Перша версія програми
Малюнок 1. Перша версія програми

Поступово в додаток додавалися нові функції. Наприклад, листуватися можна було як з Lync, так і з EasyLy, причому в останньому зберігалася історія листування. І в один епохальний день було прийнято рішення відмовитися від інтерфейсу Lync і реалізувати весь його функціонал самим, щоб слід Lync залишився тільки в диспетчері завдань. Тобто ми вирішили зробити свій власний, більш зручний месенджер для десктопів на базі Lync. І начебто все починалося добре.

Що ми хотіли отримати в результаті?

На початку одне з основних незручностей Lync для нас полягала у відсутності більш або менш адекватного механізму збереження і перегляду історії бесід. Lync, звичайно, зберігає (через певний час) свою історію в Outlook, але цим вкрай незручно користуватися. Крім цього, історія може взагалі не зберегтися, якщо, наприклад, закрити вікно з бесідою до того, як відбудеться збереження.

Що стосується usability, ми проповідували концепцію «One click» для економії часу користувача та підвищення ефективності його роботи і намагалися створити додаток максимально просте, зрозуміле і зручне для офісного працівника. Цільова група, яку ми виділили для себе, – це не модні «мобільні співробітники», що бігають зі смартфоном з «полів», а справжні офісні трудяги, які працюють по 8 годин за великим монітором, де все має бути ергономічно.

Крім з'явилася раніше вкладки «Вибране», з'явилися ідеї створити вкладку «Групи», «Діалоги», а також журнал дзвінків з коментарями, вікно проведення онлайн-зібрань, можливість відправити повідомлення офлайн-абоненту, інтеграція з календарями, OneDrive та багато інших цікавих функцій. Ми планували, не відкидаючи наявний функціонал Lync (а потім і Skype for Business), створити додаткову цінність для користувача за рахунок UI під десктопи, швидкого доступу до наявних функцій і створення нового корпоративного функціоналу.

Так виглядає EasyLy зараз
Малюнок 2. Так виглядає EasyLy зараз

Розробка

Перше, що було зроблено – вкладка «Favorites», де користувач міг розташувати всі свої контакти, та ще й сортувати їх по групах.

Ми приступили до роботи і реалізували цю ідею без особливих проблем за допомогою Lync SDK 2013. Всі контакти ми зробили у вигляді карток, на яких можна подивитися список зборів і зустрічей даного користувача, а також зателефонувати йому (аудіо — і відеодзвінки) або написати повідомлення. При натисканні на ці кнопки викликалося стандартне вікно розмови Lync.

Ікона контакту при наведенні
Малюнок 3. Іконка контакту при наведенні

Це було досить просто. Натхнені успіхом ми почали рухатися далі і повністю відмовилися від Lync UI (перевели Lync-клієнт UI Suppression mode). Це дало нам можливість відмовитися від стандартних вікон бесід, дзвінків (та й взагалі всіх вікон) і реалізувати весь базовий функціонал додатка самим.

Не буду розповідати про авторизацію користувача, опис можна знайти на тут. Розповім про нашу другу і найголовнішу вкладку «Dialogs», яку ми реалізовували майже рік.

Вкладка діалогів з включеним режимом мультичата
Малюнок 4. Вкладка діалогів з включеним режимом мультичата

Почали ми, як годиться, з розмов. Все йшло добре, але не дуже швидко, тому що, крім простої відправки і прийому повідомлень, потрібно було реалізувати typing, смайли, підтримку rtf-форматування і т. д. Реалізацію Lync IM Conversation можна взяти звідси.

Збереження повідомлень і записів про дзвінках ми реалізували на базі SQLite, якою користувач може гнучко управляти. Також ми запровадили підтримку кількох відкритих чатів (до 3-х) в одному вікні, для ще більш швидкісного спілкування з співробітниками.

Потім ми додали підтримку аудіо-, відеозв'язку, шарінга екрану і додатків. Додавання в бесіду підтримки Application Sharing довелося реалізовувати досить довго. У звичайному режимі Lync показ екрану відбувається в самій розмові, а в UI Suppression mode потрібно всі можливості шарінга реалізовувати самому з допомогою «линковского» контрола ApplicationSharingView, службовця для відображення расшариваемого ресурсу, яким для роботи потрібен handle батьківського вікна.

Ось короткий список того, що ми зробили для підтримки шарінга:
• Створили вікно для перегляду шарінга, реалізували перерисовывание зображення при зміні розмірів батьківського вікна.
• Зробили висновок список ресурсів (екран, додатки), які можна нишпорити.
• Зробили обведення рамками расшариваемых ресурсів.
• Реалізували додаткові можливості: наприклад, передачу керування учаснику конференції (щоб він міг водити мишкою і клікати по екрану «шарящего» користувача).

Шарінг в Lync (UI Suppression mode) – примхлива річ: любить часто відвалюватися з невідомих причин, а при переході на Skype for Business 2016 почав робити це майже постійно. При перегляді шарінга часто з'являється чорний екран, і з цим нічого не зробити, так як займається відтворенням контрол ApplicationSharingView, про який написано вище. Також на вдалий запуск шарінга сильно впливає швидкість з'єднання.

Далі ми перейшли до створення останньої вкладки – «Groups», яка б грузила списки груп з Lync і надавала користувачеві можливість їх повністю редагувати і сортувати в потрібному порядку. Дана вкладка повинна була перерости в корпоративну вкладку, в якій би розміщувалися вже попередньо створені в Active Directory групи для співробітників (в Lync вони іменуються Distribution Groups): наприклад, «Замовити перепустку», «Написати заяву» і т. д. Учасниками даних груп є співробітники, які займаються певними питаннями до компанії. При натисканні на дану групу відкривається чат або аудіо дзвінок з першим учасником групи зі статусом «онлайн». Редагуванням цих груп має займатися адміністратор Lync-сервера.

Звичайно, у процесі реалізації всіх задуманих планів у нас виникали проблеми, які ми періодично вирішували. Але була особлива група проблем, яка пов'язана з некоректною роботою бібліотеки Lync SDK Lync Suppression mode. Ми відправляли їх опис в Microsoft і думали, що зможемо отримати підтримку і знайти спосіб рішення.

Проблеми



Як несподівано з'ясувалося, UI Suppression mode пропадає інтеграція з Outlook:
• пропадають статуси контактів;
• відсутня можливість створити бесіду з картки контакту;
• «відвалилася» кнопка «Створити збори Skype».

Повністю працюють картки контактів в Outlook нам вдалося повернути, спираючись на ось цю статтю (https://msdn.microsoft.com/ru-ru/library/office/jj900715.aspx?f=255&MSPPError=-2147217396#off15_IMIntegration_HowConnect).

Також заробили статуси контактів. Тепер Outlook їх отримує не від Lync, а від нашої програми, але він оновлює їх якимось магічним чином, і вони постійно «відвалюються» і перестає синхронізуватися. Тобто, реально людина вже з'явився онлайн і «зелений», а в Outlook – все ще в жовтому статус «Відійшов». Ми писали в підтримку Microsoft, на що вони нам надіслали посилання на цю статтю. Писали також в Yammer Microsoft, на форумах MSDN, Reddit і інших майданчиках… На жаль, ця проблема так і не вирішена.

Проблема відпалою в Outlook кнопки «Створити збори Skype» полягає в затиранні в режимі UI Suppression mode ключів реєстру по шляху HCU/Software/Microsoft/Office/15.0/Lync/ConfAddin/мій sip/. Там представлені три ключі: Capabilities, InbandInfo, PublicMeeting. Коли Lync запущений в штатному режимі, при натисканні на кнопку «Створити збори Skype» Outlook запитує у Lync інформацію про конференції, і вже Lync створює ключі реєстру. У UI Suppresseion mode Lync цього робити не хоче. Засобами Lync SDK 2013 отримати потрібну інформацію від Lync-сервера не можна. Був знайдений вихід: використовувати іншу SDK (https://msdn.microsoft.com/en-us/library/office/dn465943.aspx ) для роботи безпосередньо з сервером. Через UCMA ми змогли отримати від сервера інформацію про конференції авторизованого користувача. Наповнили ключі реєстру – і вуаля: в Outlook повернулася можливість створювати зборів. Але в цьому способі є кілька обмежень:
• бібліотека UCMA працює тільки на 64-розрядних ОС, на 32-бітних – рішення немає;
• комп'ютер користувача і сервер повинні знаходитися в одному домені, в іншому випадку потрібно створювати сертифікати на сервері для довірених програм. Як це робити, описано тут, але нам дане рішення не підходить, так як ми повинні реалізовувати функціонал тільки на стороні клієнта.

Знайшлися баги і в самому Lync SDK. Найкритичніший: видеобеседе p2p при додаванні 3-го учасника падає сам Lync-клієнт, стабільно. Microsoft сам цей баг підтверджує, але термінів усунення не називає. Були спроби вбивати бесіду p2p і створювати відразу відеоконференцію на трьох, але якщо 3-го учасника додає клієнт SFB, ми не можемо цьому перешкодити. Зупинка і відновлення відеоканалу теж ні до чого не привели.

Також проявилася проблема неможливості розшарити екран деяким користувачам (тим, у кого встановлена інша версія Lync-клієнта). Проявляється ця проблема наступним чином.

Перший клієнт працює в нашому додатку (версія Lync 2013), другий – в SFB 2016, і у нього при відкритті бесіди з першим кнопка розшарювання екрану недоступна. Якщо перший клієнт заходить у звичайний Lync 2013 (не Suppression mode), то у другого кнопка шарінга стає активною. Якщо у другого встановлено також Lync 2013 або наш додаток, шарінг доступний з обох сторін.

В Lync SDK відсутня callback про доставку повідомлення користувачеві. Є тільки callback, що повідомлення пішло. Але іноді може скластися ситуація, що ми відправляємо повідомлення людині в онлайн, воно йде без exception, але до моменту приходу співрозмовник вже офлайн. Отже, відправляє думає, що повідомлення прийшло, а це не так.

Часто виникає «ItemNotFoundException» при отриманні фото контактів, отже, доводиться відображати наше стандартне зображення контакту. Емпіричним шляхом ми знайшли скільки разів (приблизно 3) треба викликати код одержання фото, щоб Lync його все-таки повернув. Однак у деяких контактів цей спосіб все одно не спрацьовує. Додатково ми ввели кешування фото, щоб при старті не сипалася купа эксепшенов, якщо у користувача додано багато контактів.

Є проблема і з групами користувача, зокрема з «Favorites group». Проблема полягає в тому, що у деяких користувачів при виклику CanInvoke(DeleteGroup) Lync повертає true, хоча ця стандартна група Lync, і її не можна видалити. Тип у цієї групи такий же, як і у групи, створеної користувачем (CustomGroup), тому переховування пункту «Видалити групу» з меню доводиться робити ще і по додатковій перевірці на ім'я групи, що є жорстким милицею.

Виявилися обмеження Lync SDK 2013

• Недоступна одна з важливих функцій: можливість налаштування переадресації викликів, коли користувач знаходиться в офлайн. Ми реалізували переадресацію по закінченні певного часу, але тільки якщо користувач не в офлайн.
• При груповому відеовиклик (3 і більше учасників) потік, який транслює відео учасників, залишається один (аналог мобільних конференцій), тобто Lync сам змінює відеопотоки від різних учасників залежно від того, хто зараз говорить в мікрофон.
• Передача файлів недоступна UI Suppression mode. Ми вирішили цю проблему 2 способами:
-додали передачу файлів через Outlook у вигляді аттача до письма;
-запровадили сервіс OneDrive для завантаження файлів в хмару і автоматичної відправки повідомлення з URL файлу.
• Не можна використовувати контекстні дані бесіди (як це робити, описано тут https://msdn.microsoft.com/en-us/library/office/jj933248.aspx?f=255&MSPPError=-2147217396 ), коли бесіда конвертувалася в конференцію і стала існувати на сервері, а не локально. Ми хотіли використати цю можливість для синхронізації різної інформації між клієнтами.
• Відключена можливість запису в полі «Subject» у конференції (причому і в звичайному Lync), навіщо-то в Lync 2013 вони закрили цю можливість. Людина на MSDN скаржився, що у нього в Lync 2010 близько 30 збережених конференцій, кожна зі своїм заголовком. З переходом на Lync 2013 у нього залишилися тільки списки учасників в кожній конференції. Тепер відрізнити одну бесіду від іншого практично неможливо.
• Ще одна особливість Lync SDK 2013 – підтримка клієнтів, починаючи з Lync 2013 і новіше. Lync 2010 не підтримується. Однак Lync SDK 2010 працює і з Lync 2010, і з Lync 2013 і вище. Якою логікою керується Microsoft, невідомо.

Висновок

У процесі розробки ми зрозуміли, що повністю реалізувати повноцінний аналог Lync, грунтуючись на Lync SDK + UCMA, не вийде. Навіть якщо не брати в розрахунок обмеження даних технологій, прикро, що ми не змогли отримати підтримку від Microsoft по виправленню помилок Lync SDK.

На сьогодні ми змушені відмовитися від UI Suppression mode, т. к. в ньому неможливо реалізувати весь потрібний функціонал, і шукаємо варіанти обходу проявилися проблем.

Сподіваюся, ця стаття допоможе початківцям розробникам додатків на основі Lync/Skype for Business. І, можливо, хтось із які дочитали до цього місця захоче поділитися своїми ідеями. Пишіть!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.