{"id":473407,"date":"2025-09-02T16:24:54","date_gmt":"2025-09-02T16:24:54","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=473407"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=473407","title":{"rendered":"<span>SIP \u043d\u0430 iOS \u0441 Linphone SDK: \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u0430\u044f VoIP-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0417\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u043e\u0434 iOS \u0441 2012 \u0433\u043e\u0434\u0430. \u0421 SIP \u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0438 \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043a\u0443\u0434\u0430 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c. \u041d\u0438\u0436\u0435 \u0434\u0435\u043b\u044e\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438.<br \/>\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u0440\u0438\u0442\u0438\u043a\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0437\u0430\u0434\u0430\u0447\u0430: \u0432 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0435 \u0441\u0440\u043e\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0451\u043c\u0430 \u0437\u0432\u043e\u043d\u043a\u043e\u0432 \u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \u0434\u043e\u043c\u043e\u0444\u043e\u043d.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u0441\u0442\u0430\u043b\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043d\u0430 \u0440\u044b\u043d\u043a\u0435 SIP-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <strong>Linphone<\/strong> \u0438 <strong>PJSIP<\/strong>.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u2014 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\"><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>Linphone<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>PJSIP<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u041f\u0440\u043e\u0449\u0435 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0421\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u0433\u0438\u0431\u0447\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">\ud83d\udd0a \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0443\u0434\u0438\u043e-\u043a\u043e\u0434\u0435\u043a\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430 (Opus, G722, Speex \u0438 \u0434\u0440.)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0414\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">\ud83d\udd10 SRTP \/ ZRTP<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0414\u0430 (\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0437\u0432\u043e\u043d\u043a\u0438)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0414\u0430 (\u043d\u043e ZRTP \u0432\u0440\u0443\u0447\u043d\u0443\u044e)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">\ud83d\udcc4 \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u043c\u0435\u0440\u0435\u043d\u043d\u0430\u044f, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 SDK<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0425\u043e\u0440\u043e\u0448\u0430\u044f, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\ud83d\udca1 <strong>\u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Linphone:<\/strong><br \/> \u2022 \u041d\u0443\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c SIP-\u0437\u0432\u043e\u043d\u043a\u0438 \u0432 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<br \/> \u2022 \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043e\u043a \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<br \/> \u2022 \u041d\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 VoIP-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445.<br \/> \u2022 \u041d\u0443\u0436\u043d\u0430 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f Android, iOS \u0438 \u0434\u0435\u0441\u043a\u0442\u043e\u043f).<\/p>\n<p>\ud83e\udd13 <strong>\u041a\u043e\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c PJSIP:<\/strong><br \/> \u2022 \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442).<br \/> \u2022 \u0412\u0430\u0436\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<br \/> \u2022 \u0423\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 PJSIP \u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u0433\u043e\u0442\u043e\u0432\u044b\u0439 SIP-\u043a\u043b\u0438\u0435\u043d\u0442 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438, <strong>Linphone<\/strong> \u2014 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<br \/> \u0415\u0441\u043b\u0438 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f VoIP-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 <strong>PJSIP<\/strong>.<\/p>\n<p>\u0418\u0437-\u0437\u0430 \u0441\u0436\u0430\u0442\u044b\u0445 \u0441\u0440\u043e\u043a\u043e\u0432 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043f\u044b\u0442\u0430 \u0441 SIP \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Linphone.<\/p>\n<h3>\ud83d\udd10 \u0410 \u0447\u0442\u043e \u043f\u043e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0443 Linphone?<\/h3>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b.<br \/> Linphone SDK (liblinphone) \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 <strong>GPLv2\/v3<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f <em>\u0432\u0441\u0435\u0433\u043e<\/em> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438:<\/p>\n<blockquote>\n<p>\u00abYou must make available the complete corresponding source code of the work under the same license.\u00bb<\/p>\n<\/blockquote>\n<p>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c SDK, \u043d\u043e \u0438 \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u043d\u0438\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 API\/\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0443 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 standalone-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435).<\/p>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e.<br \/>\u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e \u0443 <a href=\"https:\/\/www.linphone.org\/en\/belledonne-communications-company-overview\/\" rel=\"noopener noreferrer nofollow\"><strong>Belledonne Communications<\/strong>.<\/a><\/p>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Linphone \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443<\/h2>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c Linphone, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b CocoaPods, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 <strong>5.4.10<\/strong>. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430:<\/p>\n<blockquote>\n<p><code><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"'\/Users\/admin\/Library\/Developer\/Xcode\/DerivedData\/Airkey-bjqghwoaoqpanieccdctwipgfnhf\/Build\/Products\/Debug-iphonesimulator\/liblibbelle-sip-tester.dylib' (no such file), '\/Library\/Developer\/CoreSimulator\/Volumes\/iOS_21F79\/Library\/Developer\/CoreSimulator\/Profiles\/Runtimes\/iOS 17.5.simruntime\/Contents\/Resources\/RuntimeRoot\/usr\/lib\/system\/introspection\/liblibbelle-sip-tester.dylib' (no such file),\">'\/Users\/admin\/Library\/Developer\/Xcode\/DerivedData\/Airkey\u2011bjqghwoaoqpanieccdctwipgfnhf\/Build\/Products\/Debug\u2011iphonesimulator\/liblibbelle\u2011sip\u2011tester.dylib' (no such file), '\/Library\/Developer\/CoreSimulator\/Volumes\/iOS_21F79\/Library\/Developer\/CoreSimulator\/Profiles\/Runtimes\/iOS 17.5.simruntime\/Contents\/Resources\/RuntimeRoot\/usr\/lib\/system\/introspection\/liblibbelle\u2011sip\u2011tester.dylib' (no such file),<\/abbr><\/code><\/p>\n<\/blockquote>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 CocoaPods \u0438\u0437 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Linphone. \u041e\u043d\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0440\u0435\u0448\u0451\u043d\u043d\u043e\u0439 \u0443\u0436\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/p>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e <em>\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/em> \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044e <em>linphone-sdk 5.3.94<\/em>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a pod-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0432 <code>Podfile<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<p><code><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"source 'https:\/\/gitlab.linphone.org\/BC\/public\/podspec.git'\">source 'https:\/\/gitlab.linphone.org\/BC\/public\/podspec.git'<\/abbr><\/code><a href=\"https:\/\/gitlab.linphone.org\/BC\/public\/podspec.git'%EF%BF%BC\" rel=\"noopener noreferrer nofollow\"><br \/><\/a><br \/>\u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e <code>linphone-sdk<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 pod-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0433\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (<code>.podspec<\/code>) \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430 CocoaPods (\u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e Cocoapods \u0443\u0436\u0435 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435), \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<pre><code class=\"bash\"># \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 git clone https:\/\/gitlab.linphone.org\/BC\/public\/linphone-sdk.git # \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 cd linphone-sdk  # \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. git pull git submodule update --init \u2013recursive  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Python: # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0435\u0433\u043e  python3 -m pip install --upgrade pip  # \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435: python3 -m venv venv source venv\/bin\/activate  # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0438\u0442\u043e\u043d\u0430: pip install pystache six # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0432\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e:  pip list<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 cmake \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">cmake --preset=ios-sdk -G Ninja -B sdk -DENABLE_PQCRYPTO=YES -DLINPHONESDK_IOS_ARCHS=arm64 -DENABLE_NON_FREE_FEATURES=YES -DENABLE_GPL_THIRD_PARTIES=YES -DENABLE_G729=YES -DCMAKE_CONFIGURATION_TYPES=ReleaseWithDebInfo  \u0418 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u0430 ~ 3Gb (\u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0436\u0430\u0442\u044c \u0432 600 \u043c\u0431) cmake --build sdk --config RelWithDebInfo -j5  cmake --preset=ios-sdk \\                        -G Xcode \\   -B sdk \\   -DENABLE_PQCRYPTO=YES \\   -DLINPHONESDK_IOS_ARCHS=arm64 \\   -DENABLE_NON_FREE_FEATURES=YES \\   -DENABLE_GPL_THIRD_PARTIES=YES \\   -DENABLE_G729=YES \\   -DCMAKE_CONFIGURATION_TYPES=ReleaseWithDebInfo \\   -DCODE_SIGN_IDENTITY=\"\" \\   -DCMAKE_XCODE_ATTRIBUTE_DSYM_ENABLED=YES  cmake --build sdk --config RelWithDebInfo -j5  <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 dSYM-\u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b <code>GenerateFrameworks.cmake<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 App Store \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd5\/28c\/3fa\/cd528c3fa4b0c347ac79481ba01e78f6.png\" alt=\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0438\u043b\u0434\u0430 \u0432 TestFlight\" title=\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0438\u043b\u0434\u0430 \u0432 TestFlight\" width=\"1432\" height=\"730\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cd5\/28c\/3fa\/cd528c3fa4b0c347ac79481ba01e78f6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd5\/28c\/3fa\/cd528c3fa4b0c347ac79481ba01e78f6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0438\u043b\u0434\u0430 \u0432 TestFlight<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0421 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 Swift Package Manager (SPM) \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0442\u0430\u043b\u0430 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0449\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443, \u0438\u043d\u0430\u0447\u0435 \u043f\u0430\u043a\u0435\u0442 <code>linphonesw<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b\u0441\u044f. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u044d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0443\u0436\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0430.<\/p>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 SDK<\/h2>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e SDK \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435.<\/p>\n<p>\u0427\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b SIP, \u043a\u0430\u0441\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 FreePBX, \u044f \u043f\u0440\u043e\u043f\u0443\u0449\u0443 \u2014 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043b\u043e\u0433, \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 Linphone \u2014 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0417\u0430\u0442\u0435\u043c \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044f\u0434\u0440\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b (linphonerc_default \u0438 linphonerc_factory) \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043d\u0430 SIP-\u0441\u0435\u0440\u0432\u0435\u0440\u0435.<br \/>\u0414\u0430\u043b\u044c\u0448\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0443\u0442\u0438 \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c: \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0432\u043e\u0434\u0441\u043a\u043e\u0439 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u0431\u0430\u043d\u0434\u043b\u0430).<br \/>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0430\u043c\u043e \u044f\u0434\u0440\u043e Linphone \u0441 \u044d\u0442\u0438\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d STUN-\u0441\u0435\u0440\u0432\u0435\u0440, \u0442\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f NAT-\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u2014 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0451 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f (ICE, STUN, TURN), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043c\u0435\u0448\u0430\u043b\u043e.<br \/>\u0417\u0430\u0442\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0438\u0447\u0438: CallKit (\u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e), \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043a\u0438, \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c. \u041f\u0443\u0448\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0440\u0435\u0448\u0435\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u043e \u0442\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 Linphone.<br \/>\u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e \u2014 \u044f\u0434\u0440\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. <br \/>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043e\u0447\u0438\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430:<\/p>\n<pre><code class=\"swift\">linphonesw.LoggingService.Instance.logLevel = .Debug         stop()         do {             let configName = \"linphonerc_default\"             let factoryName = \"linphonerc_factory\"                          guard let configTarget = FileManager.default                 .urls(for: .libraryDirectory, in: .userDomainMask)                 .first?                 .appendingPathComponent(configName) else {                 fatalError(\"Unable to write config file to library\")             }                          \/\/\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u044f\u0434\u0440\u043e                         core = try Factory.Instance.createCore(                 configPath: configTarget.relativePath,                 factoryConfigPath: Bundle.main.path(forResource: factoryName, ofType: \"\") ?? \"\",                 systemContext: nil             )                                       if let core = core {                 let stun = config.stun ?? \"none:\"                 let params = stun.split(separator: \":\", maxSplits: 1, omittingEmptySubsequences: false)                 let typeString = String(params[0])                 let serverString = String(params[1])                              let nat = try? core.natPolicy ?? core.createNatPolicy()                 if let natPolicy = nat {                         natPolicy.iceEnabled = false                         natPolicy.stunEnabled = false                         natPolicy.turnEnabled = false                     core.natPolicy = natPolicy                 }                              core.callkitEnabled = config.useCallKit                 core.pushNotificationEnabled = false                 core.videoDisplayEnabled = true                 core.adaptiveRateControlEnabled = true                 core.addDelegate(delegate: self)                  try core.start()                  core.clearAllAuthInfo()                 core.clearAccounts()<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044f\u0434\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0430\u0439\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>iterate() <\/code>c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439:<\/p>\n<pre><code class=\"swift\">                timer = Timer.scheduledTimer(withTimeInterval: 0.02, repeats: true) { [weak self] _ in                     guard let self = self else { return }                      if let call = self.core?.currentCall {                         let state = call.state                         let status = call.callLog?.status                         if state == .Error || state == .End || state == .Released || status == .AcceptedElsewhere {                             \/\/ \u041d\u0435 \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439                             LegacyLoggingAgent.log(.debug, message: \"\u26d4\ufe0f Sip Skipping iterate: Call is in state \\(state)\")                             return                         }                     }                      self.core?.iterate()                 }             }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>iterate()<\/code> \u0432 Linphone \u2014 \u044d\u0442\u043e \u0434\u0432\u0438\u0436\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0440\u0443\u0442\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041e\u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u0430, \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a Linphone \u0438 \u0432\u0441\u0451 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f iterate() \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430:<\/p>\n<ul>\n<li>\n<p>\u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435\/\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0432\u043e\u043d\u043a\u0438 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e,<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 RTP\/SDP \u043f\u0430\u043a\u0435\u0442\u043e\u0432,<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (\u043e\u043d\u043b\u0430\u0439\u043d\/\u043e\u0444\u043b\u0430\u0439\u043d, \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b),<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e <code>iterate()<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0437 \u0432 20-50 \u043c\u0441). \u041d\u043e \u0441 \u043d\u0435\u0439 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u043c \u2014 \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0430\u0441\u0442\u044c.<\/p>\n<p>\u0427\u0430\u0441\u0442\u043e \u0441\u0431\u043e\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f \u2014 \u043b\u0443\u0447\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e &#171;\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u0430\u0443\u0437\u0443&#187; \u0432\u044b\u0437\u043e\u0432 <code>iterate()<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043d\u0430\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u0440\u0430\u0448\u0438 \u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f SIP \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b Linphone \u043d\u0430\u0447\u0430\u043b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0432\u043e\u043d\u043a\u0438, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c SIP-\u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u2014 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>setAccountConfiguration<\/code>. \u041e\u043d \u0431\u0435\u0440\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u043b\u043e\u0433\u0438\u043d, \u0434\u043e\u043c\u0435\u043d, \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442) \u0438 \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 SIP-\u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 Linphone. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0448\u0430\u0433, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u044f \u043c\u0430\u0433\u0438\u044f VoIP-\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u0411\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, \u043d\u0438 \u0437\u0432\u043e\u043d\u043a\u043e\u0432.<\/p>\n<pre><code class=\"swift\">extension AccountParams {     func setAccountConfiguration(core: Core, configuration config: SipConfig) {         guard let identityAddress = core.interpretUrl(             url: \"sip:\\(config.username)@\\(config.domain)\",             applyInternationalPrefix: false         ),               let proxyAddress = core.interpretUrl(                 url: \"&lt;sip:\\(config.domain);transport=\\(config.transport)&gt;\",                 applyInternationalPrefix: false               )         else {             return         }         do {             try identityAddress.setTransport(newValue: config.transport)             try setIdentityaddress(newValue: identityAddress)             try setServeraddress(newValue: proxyAddress)           }       }             registerEnabled = true             guard let account = try? core.createAccount(params: self) else {                 return             }             try core.addAccount(account: account)             core.defaultAccount = account         } catch {             log(\"Error: \\(error)\")         }     } }<\/code><\/pre>\n<p>\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0415\u0441\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0439, \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<br \/>\u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>expires,<\/code> \u043b\u0443\u0447\u0448\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0435 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 60 \u0441\u0435\u043a\u0443\u043d\u0434. <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0432\u043e\u043d\u043a\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>makeCall()<\/code>.<br \/>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u043a\u0430\u043a &#171;\u0432\u044b\u0437\u043e\u0432 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435&#187;, \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u043a\u043e\u0434\u0435. \u041e\u043d\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u0441\u0451: \u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0447\u0442\u043e \u0432\u044b \u0432 \u0441\u0435\u0442\u0438 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0437\u0432\u043e\u043d\u043a\u0443, \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430.<\/p>\n<pre><code class=\"swift\">func makeCall() { # \u0421\u0430\u043c \u0437\u0432\u043e\u043d\u043e\u043a               let startTime = Date()             let timeout: TimeInterval = 3 # \u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a \u0447\u0435\u0440\u0435\u0437 Mutex \u0438 NSLock             while LinphoneService.shared.core?.defaultAccount?.state != .Ok {                 usleep(100000)                 if -startTime.timeIntervalSinceNow &gt; timeout {                     LegacyLoggingAgent.log(.error, message: \"SIP sip registration was failed \\(timeout) seconds\")                     return                 }             }          let username = \u201c\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c username\u201d          let addr = \"sip:\\(username)@\\(domain)\"          guard let core = core else { return }          do {             \/\/ \ud83d\udc49 \u0412\u0410\u0416\u041d\u041e: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0430\u0443\u0434\u0438\u043e             let audioSession = AVAudioSession.sharedInstance()             try audioSession.setCategory(.playAndRecord, mode: .voiceChat, options: [.defaultToSpeaker])             try audioSession.setActive(true)             core.activateAudioSession(activated: true)              \/\/ \ud83d\udcde \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0432\u044b\u0437\u043e\u0432\u0430             let remoteAddress = try Factory.Instance.createAddress(addr: addr)             try remoteAddress.setPort(newValue: 5060)             try remoteAddress.setDomain(newValue: domain)             try remoteAddress.setDisplayname(newValue: username)              \/\/ \u2705 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0432\u043e\u043d\u043a\u0430             let callParams = try core.createCallParams(call: nil)             callParams.audioEnabled = true             callParams.videoEnabled = true \/\/ \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u043e             let call = core.inviteAddressWithParams(addr: remoteAddress, params: callParams)             call?.cameraEnabled = false          } catch {             log(\"\u274c \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u0430: \\(error)\")         }     }    }<\/code><\/pre>\n<p>\u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043b\u0438 \u0432\u0430\u0448 SIP-\u0430\u043a\u043a\u0430\u0443\u043d\u0442 (\u044d\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f). \u0416\u0434\u0451\u043c \u0434\u043e 3 \u0441\u0435\u043a\u0443\u043d\u0434 \u2014 \u0435\u0441\u043b\u0438 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u043e\u0433, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u043e\u043a, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 \u0430\u0431\u043e\u043d\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0437\u0432\u043e\u043d\u0438\u0442\u044c \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>sip:<\/code><a href=\"mailto:user@example.com\" rel=\"noopener noreferrer nofollow\"><code>user@example.com<\/code><\/a>.<br \/>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0437\u0432\u043e\u043d\u043a\u0443:<\/p>\n<ul>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0432\u0443\u043a \u2014 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0438 \u0441\u043b\u044b\u0448\u0430\u0442\u044c \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0437\u0432\u043e\u043d\u043e\u043a \u0431\u044b \u043f\u043e\u0448\u0451\u043b, \u043d\u043e \u0437\u0432\u0443\u043a\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441, \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0437\u0432\u043e\u043d\u0438\u0442\u044c \u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0440\u0442, \u0434\u043e\u043c\u0435\u043d \u0438 \u0438\u043c\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0432\u043e\u043d\u043a\u0430 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0443\u0436\u0435\u043d \u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u043e\u0441 \u0438\u043b\u0438 \u0435\u0449\u0451 \u0438 \u0432\u0438\u0434\u0435\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0430\u043c \u0437\u0432\u043e\u043d\u043e\u043a \u2014 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043e\u043a, \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u0430\u043c\u0435\u0440\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0439\u0434\u0451\u0442 \u043d\u0435 \u0442\u0430\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d \u0438\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0437\u043e\u0432\u0430), \u043b\u043e\u0432\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u043f\u0438\u0448\u0435\u043c \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043b\u043e\u0433 \u2014 \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0433\u0434\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<h2>Push \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f<\/h2>\n<p>\u041f\u0440\u0438 \u043f\u0440\u0438\u0451\u043c\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0432\u043e\u043d\u043e\u043a \u043f\u043e push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044e \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u0432\u043e\u043d\u043e\u043a \u043a\u0430\u043a \u043d\u0430 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435, \u0442\u0430\u043a \u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. <br \/>\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0437\u043e\u0432\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u043c \u0430\u0431\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ul>\n<li>\n<p> \u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0430\u0431\u043e\u043d\u0435\u043d\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 SIP-\u0432\u044b\u0437\u043e\u0432 \u043d\u0430 SIP-\u0441\u0435\u0440\u0432\u0435\u0440 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e FreePBX).<\/p>\n<\/li>\n<li>\n<p> \u0414\u0438\u0430\u043b\u043f\u043b\u0430\u043d \u0432\u043d\u0443\u0442\u0440\u0438 FreePBX \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 AGI-\u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0436\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430. \u2022\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 (\u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0451 \u0431\u044d\u043a\u0435\u043d\u0434-\u0447\u0430\u0441\u0442\u044c) \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 VoIP-\u043f\u0443\u0448-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 APNS \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. <\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043f\u0443\u0448, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f (\u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0438\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0444\u043e\u043d\u0435), \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 linphone SDK \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 SIP-\u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0440\u0430\u043f\u043e\u0440\u0442\u0443\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434. <\/p>\n<\/li>\n<li>\n<p>\u0411\u044d\u043a\u0435\u043d\u0434 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 AGI-\u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0438\u0430\u043b\u043f\u043b\u0430\u043d\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e SIP-\u0432\u044b\u0437\u043e\u0432 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. <\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u044d\u043a\u0435\u043d\u0434\u0443 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0432\u043e\u043d\u043e\u043a), \u0442\u043e \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0436\u0434\u0443\u0449\u0438\u0439 AGI-\u0437\u0430\u043f\u0440\u043e\u0441, \u0438 SIP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u0438\u0430\u043b\u043f\u043b\u0430\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0432\u044b\u0437\u043e\u0432,, \u0441\u043e\u0437\u0434\u0430\u0451\u0442 CallKit UI (reportNewIncomingCall) \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0437\u0432\u043e\u043d\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u2014 CallKit \u0434\u0430\u0451\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>performAnswerCall<\/code>, \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c Linphone SDK.<\/p>\n<\/li>\n<li>\n<p>Linphone SDK \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 SIP-\u0437\u0432\u043e\u043d\u043e\u043a (<code>call.accept()<\/code>), \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0443\u0434\u0438\u043e-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0430\u0431\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/909\/72c\/58a\/90972c58a54197a6efd4ebf460d9624d.png\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u0437\u0432\u043e\u043d\u043a\u0430 \u0441 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\" title=\"\u0421\u0445\u0435\u043c\u0430 \u0437\u0432\u043e\u043d\u043a\u0430 \u0441 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\" width=\"1925\" height=\"623\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/909\/72c\/58a\/90972c58a54197a6efd4ebf460d9624d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/909\/72c\/58a\/90972c58a54197a6efd4ebf460d9624d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0437\u0432\u043e\u043d\u043a\u0430 \u0441 \u0434\u043e\u043c\u043e\u0444\u043e\u043d\u0430 \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441 SIP-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0432\u043e\u043d\u043a\u0438, \u0437\u0430 \u0441\u0447\u0435\u0442 \u0447\u0435\u0433\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p><code>provider(_:perform:)<\/code> \u2014 \u043e\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>CallKit&#8217;\u043e\u043c<\/strong>, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u00ab\u041e\u0442\u0432\u0435\u0442\u0438\u0442\u044c\u00bb \u043d\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0432\u043e\u043d\u043e\u043a:<br \/>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014 &#171;\u043c\u043e\u0441\u0442\u0438\u043a&#187; \u043c\u0435\u0436\u0434\u0443 CallKit \u0438 Linphone. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0432\u043e\u043d\u043e\u043a \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d iOS, \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<ul>\n<li>\n<p>\u0436\u0434\u0451\u0442 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0437\u0432\u043e\u043d\u043e\u043a,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 Linphone,<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0447\u0442\u043e \u0432\u0441\u0451 \u043e\u043a.<\/p>\n<\/li>\n<\/ul>\n<ol>\n<li>\n<p><strong>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a (UI), \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0437\u0432\u043e\u043d\u043e\u043a \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f <\/strong><code><strong>currentCall<\/strong><\/code>:<\/p>\n<ul>\n<li>\n<p>\u0412 \u0446\u0438\u043a\u043b\u0435 <code>while<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0441\u0442\u044c \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u0432\u043e\u043d\u043a\u0430. \u041f\u043e\u043a\u0430 \u0435\u0433\u043e \u043d\u0435\u0442 \u2014 \u0436\u0434\u0451\u0442 (\u043f\u0430\u0443\u0437\u0430 100 \u043c\u0441). \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0437\u0432\u043e\u043d\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0435\u0449\u0451 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 CallKit \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/strong>:<\/p>\n<ul>\n<li>\n<p><code>pendingAcceptAction = action<\/code> \u2014 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 CallKit, \u043f\u043e\u043a\u0430 \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0427\u0435\u0440\u0435\u0437 0.5 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (UI-\u043f\u043e\u0442\u043e\u043a\u0435)<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0414\u0430\u0451\u0442 \u044f\u0434\u0440\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u00ab\u0443\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f\u00bb, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0432\u043e\u043d\u043e\u043a (\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0435\u0435 \u0442\u0430\u043a).<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0437\u0432\u043e\u043d\u043e\u043a \u0438 \u044f\u0434\u0440\u043e (core) \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c <code>action<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f, \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u043c.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u0430\u043c\u0435\u0440\u0443<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0414\u043b\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u043d\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0437\u043e\u0432\u0430<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0443\u0434\u0438\u043e.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0432\u043e\u043d\u043e\u043a<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0427\u0435\u0440\u0435\u0437 <code>call.acceptWithParams(...)<\/code> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 CallKit, \u0447\u0442\u043e \u0437\u0432\u043e\u043d\u043e\u043a \u043f\u0440\u0438\u043d\u044f\u0442<\/strong>:<\/p>\n<ul>\n<li>\n<p><code>action.fulfill()<\/code> \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <\/strong><code><strong>showUI()<\/strong><\/code>:<\/p>\n<ul>\n<li>\n<p>\u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u044d\u0442\u043e \u0442\u0432\u043e\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0437\u0432\u043e\u043d\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h4>\ud83d\uded1 \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a:<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0432\u043e\u043d\u043e\u043a):<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0437\u043e\u0432 <a href=\"http:\/\/action.fail\" rel=\"noopener noreferrer nofollow\"><code>action.fail<\/code><\/a><code>()<\/code> \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0447\u0442\u043e \u0437\u0432\u043e\u043d\u043e\u043a \u043d\u0435 \u0443\u0434\u0430\u043b\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>terminateCall()<\/code> \u2014 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0437\u0432\u043e\u043d\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>\u042f\u0434\u0440\u043e Linphone \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><code>assert(false)<\/code> \u2014 \u0436\u0451\u0441\u0442\u043a\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 (\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0432 dev-\u0441\u0431\u043e\u0440\u043a\u0430\u0445, \u043d\u043e \u0432 \u0440\u0435\u043b\u0438\u0437\u0435 \u0435\u0451 \u043b\u0443\u0447\u0448\u0435 \u0443\u0431\u0440\u0430\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u043e \u0432 \u043b\u043e\u0433\u0430\u0445 \u0441\u044b\u043f\u044f\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u043f\u0440\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0438\u043b\u0438 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 SIP-\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0435\u0442\u0438 \u0432 Linphone. \u041d\u0438\u0436\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043a\u0430\u0436\u0434\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0438 \u043f\u0443\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p><code>2025-04-22 23:18:09:665 liblinphone-error- There is no NatPolicy with ref [wA0ylyNsKiMdCbd] <\/code><br \/><code>2025-04-22 23:18:09:668 liblinphone-warning- Bad account address: it is not in the list ! <\/code><br \/><code>2025-04-22 23:18:09:673 mediastreamer-warning- Could not apply gain on sent RTP packets: gain control wasn't activated. Use audio_stream_enable_gain_control() before starting the stream. <\/code><br \/><code>2025-04-22 23:18:09:673 ortp-warning- Fail to set IPv4 packet info on RTP socket: Invalid argument. <br \/>2025-04-22 23:18:09:673 ortp-warning- Fail to set IPv4 packet info on RTCP socket: Invalid argument. 2025-04-22 23:18:09:673 liblinphone-error- Unable to retrieve contact address from account for call session 0x119335748 (local address  remote address sip:200@xxx.xx.xx.xx). <br \/>2025-04-22 23:18:09:673 liblinphone-warning- Unable to set contact address for session 0x118d65880 to as it is not valid <br \/>2025-04-22 23:18:09:673 belle-sip-error- No listening point matching for [Udp:\/\/xxx.xx.xx.xx:5060] 2025-04-22 23:18:09:673 belle-sip-error- belle_sip_client_transaction_send_request(): no channel available<\/code><\/p>\n<\/blockquote>\n<h3>\u0427\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e\u0448\u0438\u0431\u043a\u0438:<\/h3>\n<h4> \ud83d\udd34 No NatPolicy with ref [&#8230;]<\/h4>\n<blockquote>\n<p>\u2757\u00a0\u042d\u0442\u043e \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u044b \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b NAT policy (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, STUN).<br \/> <strong>\u041d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e<\/strong>, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0437\u0430\u0434\u0430\u0442\u044c:<\/p>\n<\/blockquote>\n<pre><code>natPolicy.stunServer = \"stun.linphone.org\" natPolicy.iceEnabled = true natPolicy.upnpEnabled = false natPolicy.turnEnabled = false core.natPolicy = natPolicy<\/code><\/pre>\n<h4>\u2757 Bad account address: it is not in the list!<\/h4>\n<blockquote>\n<p>\u0410\u043a\u043a\u0430\u0443\u043d\u0442 <code>sip:100@xxx.xx.xx.xx<\/code> \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437-\u0437\u0430:<\/p>\n<\/blockquote>\n<ul>\n<li>\n<p>\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e SIP URI<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043e\u043c (TCP\/UDP)<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f listening point (\u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435!)<\/p>\n<\/li>\n<\/ul>\n<h4> \ud83d\uded1 No listening point matching for [Udp:\/\/xxx.xx.xx.xx:5060]<\/h4>\n<blockquote>\n<p>\u2757 \u0421\u0430\u043c\u043e\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0435: <strong>Linphone \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b UDP-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442<\/strong>, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043f\u043e\u0440\u0442 5060.<\/p>\n<\/blockquote>\n<h4>\ud83d\udca5 \u041f\u0440\u0438\u0447\u0438\u043d\u0430:<\/h4>\n<p>Linphone \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, <strong>\u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435<\/strong> \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442\u044b.<\/p>\n<h4>\u041e\u0448\u0438\u0431\u043a\u0438 \u0441 \u0430\u0443\u0434\u0438\u043e \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u2014 \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b.<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u0448\u044c \u0432 \u043b\u043e\u0433\u0430\u0445 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<blockquote>\n<p>Can&#8217;t find sound device with id AU: Audio Unit Receiver<\/p>\n<\/blockquote>\n<p>\u044d\u0442\u043e \u043d\u0435 \u043a\u043e\u043d\u0435\u0446 \u0441\u0432\u0435\u0442\u0430. \u041f\u0440\u043e\u0441\u0442\u043e Linphone \u043d\u0435 \u043d\u0430\u0448\u0451\u043b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u044b\u0432\u043e\u0434\u0430\/\u0432\u0432\u043e\u0434\u0430 \u0437\u0432\u0443\u043a\u0430 (\u0430 \u0442\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043b \u0432\u0440\u0443\u0447\u043d\u0443\u044e). \u041d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2014 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432 \u0437\u0432\u043e\u043d\u043a\u0435 \u043d\u0435\u0442 \u0437\u0432\u0443\u043a\u0430 \u0432\u043e\u043e\u0431\u0449\u0435, \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u0430\u0443\u0434\u0438\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u044f\u0432\u043d\u043e:<\/p>\n<pre><code class=\"swift\">core.audioDevice = core.audioDevices.first { $0.type == .builtin }<\/code><\/pre>\n<p>\u0410 \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c \u043f\u0440\u043e <code>AVAudioSession<\/code>:<\/p>\n<pre><code class=\"swift\">try? AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .voiceChat) try? AVAudioSession.sharedInstance().setActive(true)<\/code><\/pre>\n<h4>\ud83d\udd10 LIME \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f? \u0414\u0430 \u0438 \u043b\u0430\u0434\u043d\u043e<\/h4>\n<blockquote>\n<p>[LIME] No LIME server URL in account params<\/p>\n<\/blockquote>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u0442\u044b \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438 (LIME). \u0415\u0441\u043b\u0438 \u0442\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0448\u044c \u0447\u0430\u0442 \u2014 \u043c\u043e\u0436\u0435\u0448\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0448\u044c \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u2014 \u043f\u0440\u043e\u043f\u0438\u0448\u0438 <code>limeServerUrl<\/code> \u0432\u0440\u0443\u0447\u043d\u0443\u044e:<\/p>\n<pre><code class=\"swift\">accountParams.limeServerUrl = \"https:\/\/lime.linphone.org\/lime\"<\/code><\/pre>\n<h2>C\u0432\u044f\u0437\u043a\u0430 Linphone + CallKit:<\/h2>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0442\u044b \u0445\u043e\u0447\u0435\u0448\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c VoIP-\u0437\u0432\u043e\u043d\u043a\u0438 \u0432 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u00ab\u043a\u0430\u043a \u0443 \u043b\u044e\u0434\u0435\u0439\u00bb, \u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u0442\u0435\u0431\u0435 \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 <strong>CallKit<\/strong>. \u042d\u0442\u043e \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0432\u043e\u043d\u043a\u0430 \u2014 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0443 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430.<\/p>\n<p>\u0424\u0438\u0448\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 iOS \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0432\u043e\u043d\u043e\u043a, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0444\u043e\u043d\u0435. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0442\u0435\u0431\u0435 \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 VoIP push \u0438 \u0442\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0448\u044c \u0435\u0433\u043e, \u0431\u0435\u0437 CallKit \u0442\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0448\u044c \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0432\u043e\u043d\u0438\u0442 \u0430\u0431\u043e\u043d\u0435\u043d\u0442. \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0437\u0432\u043e\u043d\u043e\u043a. \u0410 \u0432\u043e\u0442 CallKit \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0437\u0432\u043e\u043d\u043a\u0430 (\u043a\u0430\u043a \u0443 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0438\u0438);<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u00ab\u041e\u0442\u0432\u0435\u0442\u0438\u0442\u044c\u00bb \u0438 \u00ab\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Bluetooth-\u0433\u0430\u0440\u043d\u0438\u0442\u0443\u0440\u044b \u0438 \u0440\u0435\u0436\u0438\u043c \u00ab\u041d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 VoIP push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u0435\u0437 CallKit iOS \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043c\u0435\u0442 VoIP push \u043a\u0430\u043a \u0437\u0432\u043e\u043d\u043e\u043a \u0438 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0440\u0435\u0448\u0438\u0432, \u0447\u0442\u043e \u0442\u044b \u0447\u0442\u043e-\u0442\u043e \u043c\u0443\u0442\u043d\u043e\u0435 \u0437\u0430\u0442\u0435\u044f\u043b (\u0441\u043c. [\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 NSInternalInconsistencyException] \u043d\u0438\u0436\u0435).<\/p>\n<p>CallKit \u2014 \u044d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 \u0442\u0432\u043e\u0438\u043c VoIP-\u0434\u0432\u0438\u0436\u043a\u043e\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Linphone) \u0438 iOS. \u041e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u0437\u0432\u043e\u043d\u043a\u0430, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b Apple \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043b\u0430 \u0442\u0435\u0431\u0435 \u00ab\u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0438\u044e\u00bb.<\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0448\u044c \u0437\u0432\u043e\u043d\u043a\u0438 \u2014 \u0445\u043e\u0442\u044c SIP, \u0445\u043e\u0442\u044c WebRTC \u2014 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043f\u043e\u0434\u0443\u043c\u0430\u0439, \u043a\u0430\u043a \u0442\u044b \u0431\u0443\u0434\u0435\u0448\u044c \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0441 CallKit. \u0418\u043d\u0430\u0447\u0435 \u0432 \u0444\u043e\u043d\u0435 \u0443 \u0442\u0435\u0431\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p> \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u0441\u0451 \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>LinphoneCore \u043b\u043e\u0432\u0438\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 SIP-\u0437\u0432\u043e\u043d\u043e\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u043b\u0435 push).<\/p>\n<\/li>\n<li>\n<p>\u0422\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u0448\u044c <code>CXProvider<\/code> \u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0440\u0442\u0438\u0448\u044c \u0437\u0432\u043e\u043d\u043e\u043a \u0432 CallKit (<code>reportNewIncomingCall<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0437\u0432\u043e\u043d\u043a\u0430 (\u043a\u0430\u043a \u0443 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e iPhone-\u0437\u0432\u043e\u043d\u043a\u0430) \u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u2014 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 callback <code>performAnswerCall<\/code>, \u0438 \u0442\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0448\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 Linphone:<\/p>\n<pre><code class=\"swift\">call?.accept()<\/code><\/pre>\n<\/li>\n<\/ul>\n<h4>\u26a0\ufe0f \u0412\u0430\u0436\u043d\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b:<\/h4>\n<ul>\n<li>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438 <strong>VoIP background mode<\/strong> \u0432 <code>Capabilities<\/code>. \u041d\u0430\u043f\u043e\u0440\u043e\u043b\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u0442 \u043d\u044e\u0430\u043d\u0441 \u0442\u0430\u043a, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0437\u0432\u043e\u043d\u043a\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b.<\/p>\n<\/li>\n<li>\n<p>CallKit \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u2014 \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435  \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u043d\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d (\u0438\u043d\u0430\u0447\u0435 \u0437\u0432\u0443\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442) \u0438 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043f\u0430\u0440\u0435 \u0441 PushKit \u2014 \u0434\u043b\u044f VoIP-\u043f\u0443\u0448\u0435\u0439 (\u0442\u0435\u0445, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e &#171;\u0431\u0443\u0434\u044f\u0442&#187; \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435).<\/p>\n<\/li>\n<\/ul>\n<h4>\u2757\ufe0f\u041f\u0440\u043e CXProviderConfiguration(localizedName:)<\/h4>\n<p>\u0414\u0430, \u044d\u0442\u043e\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0441 <code>localizedName:<\/code> \u0441 iOS 14 \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043a\u0430\u043a deprecated:<\/p>\n<pre><code class=\"swift\">let config = CXProviderConfiguration(localizedName: \"MyApp\") \/\/ deprecated, \u0433\u043e\u0432\u043e\u0440\u044f\u0442...<\/code><\/pre>\n<p>\u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0431\u0430\u0433, \u0430, \u0441\u0443\u0434\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443, \u0442\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u043e\u0442 Apple: \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0442, \u0438 \u0434\u0430\u0436\u0435 Apple \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0422\u0430\u043a \u0447\u0442\u043e:<\/p>\n<p>\ud83d\udc49 \u041f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u2014 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0438 \u0441 \u0447\u0438\u0441\u0442\u043e\u0439 \u0441\u043e\u0432\u0435\u0441\u0442\u044c\u044e.<\/p>\n<h3>\ud83d\udce6 \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 push \/ \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438<\/h3>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0433\u0440\u0430\u0431\u0435\u043b\u044c: \u043c\u044b \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 voip \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043b\u0438<strong> <\/strong><code>.p12<\/code> \u0432 <code>.p8<\/code>, \u0434\u0443\u043c\u0430\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041d\u043e \u0434\u043b\u044f <strong>VoIP-\u043f\u0443\u0448\u0435\u0439<\/strong> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0443\u0448\u0435\u0439, \u0442\u043e\u043b\u044c\u043a\u043e  apns-topic \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a bundleId.voip \u0430 apns-push-type: voip.<\/p>\n<p>\u0427\u0435\u043c \u0436\u0435APNs VoIP-push&#8217;\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445:<\/p>\n<ul>\n<li>\n<p>\u041c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u043f\u0440\u0438\u0431\u0438\u0442\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0443\u0448\u0430 \u2014 <code>apns-push-type: voip<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h4>\ud83e\uddea \u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c VoIP push&#8217;\u0438?<\/h4>\n<p>Apple \u0434\u0430\u0451\u0442 \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0432\u0435\u0431-\u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/push.apple.com\" rel=\"noopener noreferrer nofollow\">https:\/\/push.apple.com<\/a> (\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 <code>curl<\/code>, \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e-\u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u043c\u0443)<\/p>\n<\/li>\n<li>\n<p>\u0423\u0431\u0435\u0434\u0438\u0441\u044c, \u0447\u0442\u043e \u0432 payload \u0435\u0441\u0442\u044c <code>apns-push-type: voip<\/code>, \u0438\u043d\u0430\u0447\u0435 \u0437\u0432\u043e\u043d\u043e\u043a \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<h4>VoIP \u043f\u0443\u0448\u0438 + Background = \u0437\u043e\u043d\u0430 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0448\u044c <strong>PushKit<\/strong> \u0434\u043b\u044f \u043f\u0440\u0438\u0451\u043c\u0430 VoIP-\u043f\u0443\u0448\u0435\u0439, \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <strong>\u0432 \u0444\u043e\u043d\u0435<\/strong> (\u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u0438\u0431\u0438\u0442\u043e), iOS \u0436\u0434\u0451\u0442 \u043e\u0442 \u0442\u0435\u0431\u044f \u043e\u0434\u043d\u043e\u0433\u043e:<\/p>\n<blockquote>\n<p>\ud83d\udd25 <strong>\u0412\u044b\u0437\u043e\u0432\u0438 <\/strong><code><strong>reportNewIncomingCall()<\/strong><\/code><strong> \u0432 CallKit \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/strong><\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u0448\u044c \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434, \u0442\u043e iOS \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u044b &#171;\u043d\u0435 \u0443\u043c\u0435\u0435\u0448\u044c&#187; \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c VoIP-\u043f\u0443\u0448\u0438 \u2014 \u0438 \u0436\u0451\u0441\u0442\u043a\u043e \u0443\u0431\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u0440\u0438\u0447\u0451\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442, \u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c VoIP-\u043f\u0443\u0448\u0438 \u0432\u043e\u043e\u0431\u0449\u0435, \u043f\u043e\u043a\u0430 \u0442\u044b \u043d\u0435:<\/p>\n<ul>\n<li>\n<p>\u0423\u0434\u0430\u043b\u0438\u0448\u044c \u0438 \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0448\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0438\u043b\u0438 \u043d\u0435 <strong>\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0448\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e<\/strong> (\u0434\u0430, \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e)<\/p>\n<\/li>\n<\/ul>\n<h4>\ud83e\udde8 \u0427\u0442\u043e \u0442\u044b \u0443\u0432\u0438\u0434\u0438\u0448\u044c \u0432 \u043b\u043e\u0433\u0430\u0445:<\/h4>\n<blockquote>\n<p><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\">*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349<\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"><br \/><\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"> *** Terminating app due to uncaught exception &#8216;NSInternalInconsistencyException&#8217;, reason: &#8216;Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.&#8217;<\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"><br \/><\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"> *** First throw call stack:<\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"><br \/><\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"> (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8)<\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"><br \/><\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"> libc++abi: terminating due to uncaught exception of type NSException<\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"><br \/><\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"> *** Terminating app due to uncaught exception &#8216;NSInternalInconsistencyException&#8217;, reason: &#8216;Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.&#8217;<\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"><br \/><\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"> *** First throw call stack:<\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"><br \/><\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"> (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8)<\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"><br \/><\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"> terminating due to uncaught exception of type NSException<\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"><br \/><\/abbr><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"*** Assertion failure in -[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes], PKPushRegistry.m:349 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) libc++abi: terminating due to uncaught exception of type NSException *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.' *** First throw call stack: (0x18d6152ec 0x18aa99a7c 0x18c911ea0 0x21c386494 0x105fa6064 0x105f9d19c 0x21c3856fc 0x105f8c584 0x105fa6064 0x105fc6f38 0x105f9c548 0x105f9c484 0x18d56e2b4 0x18d56c0b0 0x18d590700 0x1da0d1190 0x1901ae240 0x1901ac470 0x106e6862c 0x1b3f93ad8) terminating due to uncaught exception of type NSException Message from debugger: Terminated due to signal 9\"> Message from debugger: Terminated due to signal 9<\/abbr><\/p>\n<\/blockquote>\n<p>\u0418 \u044d\u0442\u043e \u043d\u0435 \u0448\u0443\u0442\u043a\u0430 \u2014 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0437\u0430\u0449\u0438\u0442\u044b Apple \u043e\u0442 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0439 (\u0432\u0440\u043e\u0434\u0435 \u0441\u043a\u0440\u044b\u0442\u043e\u0433\u043e VoIP-\u043f\u0443\u0448\u0430 \u0431\u0435\u0437 \u043f\u043e\u043a\u0430\u0437\u0430 \u0437\u0432\u043e\u043d\u043a\u0430).<\/p>\n<h4>\ud83d\udca1 \u041a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432 \u0444\u043e\u043d\u0435 \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u0435\u0442 \u043f\u0443\u0448 (<code>pushRegistry(_:didReceiveIncomingPushWith:for:completion:)<\/code>), \u0443 \u0442\u0435\u0431\u044f \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code class=\"swift\">func pushRegistry(_ registry: PKPushRegistry,                   didReceiveIncomingPushWith payload: PKPushPayload,                   for type: PKPushType,                   completion: @escaping () -&gt; Void) {          \/\/ 1. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c payload, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u0437\u0432\u043e\u043d\u043e\u043a (\u043b\u0438\u0431\u043e \u0438\u043d\u0444\u0443 \u043e \u043d\u0451\u043c)     let uuid = UUID()     let update = CXCallUpdate()     update.remoteHandle = CXHandle(type: .generic, value: \"SIP User\")          \/\/ 2. \u0420\u0435\u043f\u043e\u0440\u0442\u0438\u043c \u0437\u0432\u043e\u043d\u043e\u043a \u0432 CallKit     provider.reportNewIncomingCall(with: uuid, update: update) { error in         \/\/ 3. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c completion, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430         completion()     } }<\/code><\/pre>\n<blockquote>\n<p>\u2757\ufe0f \u0415\u0441\u043b\u0438 \u0442\u044b \u0437\u0430\u0431\u0443\u0434\u0435\u0448\u044c <code>reportNewIncomingCall(...)<\/code> \u2014 \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u0435.<br \/> \u2757\ufe0f \u0415\u0441\u043b\u0438 \u0437\u0430\u0431\u0443\u0434\u0435\u0448\u044c \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>completion()<\/code> \u2014 \u0442\u043e\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<\/blockquote>\n<h4>\u26a0\ufe0f \u0412\u0430\u0436\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/h4>\n<ul>\n<li>\n<p>\u041d\u0435 &#171;\u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0439&#187; \u0432\u044b\u0437\u043e\u0432 CallKit<strong>.<\/strong><br \/> iOS \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0434\u0430\u0451\u0442 \u0442\u0435\u0431\u0435 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434.<br \/> \u041f\u043e\u043f\u044b\u0442\u043a\u0430 &#171;\u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c SIP-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e&#187; \u0438\u043b\u0438 &#171;\u0440\u0430\u0437\u0431\u0443\u0434\u0438\u0442\u044c Core&#187; = \ud83d\udca5 \u0441\u043c\u0435\u0440\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0443\u0448 \u043f\u0440\u0438\u0448\u0451\u043b, \u043d\u043e \u0437\u0432\u043e\u043d\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u043b\u043e\u0433\u0438\u043a\u0435 \u0442\u0432\u043e\u0435\u0433\u043e \u0431\u044d\u043a\u0435\u043d\u0434\u0430) \u2014 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u0437\u043e\u0432\u0438 <code>reportNewIncomingCall(...)<\/code>, \u043f\u043e\u043a\u0430\u0436\u0438 \u0437\u0432\u043e\u043d\u043e\u043a, \u0438 \u0436\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0437\u043e\u0432\u0438<code>endCall(...)<\/code>. \u042d\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0431\u0438\u0442\u044b\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u043e, iOS \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 \u0435\u0433\u043e \u043f\u0443\u0448\u0435\u043c \u2014 \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>reportNewIncomingCall(...)<\/code> \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<h4>\ud83e\uddea \u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/h4>\n<ol>\n<li>\n<p>\u0423\u0431\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u044c VoIP push \u0447\u0435\u0440\u0435\u0437 Apple-\u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438\u043b\u0438 <code>curl<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0431\u0435\u0434\u0438\u0441\u044c, \u0447\u0442\u043e <code>reportNewIncomingCall(...)<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0448\u044c \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 &#171;\u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u043d\u043e&#187; \u043d\u0430 VoIP-\u043f\u0443\u0448\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0448\u044c.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 TLS<\/h3>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab\u0433\u043e\u043b\u043e\u0433\u043e\u00bb UDP- \u0438\u043b\u0438 TCP-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u0434\u043b\u044f SIP \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u0438 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0442.\u043a., \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, SIP-\u0442\u0440\u0430\u0444\u0438\u043a (\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043d\u0438\u043c) \u043c\u043e\u0433\u0443\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u0445\u0435\u043c\u0443 \u0441 SIP TLS \u0438 SRTP, \u0430 \u0442\u0430\u043a\u0436\u0435, \u0434\u043b\u044f \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043f\u043b\u043e\u0445\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 SIP ALG, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0440\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (5061) \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<pre><code class=\"swift\"> guard let identityAddress = core.interpretUrl(             url: \"sip:\\(config.username)@\\(config.domain)\",             applyInternationalPrefix: false         ),               let proxyAddress = core.interpretUrl(                   url: \"&lt;sip:\\(config.domain):\\(tlsPort);transport=\\(config.transport)&gt;\",                   applyInternationalPrefix: false               )         else {             return         }         do {             try identityAddress.setTransport(newValue: config.transport)             try identityAddress.setPort(newValue: tlsPort)             try setIdentityaddress(newValue: identityAddress)             try setServeraddress(newValue: proxyAddress) <\/code><\/pre>\n<pre><code class=\"swift\">let remoteAddress = try Factory.Instance.createAddress(addr: addr)  try remoteAddress.setPort(newValue: tlsPort)  try remoteAddress.setDomain(newValue: domain)  try remoteAddress.setDisplayname(newValue: username)  \/\/ \u2705 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0432\u043e\u043d\u043a\u0430  let callParams = try core.createCallParams(call: nil)  callParams.audioEnabled = true  callParams.videoEnabled = true \/\/ \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u043e  let call = core.inviteAddressWithParams(addr: remoteAddress, params: callParams)<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432:<\/p>\n<pre><code class=\"swift\"> core.verifyServerCn(yesno: false)  core.verifyServerCertificates(yesno: false)<\/code><\/pre>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0432\u0441\u0435 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Linphone \u0432 iOS-\u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0440\u0435\u0448\u0430\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0438 \u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439, \u0447\u0435\u043c \u0432 \u0441\u0430\u043c\u043e\u043c SDK. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0437\u0432\u043e\u043d\u043a\u043e\u0432 \u0441 CallKit \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043d\u0430 SIP-\u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0414\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441 \u0436\u0451\u0441\u0442\u043a\u0438\u043c\u0438 \u0441\u0440\u043e\u043a\u0430\u043c\u0438 Linphone \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/917206\/\"> https:\/\/habr.com\/ru\/articles\/917206\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0417\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u043e\u0434 iOS \u0441 2012 \u0433\u043e\u0434\u0430. \u0421 SIP \u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0438 \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043a\u0443\u0434\u0430 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c. \u041d\u0438\u0436\u0435 \u0434\u0435\u043b\u044e\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438.<br \/>\u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u0440\u0438\u0442\u0438\u043a\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0437\u0430\u0434\u0430\u0447\u0430: \u0432 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0435 \u0441\u0440\u043e\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0451\u043c\u0430 \u0437\u0432\u043e\u043d\u043a\u043e\u0432 \u0438 \u043d\u0430\u0431\u043e\u0440\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0430 \u0434\u043e\u043c\u043e\u0444\u043e\u043d.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u0441\u0442\u0430\u043b\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043d\u0430 \u0440\u044b\u043d\u043a\u0435 SIP-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <strong>Linphone<\/strong> \u0438 <strong>PJSIP<\/strong>.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u2014 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\"><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>Linphone<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>PJSIP<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u041f\u0440\u043e\u0449\u0435 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0421\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u0433\u0438\u0431\u0447\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">\ud83d\udd0a \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0443\u0434\u0438\u043e-\u043a\u043e\u0434\u0435\u043a\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430 (Opus, G722, Speex \u0438 \u0434\u0440.)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0414\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">\ud83d\udd10 SRTP \/ ZRTP<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0414\u0430 (\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0437\u0432\u043e\u043d\u043a\u0438)<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0414\u0430 (\u043d\u043e ZRTP \u0432\u0440\u0443\u0447\u043d\u0443\u044e)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">\ud83d\udcc4 \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u043c\u0435\u0440\u0435\u043d\u043d\u0430\u044f, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432 SDK<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0425\u043e\u0440\u043e\u0448\u0430\u044f, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\ud83d\udca1 <strong>\u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Linphone:<\/strong><br \/> \u2022 \u041d\u0443\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c SIP-\u0437\u0432\u043e\u043d\u043a\u0438 \u0432 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<br \/> \u2022 \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043e\u043a \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 UI-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b.<br \/> \u2022 \u041d\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 VoIP-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445.<br \/> \u2022 \u041d\u0443\u0436\u043d\u0430 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f Android, iOS \u0438 \u0434\u0435\u0441\u043a\u0442\u043e\u043f).<\/p>\n<p>\ud83e\udd13 <strong>\u041a\u043e\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c PJSIP:<\/strong><br \/> \u2022 \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442).<br \/> \u2022 \u0412\u0430\u0436\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<br \/> \u2022 \u0423\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 PJSIP \u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u0433\u043e\u0442\u043e\u0432\u044b\u0439 SIP-\u043a\u043b\u0438\u0435\u043d\u0442 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438, <strong>Linphone<\/strong> \u2014 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<br \/> \u0415\u0441\u043b\u0438 \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f VoIP-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 <strong>PJSIP<\/strong>.<\/p>\n<p>\u0418\u0437-\u0437\u0430 \u0441\u0436\u0430\u0442\u044b\u0445 \u0441\u0440\u043e\u043a\u043e\u0432 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043f\u044b\u0442\u0430 \u0441 SIP \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Linphone.<\/p>\n<h3>\ud83d\udd10 \u0410 \u0447\u0442\u043e \u043f\u043e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0443 Linphone?<\/h3>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b.<br \/> Linphone SDK (liblinphone) \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 <strong>GPLv2\/v3<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f <em>\u0432\u0441\u0435\u0433\u043e<\/em> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438:<\/p>\n<blockquote>\n<p>\u00abYou must make available the complete corresponding source code of the work under the same license.\u00bb<\/p>\n<\/blockquote>\n<p>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c SDK, \u043d\u043e \u0438 \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u043d\u0438\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 API\/\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0443 (\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 standalone-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435).<\/p>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e.<br \/>\u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e \u0443 <a href=\"https:\/\/www.linphone.org\/en\/belledonne-communications-company-overview\/\" rel=\"noopener noreferrer nofollow\"><strong>Belledonne Communications<\/strong>.<\/a><\/p>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Linphone \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443<\/h2>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c Linphone, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b CocoaPods, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 <strong>5.4.10<\/strong>. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430:<\/p>\n<blockquote>\n<p><code><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"'\/Users\/admin\/Library\/Developer\/Xcode\/DerivedData\/Airkey-bjqghwoaoqpanieccdctwipgfnhf\/Build\/Products\/Debug-iphonesimulator\/liblibbelle-sip-tester.dylib' (no such file), '\/Library\/Developer\/CoreSimulator\/Volumes\/iOS_21F79\/Library\/Developer\/CoreSimulator\/Profiles\/Runtimes\/iOS 17.5.simruntime\/Contents\/Resources\/RuntimeRoot\/usr\/lib\/system\/introspection\/liblibbelle-sip-tester.dylib' (no such file),\">'\/Users\/admin\/Library\/Developer\/Xcode\/DerivedData\/Airkey\u2011bjqghwoaoqpanieccdctwipgfnhf\/Build\/Products\/Debug\u2011iphonesimulator\/liblibbelle\u2011sip\u2011tester.dylib' (no such file), '\/Library\/Developer\/CoreSimulator\/Volumes\/iOS_21F79\/Library\/Developer\/CoreSimulator\/Profiles\/Runtimes\/iOS 17.5.simruntime\/Contents\/Resources\/RuntimeRoot\/usr\/lib\/system\/introspection\/liblibbelle\u2011sip\u2011tester.dylib' (no such file),<\/abbr><\/code><\/p>\n<\/blockquote>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 CocoaPods \u0438\u0437 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Linphone. \u041e\u043d\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0440\u0435\u0448\u0451\u043d\u043d\u043e\u0439 \u0443\u0436\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/p>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e <em>\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/em> \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044e <em>linphone-sdk 5.3.94<\/em>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a pod-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0432 <code>Podfile<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443:<\/p>\n<p><code><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p&gt;&lt;\/p&gt;\" data-abbr=\"source 'https:\/\/gitlab.linphone.org\/BC\/public\/podspec.git'\">source 'https:\/\/gitlab.linphone.org\/BC\/public\/podspec.git'<\/abbr><\/code><a href=\"https:\/\/gitlab.linphone.org\/BC\/public\/podspec.git'%EF%BF%BC\" rel=\"noopener noreferrer nofollow\"><br \/><\/a><br \/>\u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e <code>linphone-sdk<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 pod-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0433\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (<code>.podspec<\/code>) \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430 CocoaPods (\u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e Cocoapods \u0443\u0436\u0435 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435), \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<pre><code class=\"bash\"># \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 git clone https:\/\/gitlab.linphone.org\/BC\/public\/linphone-sdk.git # \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 cd linphone-sdk  # \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. git pull git submodule update --init \u2013recursive  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Python: # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0435\u0433\u043e  python3 -m pip install --upgrade pip  # \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435: python3 -m venv venv source venv\/bin\/activate  # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0438\u0442\u043e\u043d\u0430: pip install pystache six # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0432\u0441\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e:  pip list<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 cmake \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">cmake --preset=ios-sdk -G Ninja -B sdk -DENABLE_PQCRYPTO=YES -DLINPHONESDK_IOS_ARCHS=arm64 -DENABLE_NON_FREE_FEATURES=YES -DENABLE_GPL_THIRD_PARTIES=YES -DENABLE_G729=YES -DCMAKE_CONFIGURATION_TYPES=ReleaseWithDebInfo  \u0418 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u0430 ~ 3Gb (\u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0436\u0430\u0442\u044c \u0432 600 \u043c\u0431) cmake --build sdk --config RelWithDebInfo -j5  cmake --preset=ios-sdk \\                        -G Xcode \\   -B sdk \\   -DENABLE_PQCRYPTO=YES \\   -DLINPHONESDK_IOS_ARCHS=arm64 \\   -DENABLE_NON_FREE_FEATURES=YES \\   -DENABLE_GPL_THIRD_PARTIES=YES \\   -DENABLE_G729=YES \\   -DCMAKE_CONFIGURATION_TYPES=ReleaseWithDebInfo \\   -DCODE_SIGN_IDENTITY=\"\" \\   -DCMAKE_XCODE_ATTRIBUTE_DSYM_ENABLED=YES  cmake --build sdk --config RelWithDebInfo -j5  <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 dSYM-\u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b <code>GenerateFrameworks.cmake<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 App Store \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c:<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0438\u043b\u0434\u0430 \u0432 TestFlight<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0421 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 Swift Package Manager (SPM) \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0442\u0430\u043b\u0430 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0449\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443, \u0438\u043d\u0430\u0447\u0435 \u043f\u0430\u043a\u0435\u0442 <code>linphonesw<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b\u0441\u044f. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u044d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0443\u0436\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0430.<\/p>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 SDK<\/h2>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e SDK \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435.<\/p>\n<p>\u0427\u0430\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b SIP, \u043a\u0430\u0441\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 FreePBX, \u044f \u043f\u0440\u043e\u043f\u0443\u0449\u0443 \u2014 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043b\u043e\u0433, \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 Linphone \u2014 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0417\u0430\u0442\u0435\u043c \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044f\u0434\u0440\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b (linphonerc_default \u0438 linphonerc_factory) \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043d\u0430 SIP-\u0441\u0435\u0440\u0432\u0435\u0440\u0435.<br \/>\u0414\u0430\u043b\u044c\u0448\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0443\u0442\u0438 \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c: \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0432\u043e\u0434\u0441\u043a\u043e\u0439 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u0431\u0430\u043d\u0434\u043b\u0430).<br \/>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0430\u043c\u043e \u044f\u0434\u0440\u043e Linphone \u0441 \u044d\u0442\u0438\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d STUN-\u0441\u0435\u0440\u0432\u0435\u0440, \u0442\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f NAT-\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u2014 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0451 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f (ICE, STUN, TURN), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043c\u0435\u0448\u0430\u043b\u043e.<br \/>\u0417\u0430\u0442\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0438\u0447\u0438: CallKit (\u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e), \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043a\u0438, \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c. \u041f\u0443\u0448\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0440\u0435\u0448\u0435\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u043e \u0442\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 Linphone.<br \/>\u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e \u2014 \u044f\u0434\u0440\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. <br \/>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043e\u0447\u0438\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430:<\/p>\n<pre><code class=\"swift\">linphonesw.LoggingService.Instance.logLevel = .Debug         stop()         do {             let configName = \"linphonerc_default\"             let factoryName = \"linphonerc_factory\"                          guard let configTarget = FileManager.default                 .urls(for: .libraryDirectory, in: .userDomainMask)                 .first?                 .appendingPathComponent(configName) else {                 fatalError(\"Unable to write config file to library\")             }                          \/\/\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u044f\u0434\u0440\u043e                         core = try Factory.Instance.createCore(                 configPath: configTarget.relativePath,                 factoryConfigPath: Bundle.main.path(forResource: factoryName, ofType: \"\") ?? \"\",                 systemContext: nil             )                                       if let core = core {                 let stun = config.stun ?? \"none:\"                 let params = stun.split(separator: \":\", maxSplits: 1, omittingEmptySubsequences: false)                 let typeString = String(params[0])                 let serverString = String(params[1])                              let nat = try? core.natPolicy ?? core.createNatPolicy()                 if let natPolicy = nat {                         natPolicy.iceEnabled = false                         natPolicy.stunEnabled = false                         natPolicy.turnEnabled = false                     core.natPolicy = natPolicy                 }                              core.callkitEnabled = config.useCallKit                 core.pushNotificationEnabled = false                 core.videoDisplayEnabled = true                 core.adaptiveRateControlEnabled = true                 core.addDelegate(delegate: self)                  try core.start()                  core.clearAllAuthInfo()                 core.clearAccounts()<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044f\u0434\u0440\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0430\u0439\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>iterate() <\/code>c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439:<\/p>\n<pre><code class=\"swift\">                timer = Timer.scheduledTimer(withTimeInterval: 0.02, repeats: true) { [weak self] _ in                     guard let self = self else { return }                      if let call = self.core?.currentCall {                         let state = call.state                         let status = call.callLog?.status                         if state == .Error || state == .End || state == .Released || status == .AcceptedElsewhere {                             \/\/ \u041d\u0435 \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439                             LegacyLoggingAgent.log(.debug, message: \"\u26d4\ufe0f Sip Skipping iterate: Call is in state \\(state)\")                             return                         }        <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-473407","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/473407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=473407"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/473407\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=473407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=473407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=473407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}