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 під десктопи, швидкого доступу до наявних функцій і створення нового корпоративного функціоналу.


Малюнок 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 нам вдалося повернути, спираючись на ось цю статтю .

Також заробили статуси контактів. Тепер 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 для роботи безпосередньо з сервером. Через UCMA ми змогли отримати від сервера інформацію про конференції авторизованого користувача. Наповнили ключі реєстру - і вуаля: в Outlook повернулася можливість створювати зборів. Але в цьому способі є кілька обмежень:

  • бібліотека UCMA працює тільки на 64-розрядних ОС, на 32-бітних - рішення немає;
  • комп'ютер користувача і сервер повинні знаходитися в одному домені, в іншому випадку потрібно створювати сертифікати на сервері для довірених додатків. Як це робити, описано тут, але нам дане рішення не підходить, так як ми повинні реалізовувати функціонал тільки на стороні клієнта.

Знайшлися баги і в самому Lync SDK. Найкритичніший: в відеобесіди p2p при додаванні 3-го учасника падає сам Lync-клієнт, стабільно. Майкрософт сам цей баг підтверджує, але термінів усунення не називає. Були спроби вбивати бесіду 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 файлу.

  • Не можна використовувати контекстні дані бесіди (як це робити, описано тут ), Коли бесіда можна конвертувати в конференцію і стала існувати на сервері, а не локально. Ми хотіли використовувати цю можливість для синхронізації різноманітної інформації між клієнтами.

  • Відключена можливість запису в поле «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. І, можливо, хтось із дочитали до цього місця захоче поділитися своїми ідеями. Пишіть!


Автор: В'ячеслав Нестеров,
програміст, АстроСофт
джерело: https://habrahabr.ru/post/306230/


Теги: .net, lync sdk, skype for business, розробка під windows, скайп для бізнесу
Про що?
З чого все почалося?
Що ми хотіли отримати в результаті?

Дополнительная информация

rss
Карта