关于sdk:融云-CallPlus-X通话场景一站式解决方案

融云近期上线的 CallPlus SDK,针对音视频呼叫场景独自设计后端服务 Call Server,信令延时低至 150ms,确保各端计时精确、统一;上线了音视频通话互转、灵便的多人通话、通话记录治理能力等性能。关注【融云寰球互联网通信云】理解更多 关注【融云寰球互联网通信云】后盾回复【CallPlus】获取演讲 PPT 在性能完整性和体验细腻度上,融云 CallPlus 均优于行业其余产品。具体见融云 CallPlus SDK 上线!1V1 音视频、近程服务类利用的实现利器。 围绕 CallPlus SDK,融云还交融了多项生态能力,从新定义了音视频通话场景化解决方案,适配 1V1 社交、近程医疗、在线面签等多种场景。 整体计划及实用场景整体计划通话场景一站式残缺解决方案由 CallPlus SDK + 音讯组件 + 美颜插件 + 内容审核 + 推送形成。 聊天组件:融云 IMKit SDK 提供聊天列表界面及聊天窗口、文字输入区、加号发送等音讯类型界面,让开发者不必撰写 UI 界面代码即可疾速实现 IM 性能。 美颜插件:提供开箱即用的美颜插件,开发者无需解决 CallPlus 与三方美颜 SDK 的对接,间接调用美颜设置办法即可失效。 美肤:磨皮、美白、红润、锐化、亮眼、美牙、去黑眼圈、去法令纹等 美型:大眼、圆眼、5 款脸型调整、瘦颧骨、瘦下颌骨、额头和下巴调整、瘦鼻、嘴巴调整、开眼角、眼距、眼镜角度、长鼻、缩人中、微笑嘴角等 滤镜:提供 75+ 款滤镜可选 内容审核:提供音频流和视频流审核服务,可针对色情、涉政、广告等语音、视频进行辨认,满足业务经营中的内容平安需要。并且,审核能力库还在继续更新,以确保提供“最当季”的审核服务。 离线推送:提供离线推送计划,当用户不在线时,反对利用将音频呼叫转成推送触达指标用户。 融云推送服务笼罩 FCM、APNs 等零碎通道,以及国内大多数手机厂商,比方小米、华为、OPPO、vivo、魅族、一加、Realme 等,实现了全平台的推送笼罩,保障了推送的成功率。 实用场景1V1 社交:陌生人社交场景外围玩法,次要有视频匹配和约会交友两类;其通话玩法多为呼叫某一指定用户或随机匹配某一用户两种。 融云提供高清、低提早的音视频通话服务,提早低至 200ms,保障各端用户的应用体验统一。此外,融云还可提供美颜、实时计费、音讯组件、内容审核等整体计划。 近程医疗:作为外围沟通模块集成于近程医疗利用,满足近程问诊、医疗培训、病理剖析、手术示教等场景需要。 近程面签:申请人视频连线客服,近程实现身份核验、面谈、审查审批、合同签订等流程。 以上两种场景,融云均可提供高清、低提早的音视频通话服务,以及云端录制、音讯组件等能力。 技术架构及难点攻克融云 CallPlus SDK 采纳了分层架构设计—— ...

September 26, 2023 · 1 min · jiezi

关于sdk:集成赋能-一图搞懂石墨文档-SDK

这是一个高度专业化分工的时代。 如果你经营一家餐厅,食材能够间接市场洽购,齐全不须要本人种植蔬菜瓜果。如果你想开发一款 AIGC 产品,没有必要本人去开发大模型,调用 ChatGPT、文心一言可能是更好的抉择。 很多时候,相较于所有的事件都“亲力亲为”,抉择一家业余成熟的的供应商,反而能让咱们更好聚焦主营外围业务,带来更高的效率和更低的老本。 同样的,当你的产品须要实现文档在线编辑预览时,除了本人开发一款云 Office ,咱们还有另外的抉择——石墨 SDK。

September 22, 2023 · 1 min · jiezi

关于sdk:Spaces-SDK专为实时协作功能开发设计的SDK

Spaces 装备了专用的 SDK,使开发人员可能在现有应用程序四周增加合作环境。 咱们十分兴奋地发表推出一款新产品——Spaces!专为实时合作设计的 SDK,具备一流的开发人员体验。 Spaces SDK 随附一套直观的 API,可让您在数天内构建头像堆栈、实时光标、成员地位和组件锁定等实时合作性能。每个利用程序接口都针对特定用例进行了优化,从而缩小了集成工作。 Spaces 一览特定性能 API:惟一一款装备专用实时合作 API 的产品,可用于增加头像堆栈、成员地位、实时光标和组件锁定。所有利用程序接口都通过优化,性能一流。例如,实时游标利用程序接口会主动批处理指针地位事件,以防止不必要的信息流,同时确保可忽略不计的提早。应用简略:Spaces 是一个简略直观的 SDK,能够与任何 Web 应用程序一起应用。高性能:由咱们通过市场验证的实时基础架构提供反对,该基础架构专为大规模可靠性而构建,并以五个九 SLA 和音讯传输保障为后盾。解锁实时体验:Spaces 旨在与 Ably 的其余补充产品(例如 Pub/Sub Channels)配合应用,以解锁整个应用程序中的端到端实时消息传递。尽管 Spaces 提供了反对团队同步合作并治理其参与者状态所需的性能,但 Pub/Sub 通道容许您在成员、后端和零碎设计中的任何其余局部之间灵便地播送和同步应用程序状态更改。通过利用内合作和共享空间加强您的产品有了 Spaces SDK,您就能够在应用程序的任何局部(或整个应用程序)上建设合作环境,这样协作者就能依据上下文理解每个人在做什么。空间成员能够看到其余成员在线、他们在看什么、他们在应用程序中的地位(能够是单元格、页面、幻灯片或文件夹)以及他们锁定用于编辑的任何特定组件。所有这些只需几行代码即可实现。无需更改现有零碎设计或应用程序架构。无需构建和保护实时基础设施,即可将合作扩大到数百万虚拟空间和用户。 SDK 性能亮点以下是测试版中可用的全套 API,还有更多打算中的 API: Space:在您的应用程序上设置的虚构合作空间,成员可在此进行实时合作。Members:连贯到虚构合作空间的在线用户。这就为终端用户的 avatar stack 提供了能源,头像堆栈是成员存在的可视化示意--显示他们在线并已连贯。Live cursor:虚拟空间中成员的指针地位,显示他们正在查看的内容。 live cursor API (实时游标利用程序接口)会主动批量发送信息,并提供所需的信息传输速率,以便同时晦涩运行 100 多个游标(不过咱们不倡议超过 15 个游标,以取得良好的用户体验)。Component locking:终端用户在进行编辑时,能够lock specific UI(锁定特定的用户界面组件),这样就不会与其余协作者产生混同,也不会影响空间内的整体合作。 明天就开始Spaces 目前处于测试阶段。要开始应用,只需 注册收费的开发者账户具体理解Spaces深刻理解 Spaces 文档报名加入网络研讨会原文:https://dev.to/ably/introducing-spaces-build-collaborative-environments-in-a-few-lines-of-code-3n01

September 21, 2023 · 1 min · jiezi

关于sdk:使用-Amazon-EC2-预留实例最大限度地节省成本和提高灵活性

简介:随着云计算一直扭转企业的经营形式,优化老本已成为首要任务。利用 Amazon EC2 预留实例是实现云端老本节约最无效的办法之一。本文将探讨什么是 Amazon EC2 预留实例,它与按需实例的区别,以及它在老本节约和灵活性方面提供的益处。 背景:云计算扭转了 IT 格局,使企业可能按需扩大基础设施,仅为所耗费的资源付费。然而,随着云使用量的增长,优化老本的需要也在增长。依据与 SEO 相干的统计数据,呈现在搜索引擎后果第一页的网站大概取得 95% 的天然流量,这凸显了云计算中老本优化的重要性。 亚马逊云科技开发者社区为开发者们提供寰球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、流动与比赛等。帮忙中国开发者对接世界最前沿技术,观点,和我的项目,并将中国优良开发者或技术举荐给寰球云社区。如果你还没有关注/珍藏,看到这里请肯定不要匆匆划过,点这里让它成为你的技术宝库!在深刻理解 Amazon EC2 预留实例的细节之前,让咱们先理解一下 Amazon EC2 的概念及其在云计算中的重要性。 Amazon Elastic Compute Cloud(EC2) 是一个可调整计算容量的网络服务。它使企业可能依据需要疾速扩大计算资源,无需提前投资硬件。 问题陈说:企业在优化云老本方面面临几个挑战。云使用量的不可预测性、稳定的工作负载以及对老本可预测性的需要,使得无效治理云费用变得艰难。 Amazon EC2 预留实例正是在这方面发挥作用。 下图显示了购买和应用预留实例的根本详情。 形容:Amazon EC2 预留实例为企业提供了一种优化云费用的经济高效解决方案。通过提前预留容量,企业能够确保较低的小时费率和满足预期工作负载的可用性。预留实例分为三种类型:标准型、可转换型和定时型。每种类型都提供不同水平的灵活性和老本节约选项,使企业可能依据特定需要抉择最合适的选项。 劣势和利用:与按需实例相比, Amazon EC2 预留实例的要害劣势之一是可实现显著的老本节约。通过承诺特定的实例类型、可用区和期限长度,企业能够将 EC2 计算成本升高高达 72% 。这种预付费模式容许进行长期打算和估算,为老本治理带来稳定性和可预测性。 预留实例还提供了灵活性和可伸缩性性能,可满足各种工作负载需要。应用预留实例,企业能够在同一实例系列内批改或替换实例,以适应一直变动的需要,而无需就义性能。这种灵活性确保了资源分配的最佳化和老本效益。 Amazon EC2 预留实例实用于宽泛的应用程序和用例。稳固的工作负载、可预测的流量模式和长期我的项目都能够从预留实例中受害。例如,运行具备稳固用户数的 Web 应用程序的公司能够提前预留所需容量,以确保可用性并实现可观的老本节约。同样,在顶峰购物节令经验可预测流量模式的企业,如电子商务网站,能够战略性地购买预留实例以匹配这些期间。 示例代码:要应用 Amazon SDK(Python) 启动 EC2 预留实例,能够应用以下代码片段: import boto3# 创立EC2客户端ec2_client = boto3.client('ec2')# 指定预留实例的参数instance_type = 't2.micro' instance_count = 1offering_id = 'your-offering-id'# 启动预留实例response = ec2_client.purchase_reserved_instances_offering( InstanceCount=instance_count, ReservedInstancesOfferingId=offering_id, DryRun=False)# 打印响应 print(response)论断:在这篇博文中,咱们探讨了 Amazon EC2 预留实例的概念及其在优化老本和进步云计算灵活性方面的重要性。咱们首先理解了 Amazon EC2 的背景以及企业在优化云老本方面面临的挑战。 ...

September 19, 2023 · 1 min · jiezi

关于sdk:融云观察国内外社交应用差异分析如何更快补齐功能和切换交互

9 月 21 日,融云直播课 社交泛娱乐出海最短变现门路如何疾速实现一款 1V1 视频社交利用? 欢送点击上方小程序报名~ 本文中,咱们将通过对 WhatsApp、微信、Telegram、Discord 几大社交软件的次要性能和交互体验比照,解析社交软件的安身立命之本,以及国内外产品的设计差别和出海启发。关注【融云寰球互联网通信云】理解更多 从会话、音讯到平安社交大佬的统一与分野WhatsApp、微信、Telegram、Discord,IM 即时通讯起家的四大社交巨头在 MAU、市场份额、用户群体等不同视角下均占据霸主位置。 数据起源:Business of Apps、eMarketer 依据咱们在社交大佬发家史,模拟才是终极胜利学明码?一文中对各利用策略布局和生态演进的剖析,四大巨头都在跑马圈地中实现了生态协同。 从场景来看,四款利用简直都在倒退中笼罩了集体和企业两大场景,并推出了领取、小程序或机器人等连贯人和场景的多样交互伎俩。 现在,微信曾经是人人艳羡的“超级 App”代表,WhatsApp 以超过 20 亿月活稳居社交软件头把交椅,Telegram 以独特的安全策略在审查最为严格的伊朗、俄罗斯和乌兹别克斯坦等国家也领有大量用户,Discord 则在 AIGC 大潮中成为了网页端和挪动端之外的第三大利用载体。 同为以 IM 即时通讯为外围出发点的社交利用,社交大佬们的不同门路和站位,与它们基于用户洞察而延长出的外围性能不无关系。 咱们以 IM 即时通讯所有服务背地必备的用户治理、会话治理、音讯治理、连贯治理四大能力来逐个分享。 点击图片查看 IM 底层能力形成 用户治理 来自社交大佬的启发更大的群、更细腻的交互社交利用流量生态存在显著重叠,大家都在抢夺同样的商业化资源和交易场景。 先行者定调,后来者追随。借鉴通过验证的产品设计是惯例操作,这样能够省去用户教育的老本以及操作领导的难度。 当用户关上一款社交利用,在巨头利用的洗礼之下,他们人造就会这样应用。 但放到出海语境下,在支流社交利用中还是有一些体验的显著差别点,也是出海利用须要去缝的缝儿。 更大的群,更聚焦的会话国内以微信为代表的群组下限为 500 人,而海内三款利用均领有更大的群组下限。 Telegram 一般群有 20 万下限,WhatsApp 一般群人数下限 512,但在此之外,二者还有人数下限别离为有限和 5000 的布告群/订阅群,以实现更大的人员笼罩。而 Discord 更是以单服务器人数下限 80 万的超大用户群而出名。 在如此宽泛的用户和宏大的群组下,社交产品也都设计了相干机制以帮忙用户专一沟通,排除“嘈杂的环境音”。 毕竟,社交利用的外围产品价值还是用户沟通。 比方,Telegram 在一般群之上还减少了话题群的设计,而 WhatsApp 和 Telegram 都有更加精密的免打搅及折叠/归档机制。 ...

September 5, 2023 · 1 min · jiezi

关于sdk:融云跨平台-SDK-自动生成技术的探索和实践

集赞获纸质版《作战地图》 报名 WICC · 出海嘉年华 作为即时通讯云的领创品牌,融云的通信云产品宽泛地服务于社交沟通、直播互动、实时社区、商业沟通等场景。移步【融云寰球互联网通信云】回复“地图”收费领 随着利用场景的丰盛和开发框架的倒退,原生双平台开发显然曾经难以满足需要。融云推出了跨平台 SDK,一套代码利用于多个平台,为不同平台用户提供统一体验,赋能全平台、多语言开发。 本文次要分享融云跨平台研发团队通过技术手段主动生成跨平台 SDK,使其更快适应原生 SDK 的发版节奏,为开发者提供更好体验的摸索实际。 平铺接口融云跨平台 SDK 反对 uni-app、Flutter、RN、Unity 等多个支流平台,涵盖 IM、RTC 双核心通信服务的性能。 通过跨平台 SDK,融云为开发者提供统一的性能和接口,让开发者无需在各个平台间纠结于不同的接口调用。所有都基于原生接口进行封装实现,提供相应平台的性能插件,差别仅在于所应用的开发语言。 为了在适配多个平台的过程中缩小反复工作,晋升效率,融云通过平铺接口和代码主动生成技术,对 SDK 中的反复代码进行自动化生成。 融云 SDK 的局部接口是基于面向对象的思维开发的,在历史版本的一直演变中,局部性能存在多端对齐难的问题。为了不便开发者应用 SDK,融云在原生 SDK 根底上进行了一次封装,也就是平铺层接口。 平铺接口具备以下劣势: 优化历史版本一直演变的性能接口,让开发者毋庸在雷同性能的接口上进行 “断舍离”。抹平 SDK 间的接口差别,保障 SDK 雷同的性能在不同设施上保持一致。下沉平台层的逻辑,包含数据校验、数据整合等操作。提供一套更简洁、更清晰的产品接口。实现平铺接口层建设后,最终的跨平台构造如下图所示。平台层调用平铺接口,再由平铺接口去调用原生 SDK 的性能接口。 主动生成目前业界支流的代码生成技术分为以下几类: 基于模版编排生成代码:能够基于模板疾速生成利用程序代码,开发者只须要关注逻辑开发。 基于可视化 UI 生成代码:将 UI 与命令行绑定,通过拖动 UI 生成对应代码,不过并不实用简单的我的项目工程。 基于代码语料生成代码:要有足够的语料,再基于一套生成规定生成指标代码。 基于人工智能技术生成代码:多和 AI 畛域的图像识别和机器学习技术联合。 融云跨平台 SDK 基于平铺接口调用原生 SDK 性能,以 connect 接口为例,其代码示例如下。 iOS 平铺 SDK connect 接口: - (NSInteger)connect:(NSString *)token timeout:(int)timeout databaseOpened:(nullable void (^)(NSInteger code))databaseOpenedBlock connected:(nullable void (^)(NSInteger code, NSString *userId))connectedBlock;Android 平铺 SDK connect 接口: ...

May 18, 2023 · 2 min · jiezi

关于sdk:使用ComPDFKit-C库编辑PDF文档

Delete pages CPDFDocument document = CPDFDocument.InitWithFilePath("***");int[] pages = { 2, 3, 4 };document.RemovePages(pages);document.WriteToLoadedPath();document.Release();Insert pages 在第三页后面插入空白页 CPDFDocument document = CPDFDocument.InitWithFilePath("***");document.InsertPage(2,600,800,null);document.WriteToLoadedPath();document.Release();Move pages把3~5页挪动到第七页前 CPDFDocument document = CPDFDocument.InitWithFilePath("***");document.MovePage(4, 5);document.MovePage(3, 4);document.MovePage(2, 3);document.WriteToLoadedPath();document.Release();Rotate pages把第三页逆时针旋转90度 CPDFDocument document = CPDFDocument.InitWithFilePath("***");document.RotatePage(2,-1);document.WriteToLoadedPath();document.Release();Exchange pages调换第三页和第五页 CPDFDocument document = CPDFDocument.InitWithFilePath("***");document.ExchangePage(2,4);document.WriteToLoadedPath();document.Release();Replace pages把A文件中第三页替换成B文件中的第五页 CPDFDocument document = CPDFDocument.InitWithFilePath("***");CPDFDocument otherDocument = CPDFDocument.InitWithFilePath("***");int[] deletePage = { 2 };document.RemovePages(deletePage);document.ImportPagesAtIndex(otherDocument,"4",2);document.WriteToLoadedPath();otherDocument.Release();document.Release();其余更多功能: 页面拆分、合并、提取。图片提取PDF转Office格局等

November 9, 2022 · 1 min · jiezi

关于sdk:MobTech-修改已审核通过的秒验产品信息

秒验是一款帮忙开发者实现一键验证性能的产品,从本源上升高企业验证老本, 无效进步拉新转化率,升高因验证带来的流失率,3秒实现手机号验证。具体的开发文档可去到MobTech官网文档核心查看。 开发者后盾反对批改曾经审核通过的秒验信息,首先登录开发者后盾,点击须要批改秒验审核信息的利用,点击更多信息点击从新提交审核如下所示,如需批改Android端信息,平台选项抉择Android。如需批改iOS端信息,平台选项抉择iOS,Android和iOS端信息都须要批改可同时抉择进行信息填写后点击提交审核。须要留神的是,从新批改提交审核期间,会影响已审核通过信息的可用性,所以如有信息批改需要请谨慎批改。以上信息填写实现,点击提交审核,审核通过后,秒验信息批改就实现了。

October 26, 2022 · 1 min · jiezi

关于sdk:MobPush-Android-SDK集成指南

开发工具:Android Studio集成形式:Gradle在线集成安卓版本反对:minSdkVersion 19集成筹备注册账号应用PushSDK之前,须要先在MobTech官网注册开发者账号,并获取MobTech提供的AppKey和AppSecret,详情能够点击查看注册流程MobPush后盾配置注册MobTech账号后,须要在MobTech后盾进行相干信息的配置,详情能够点击查看具体配置信息 MobPush流程图 增加配置在我的项目Gradle文件中注册MobSDKbuildscript { repositories { // 1.增加MobSDK Maven地址 maven { url "https://mvn.mob.com/android" } } dependencies { // 2.注册MobSDK classpath "com.mob.sdk:MobSDK2:+" }}在我的项目App Module的Gradle文件中增加插件和扩大 // 调用MobTech SDKapply plugin: 'com.mob.sdk'MobSDK { appKey "替换为MobTech官网申请的appkey" appSecret "替换为MobTech官网申请的appkey对应的appSecret" MobPush {}}在gradle.properties中增加代码MobSDK.spEdition=FP 增加混同代码在我的项目中增加如下混同代码 -keep class com.mob.**{*;}-dontwarn com.mob.**回传用户隐衷受权后果(submitPolicyGrantResult)为保障您的App在集成MobSDK之后可能满足工信部相干合规要求,您应确保App装置首次冷启动且获得用户浏览您《隐衷政策》受权之后,调用MobSDK.submitPolicyGrantResult回传隐衷协定受权后果。反之,如果用户不批准您App《隐衷政策》受权,则不能调用MobSDK.submitPolicyGrantResult回传隐衷协定受权后果。 请参考链接合规指南 /** * com.mob.MobSDK.class * 回传用户隐衷受权后果 * @param isGranted 用户是否批准隐衷协定 */ public static void submitPolicyGrantResult(boolean isGranted)示例代码 注:调用地位开发者能够本人指定,只需在应用SDK性能之前调用即可,强烈建议开发者在终端用户点击利用隐衷协定弹窗批准按钮后调用。MobSDK.submitPolicyGrantResult(true);  

October 24, 2022 · 1 min · jiezi

关于sdk:MobLink-Android-快速集成

开发工具:Android Studio集成形式:Gradle在线集成安卓版本反对:minSdkVersion 19集成前筹备注册账号应用MobSDK之前,须要先在MobTech官网注册开发者账号,并获取MobTech提供的AppKey和AppSecret,详情能够点击查看注册流程 MobLink后盾配置注册完Mob账号后,须要在Mob后盾进行相干信息的配置,详情能够点击查看具体配置信息 MobLink流程图 增加配置在我的项目Gradle文件中注册MobSDK buildscript { repositories { // 1.增加MobSDK Maven地址 maven { url "https://mvn.mob.com/android" } } dependencies { // 2.注册MobSDK classpath "com.mob.sdk:MobSDK2:+" }}在我的项目App Module的Gradle文件中增加插件和扩大// 增加插件apply plugin: 'com.mob.sdk'// 在MobSDK的扩大中注册MobLink的相干信息MobSDK { appKey "替换为mob官网申请的appkey" appSecret "替换为mob官网申请的appkey对应的appSecret" MobLink { uriScheme "您后盾配置的scheme" appLinkHost "您后盾开启AppLink时生成的Host" }}在gradle.properties中增加代码MobSDK.spEdition=FP 接口调用回传用户隐衷受权后果(submitPolicyGrantResult)为保障您的App在集成MobSDK之后可能满足工信部相干合规要求,您应确保App装置首次冷启动且获得用户浏览您《隐衷政策》受权之后,调用Mob提交到的隐衷协定回传函数MobSDK.submitPolicyGrantResult回传隐衷协定受权后果。 反之,如果用户不批准您App《隐衷政策》受权,则不能调用MobSDK.submitPolicyGrantResult回传隐衷协定受权后果。 相干隐衷申明请参考这个链接:合规指南 /** * com.mob.MobSDK.class * 回传用户隐衷受权后果 * @param isGranted 用户是否批准隐衷协定 */ public static void submitPolicyGrantResult(boolean isGranted)示例代码调用地位开发者能够本人指定,只需在应用SDK性能之前调用即可,强烈建议开发者在终端用户点击利用隐衷协定弹窗批准按钮后调用。 MobSDK.submitPolicyGrantResult(true);获取场景还原参数(setRestoreSceneListener)//com.mob.moblink/** * 全局场景还原监听器 * @param listener 回调监听 */ public static void setRestoreSceneListener(RestoreSceneListener listener)示例代码 ...

October 19, 2022 · 1 min · jiezi

关于sdk:用声网-Android-UIKit-为实时视频通话应用添加自定义背景丨声网-SDK-教程

应用声网 SDK 和 UIKit 创立视频推流利用非常简单,而且声网还有许多性能,能够进步视频通话的品质和便利性。例如,咱们能够在视频通话过程中应用虚构背景,为视频通话削减趣味性。 咱们能够通过以下三种形式自定义视频通话的背景: ● 应用图像作为背景 ● 应用纯色背景 ● 在现有背景上利用含糊成果 本教程教大家应用声网 Android SDK 和 Android UIKit 在 Android 中增加虚构背景。 原文作者:Rishav Naskar 原文链接: https://www.agora.io/en/blog/add-custom-backgrounds-to-your-live-video-calling-application-using-the-agora-android-uikit/ 01 后期筹备● 一个声网开发者账户 ● 理解如何应用声网 Android UIKit 创立直播推流 Android 利用(可在官网 GitHub 搜寻查看) ● 理解 Android 开发的基础知识 ● Android Studio ● 一个 Android 设施 02 设置第一步:如果你不打算把它集成到现有的我的项目中,能够在 Android Studio 中创立一个新的 Android 应用程序。 第二步:返回 GitHub,克隆声网 UIKit GitHub 资源库,并在文件浏览器中关上此我的项目。 你会在这个克隆的 UIKit 我的项目中找到 agorauikit_android 目录,把这个目录复制并粘贴到你的应用程序中的父级的地位。这个目录蕴含了声网的 Android UIKit,是扩大工作的要害。 第三步:确保你的我的项目级 build.gradle 有以下内容: ...

October 17, 2022 · 3 min · jiezi

关于sdk:秒验-客户端SDK返回码

October 12, 2022 · 0 min · jiezi

关于sdk:秒验-运营商SDK错误码

中国移动 中国联通 中国电信

October 12, 2022 · 1 min · jiezi

关于sdk:ShareSDK-Android端权限说明

ShareSDK应用权限状况 去除非必须的权限一般权限去除能够在module模块中的build.gradle文件中增加以下的配置去除Gradle主动加载的可选权限办法,去除之后无需增加其余配置性能能够失常应用: permissions { exclude "须要去除的权限1", "须要去除的权限2"}比方须要去除掉“android.permission.READ_PHONE_STATE”权限,则间接增加如下配置即可: MobSDK { appKey "Mob开发者后盾申请的AppKey" appSecret "Mob开发者后盾申请的AppSecret" ShareSDK { devInfo { ... } } permissions { exclude "android.permission.READ_PHONE_STATE", }}QUERY_ALL_PACKAGES权限去除阐明:Android高版本(Android10以上)判断第三方平台是否装置须要应用QUERY_ALL_PACKAGES权限,如果没有这个权限ShareSDK分享、受权无奈应用,不过因为Google商店对QUERY_ALL_PACKAGES权限审核比拟严格,如您不心愿应用QUERY_ALL_PACKAGES权限,能够应用咱们提供exclude的形式去除QUERY_ALL_PACKAGES权限: MobSDK { appKey "Mob开发者后盾申请的AppKey" appSecret "Mob开发者后盾申请的AppSecret" ShareSDK { devInfo { ... } } permissions { exclude "android.permission.QUERY_ALL_PACKAGES", }}须要留神的是去除QUERY_ALL_PACKAGES权限之后,须要在Manifest中通过"queries标签"手动配置一下须要应用的第三方平台包名,相似这样: <manifest package="xxxxxx"> ......<queries> <!--WhatsApp--> <package android:name="com.whatsapp" /> <!--Facebook--> <package android:name="com.facebook.katana" /> <!--Line客户端--> <package android:name="jp.naver.line.android" /> <!--Twitter--> <package android:name="com.twitter.android" /> <!--WeChat--> <package android:name="com.tencent.mm" /> <!--QQ--> <package android:name="com.tencent.mobileqq" /> <!--instagram--> <package android:name="com.instagram.android" /> <!--FacebookMessenger--> <package android:name="com.facebook.orca" /> <!--新浪微博--> <package android:name="com.sina.weibo" /> ...... </queries>......</manifest>

October 11, 2022 · 1 min · jiezi

关于sdk:ShareSDK-第三方平台分享参数说明

本文介绍应用 ShareSDK 时,各个社交平台的分享状况阐明 新浪微博分享规定新浪微博反对分享类型: 利用内分享: 文字,文字+图片,链接 客户端分享:文字,文字+图片,链接,视频,多图(只反对本地视频分享) 留神:网页分享,文字+图片是不会显示图片的,只会显示文字,链接分享不论是网页分享还是客户端分享都不会显示图片,如果必须要文字图片都带的话,须要把链接拼接在text前面分享才行。或者审核分享linkcard模式。另外微博不反对分享动态图。 多张图片分享并开启story分享的话,默认取第一张图 参数阐明: text:不能超过140个汉字image:图片最大不超过5M,仅反对JPEG、GIF、PNG格局latitude:无效范畴:-90.0到+90.0,+示意北纬北纬longitude:无效范畴:-180.0到+180.0,+示意东经QQ好友分享规定QQ好友反对分享类型: 客户端分享:文字,图片(网络和本地的GIF图片也反对),链接,音乐链接,视频链接(音乐,视频都只反对网络视频,音乐链接) 参数阐明: text:最多40个字符title:最多30个字符,超出局部会被截断url :URL 地址,最长 512 个字符thumbImage:预览图数据,最大1M字节image:最大5M字节QQ空间分享规定QQ空间反对分享类型: 客户端分享:文字,图片,链接,相册视频,视频链接 参数阐明: url: 1、必须用域名网址 ; 2、url 不能含有中文,如果有中文须要本人进行转码; title:最多200个字符; text:最多600个字符; 集成QQ和QQ空间可能遇到的问题: QQ登录显示错误码110406:这个不是咱们这边的问题,您须要分割一下QQ互联的客服。这个谬误是QQ那边返回的,是说你用的账号登陆必须是你本人注册利用的账号,如果用他人的就要加为测试账号,加为测试账号的QQ必须是本人的好友,如果不行的话,就把你的利用通过QQ的审核。QQ登录显示错误码110401: 腾讯开放平台可能注册的为网页利用。QQ分享图文和音乐,在PC版本的QQ上可能只看到一条连贯,因为PC版本的QQ只会对其白名单的链接作截图,如果不在此名单中,则只是显示连贯而已。如果只分享图片在PC端看不到图片的,只显示了null,在手机端会显示图片和null字段。分享图文链接到QQ 空间胜利,但链接图片没有显示:图片最好不要传带 ip 或者端口号之类的图片链接。微信(好友、朋友圈、珍藏)分享规定微信好友反对分享类型: 客户端分享:文字,图片,链接,音乐链接,视频链接,利用音讯,表情(就是本地GIF,网络GIF不反对),文件(本地视频),小程序以及间接关上小程序 微信朋友圈反对分享类型: 客户端分享:文字,图片,链接,音乐链接,视频链接 微信珍藏反对分享类型: 客户端分享:文字,图片,链接,音乐链接,视频链接,文件(本地视频) 参数阐明 title:512Bytes以内description:1KB以内imageData:大小不能超过10MimagePath:大小不能超过10M(传递的imagePath门路不能超过10KB)imageUrl:长度不能超过10K(图片链接,反对JPG、PNG格局,较好的成果为大图360200,小图200200 )ThumbImage:内存大小不能超过32K的png图musicUrl:长度不能超过10KvideoUrl:长度不能超过10Kurl:不能为空且长度不能超过10K支付宝(好友,朋友圈)分享规定支付宝好友反对分享类型: 客户端分享:文字,图片,链接 支付宝朋友圈反对分享类型: 客户端分享:图片,链接 钉钉分享规定钉钉反对分享类型: 客户端分享:文字,图片,链接 腾讯微博分享规定腾讯微博反对分享类型: 网页分享:文字,图片 留神:腾讯微博平台已敞开,新的利用已不能注册。新用户倡议不要加这个平台了 美拍分享规定美拍反对分享类型: 客户端分享:本地图片,本地视频,相册图片,相册视频 留神:须要设置 相册权限 <key>NSPhotoLibraryUsageDescription</key><string>从手机相册中抉择</string>豆瓣分享规定豆瓣反对分享类型: 网页分享:文字,图片,链接 参数阐明 image:反对JPEG,GIF,PNG格局,最大3M 印象笔记分享规定印象反对国内版本分享类型: 网页分享:文字,图片,视频 印象反对国外版本分享类型: 网页分享:文字,图片,视频 留神 印象笔记 正式环境 分为 国内版本 海外版 数据不能互通 ConsumerKey也不能通用 ...

October 10, 2022 · 1 min · jiezi

关于sdk:MobTech-ShareSDK-后台配置说明

关上在Mob后盾注册的利用,点击进去,开展ShareSDK产品,相干配置如下:社会化平台设置(非必须)蕴含了咱们所有反对的平台,能够在这里管制配置每个平台的初始化信息,点击平台左边设置按钮,以微信为例如图:如果把状态开关关上,那么就必须要配置微信的AppId,AppSecret以及Universal Link的值,后盾配置优先级高于代码设置,如果配置了会优先读取后盾配置信息。如果状态开关敞开掉,那么能够不配置AppId等信息,这个并不是必须要配置的,其余平台同理。回流短链配置 (非必须)首先把回流短链总开关关上,如下图而后设置每个平台是否应用转短链,如下图另外须要在短链域名设置选项增加白名单设置,须要把您本人分享的链接域名配置进来,如下图当下面都设置实现,分享的长链接就能够主动转为短链,默认转成短链域名是l.mob.com,另外也能够统计到回流数,就是分享进来的链接被他人点击的次数。如果想用本人的域名,须要在域名设置中,设置本人的域名,同时进行以下配置Universal link配置(非必须)在微信,QQ,微博,Line等平台分享的时候,因为平台减少了Universal link的校验,须要用户生成Universal link在平台上配置应用。用户能够本人生成,须要有如下条件:必须有一个反对HTTPS的域名,并且领有该域名下上传到根目录的权限(为了上传Apple指定文件)为了给用户提供便当,咱们这边也能够帮用户生成Universal link。在咱们这边注册利用增加了ShareSDK产品,后盾就会帮生成Universal link,这个Universal link针对利用是惟一的,每个利用都会生成不同的Universal link。如果要应用咱们的,还须要配置好相应的Team id等信息,如下图Team id:开发团队的ID,可在苹果开发者后盾查看Bunlde id:开发者账号下的所有利用对应一个Bundle id,可见于我的项目Info.plist文件的Bundle identifier,是我的项目惟一标识,务必于我的项目中保持一致QQ AppId:如果须要分享qq平台,须要填写这个信息,填写qq初始化里的AppId即可将以上信息都填写好之后,保留设置,能力应用咱们生成的Universal link信息配置。

September 19, 2022 · 1 min · jiezi

关于sdk:MobTech秒验-Android端如何在授权界面添加短信登录按钮

SecVerifySDK提供了两种自定义受权界面的形式,别离为UISetting,举荐应用Adapter形式来进行受权界面的自定义,也可应用Adapter联合UISetting的形式(如实现关上页面动画)。编写xml布局应用adapter通过自行编写受权页面布局的形式来实现自定义,所以须要先绘制本人的xml布局。 在res/layout下新建sec_diy.xml,如图: 编写xml内容,可参考下方代码: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFF4EB" android:orientation="vertical"> <ImageView android:id="@+id/iv_logo" android:layout_width="wrap_content" android:layout_height="100dp" android:layout_gravity="center_horizontal" android:layout_marginTop="50dp" android:adjustViewBounds="true" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/tv_phone" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" android:gravity="center" android:textSize="18sp" android:textStyle="bold" tools:text="135****5851" /> <Button android:id="@+id/bt_login" android:layout_width="match_parent" android:layout_height="55dp" android:layout_marginLeft="15dp" android:layout_marginTop="30dp" android:layout_marginRight="15dp" android:background="@drawable/loginbutton_bg" android:text="登录" android:textColor="#fff" /> <TextView android:id="@+id/tv_agreement" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="15dp" android:text="登录即批准中国移不动认证服务协定并应用本机号码登录" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="中国移不动提供认证服务" /> <ImageView android:id="@+id/iv_sms_login" android:layout_width="40dp" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" android:adjustViewBounds="true" android:src="@drawable/icon_sms" /></LinearLayout> 编写代码在我的项目中任意地位创立MyLoginAdapter类,编写代码如下: package xx.xx.xxx;import android.app.Activity;import android.content.Intent;import android.graphics.Color;import android.os.Build;import android.text.SpannableString;import android.text.Spanned;import android.text.TextPaint;import android.text.TextUtils;import android.text.style.ClickableSpan;import android.text.style.ForegroundColorSpan;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.Button;import android.widget.CheckBox;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import com.mob.MobSDK;import com.mob.secverify.SecVerify;import com.mob.secverify.ui.AgreementPage;import com.mob.secverify.ui.component.LoginAdapter;import com.mz.smssdk.SMSActivity;/*** 应用Adapter的形式批改受权页面ui,通过批改受权页面的控件属性,达到批改目标* <p>* * todo 须要留神以下内容* * 1、在完结以后受权页面时须要调用SecVerify.finishOAuthPage();来完结,否则会影响下次进入* * 2、在点击登录之后,不管登录胜利或者失败,须要SecVerify.finishOAuthPage();完结以后页面, 否则会影响电信受权页面的回调导致页面无奈完结* * 3、设置脱敏手机号须要在onResume中设置,onCreate中可能还未拿到这个脱敏手机号*/public class MyLoginAdapter extends LoginAdapter { private Activity activity; private ViewGroup vgBody; private LinearLayout vgContainer; private RelativeLayout rlTitle; private Button btnLogin; private TextView tvSecurityPhone; private TextView tvOwnPhone; private TextView tvAgreement; private CheckBox cbAgreement; private View contentView; //可用于判断展现运营商隐衷协定 private String operator; private String url; @Override public void onCreate() { super.onCreate(); // 获取受权页面原有控件 init(); // 沉迷状态栏 setImmTheme(); } private void init() { vgBody = getBodyView(); vgContainer = (LinearLayout) getContainerView(); activity = getActivity(); rlTitle = getTitlelayout(); btnLogin = getLoginBtn(); tvSecurityPhone = getSecurityPhoneText(); cbAgreement = getAgreementCheckbox(); operator = getOperatorName(); //暗藏 受权页面原有内容 vgBody.setVisibility(View.GONE); rlTitle.setVisibility(View.GONE); //获取本人的View contentView = View.inflate(activity, R.layout.sec_diy, null); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); //增加本人的View到受权页面上,留神不要应用Activity来设置 vgContainer.addView(contentView, params); } @Override public void onResume() { super.onResume(); // 弹出脱敏手机号 Toast.makeText(activity, "脱敏手机号" + tvSecurityPhone.getText(), Toast.LENGTH_SHORT).show(); // 获取本人xml的手机号TextView TextView phone = contentView.findViewById(R.id.tv_phone); // 给本人xml的手机号控件赋值 phone.setText(getSecurityPhoneText().getText()); // 给本人xml的手机号控件增加点击事件 phone.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SecVerify.finishOAuthPage(); Toast.makeText(activity, "脱敏手机号" + tvSecurityPhone.getText(), Toast.LENGTH_SHORT).show(); } }); // 获取本人xml的登录按钮Button Button button = contentView.findViewById(R.id.bt_login); ImageView smsLogin = contentView.findViewById(R.id.iv_sms_login); // 给本人xml的登录按钮Button增加点击事件 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Toast.makeText(activity, "cbAgreement.isChecked():" + cbAgreement.isChecked(), Toast.LENGTH_SHORT).show(); //肯定要解决!!!! 点击本人登录按钮时须要将默认的复选框设置为选中,并且点击原有的受权页面登录按钮 //肯定要解决!!!! 点击本人登录按钮时须要将默认的复选框设置为选中,并且点击原有的受权页面登录按钮 //肯定要解决!!!! 点击本人登录按钮时须要将默认的复选框设置为选中,并且点击原有的受权页面登录按钮 cbAgreement.setChecked(true); btnLogin.performClick(); } }); smsLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { activity.startActivity(new Intent(activity, SMSActivity.class)); } }); // TextView agreement = contentView.findViewById(R.id.agreement); // agreement.setText(buildSpanString()); } private SpannableString buildSpanString() { String operatorText = ""; if (OperatorUtils.getCellularOperatorType() == 1) { operatorText = "《中国移动认证服务条款》"; url = "https://wap.cmpassport.com/resources/html/contract.html"; } else if (OperatorUtils.getCellularOperatorType() == 2) { operatorText = "《中国联通认证服务条款》"; url = "https://ms.zzx9.cn/html/oauth/protocol2.html"; } else if (OperatorUtils.getCellularOperatorType() == 3) { operatorText = "《中国电信认证服务条款》"; url = "https://e.189.cn/sdk/agreement/content.do?type=main&appKey=&hidetop=true&returnUrl="; } String ageementText = "登录即批准" + operatorText + "及《自有隐衷协定》和" + "《自有服务策略》、《其余隐衷协定》并受权秒验应用本机号码登录"; String cusPrivacy1 = "《自有隐衷协定》"; String cusPrivacy2 = "《自有服务策略》"; String cusPrivacy3 = "《其余隐衷协定》"; int baseColor = MobSDK.getContext().getResources().getColor(R.color.balck); int privacyColor = Color.parseColor("#FFFE7A4E"); int cusPrivacyColor1 = Color.parseColor("#FF4E96FF"); int cusPrivacyColor2 = Color.parseColor("#FF4E96FF"); int cusPrivacyColor3 = Color.parseColor("#FFFE7A4E"); SpannableString spanStr = new SpannableString(ageementText); int privacyIndex = ageementText.indexOf(operatorText); spanStr.setSpan(new ForegroundColorSpan(baseColor) , 0, ageementText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置文字的单击事件 spanStr.setSpan(new ClickableSpan() { @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); } @Override public void onClick(View widget) { gotoAgreementPage(url, ""); } }, privacyIndex, privacyIndex + operatorText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置文字的前景色 spanStr.setSpan(new ForegroundColorSpan(privacyColor), privacyIndex, privacyIndex + operatorText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); if (!TextUtils.isEmpty(cusPrivacy1)) { int privacy1Index = ageementText.indexOf(cusPrivacy1); //设置文字的单击事件 spanStr.setSpan(new ClickableSpan() { @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); } @Override public void onClick(View widget) { gotoAgreementPage("https://www.mob.com", null); // if (wrapper != null && wrapper.cusAgreement1Clicked != null){ // wrapper.cusAgreement1Clicked.handle(); // } } }, privacy1Index, privacy1Index + "《自有隐衷协定》".length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置文字的前景色 spanStr.setSpan(new ForegroundColorSpan(cusPrivacyColor1), privacy1Index, privacy1Index + cusPrivacy1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (!TextUtils.isEmpty(cusPrivacy2)) { int privacy2Index = ageementText.lastIndexOf(cusPrivacy2); //设置文字的单击事件 spanStr.setSpan(new ClickableSpan() { @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); } @Override public void onClick(View widget) { gotoAgreementPage("https://www.baidu.com", null); } }, privacy2Index, privacy2Index + cusPrivacy2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置文字的前景色 spanStr.setSpan(new ForegroundColorSpan(cusPrivacyColor2), privacy2Index, privacy2Index + cusPrivacy2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } if (!TextUtils.isEmpty(cusPrivacy3)) { int privacy3Index = ageementText.lastIndexOf(cusPrivacy3); //设置文字的单击事件 spanStr.setSpan(new ClickableSpan() { @Override public void updateDrawState(TextPaint ds) { ds.setUnderlineText(false); ds.linkColor = Color.parseColor("#FFFFFF"); } @Override public void onClick(View widget) { gotoAgreementPage("https://www.baidu.com", null); } }, privacy3Index, privacy3Index + cusPrivacy3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置文字的前景色 spanStr.setSpan(new ForegroundColorSpan(cusPrivacyColor3), privacy3Index, privacy3Index + cusPrivacy3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } return spanStr; } //可替换为跳转本人的webview private static void gotoAgreementPage(String agreementUrl, String title) { if (TextUtils.isEmpty(agreementUrl)) { return; } AgreementPage page = new AgreementPage(); Intent i = new Intent(); i.putExtra("extra_agreement_url", agreementUrl); if (!TextUtils.isEmpty(title)) { i.putExtra("privacy", title); } page.show(MobSDK.getContext(), i); } private void setImmTheme() { if (Build.VERSION.SDK_INT >= 21) { // 设置沉迷式状态栏 View decorView = activity.getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; decorView.setSystemUiVisibility(option); // 设置状态栏通明 activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); activity.getWindow().setStatusBarColor(Color.TRANSPARENT); if (Build.VERSION.SDK_INT >= 23) { activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } } //是否占用状态栏的地位,false为占用,true为不占用 vgContainer.setFitsSystemWindows(false); //是否全屏 // activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //如果不想适配P以上的水滴屏和刘海屏,能够在这里设置layoutInDisplayCutoutMode为其余的值 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { WindowManager.LayoutParams lp = activity.getWindow().getAttributes(); lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; activity.getWindow().setAttributes(lp); } } public MyLoginAdapter() { } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(activity, "我敞开了", Toast.LENGTH_SHORT).show(); }}domo体验 ...

September 8, 2022 · 4 min · jiezi

关于sdk:多路混流实操流程

性能简介混流是把多路音视频流从云端混合成单流的技术。 1混流长处升高了开发实现上的复杂性,例如当有 N 个主播进行连麦,如果采纳混流,观众端不用同时拉 N 路视频流,开发实现上省去了拉 N 路流并布局的步骤。升高了对设施的性能要求,缩小设施的性能开销和网络带宽的累赘。例如当连麦方过多时,观众端须要拉 N 路视频流,须要设施硬件上能反对同时拉 N 路流。转推多路 CDN 实现简略,只须要在混流配置时按需减少输入流。观众端须要回放多主播连麦视频时,仅须要在 CDN 上开启录制的配置。鉴黄时只须要察看一个画面,不用再同时查看多个画面。2混流常见应用场景当设施不反对同时拉 N 路流时应用混流。须要多个视频画面合成一个视频时应用混流,比方教育类场景,直播老师和学生的画面。3混流应用阐明SDK 既反对音视频混流,也反对纯音频混流。 开发者在拉流 / 推流胜利后开始混流。比方主播 A 与观众 B 胜利连麦后,胜利拉取到观众 B 的画面时即开始混主播 A 的流和观众 B 的流。也能够依据需要,在其余适合机会进行混流。 4混流零碎架构应用混流性能时,SDK 将流推到 ZEGO 服务器上,ZEGO 服务器将指定流混合成一路流后再推到 CDN 上,观众从 CDN 上拉混流观看。 前提条件在混流前,请确保已在我的项目中实现根本的实时音视频性能,详情请参考 疾速开始 相干文档。 混流性能不是默认开启的,应用前请在 ZEGO 控制台 自助开明(开明步骤请参考 项目管理 - 服务配置 中的“混流”),或分割 ZEGO 技术支持开明。 应用步骤混流前房间内须要有已存在的流。发动混流的设施能够混房间内已有的其余设施推的流而本端不必推流,也能够本端推流后再混本人推的流。 1设置混流配置ZegoMixerTask 是 SDK 中定义的混流工作配置对象,其中蕴含输出流布局、输入流等信息。 混流配置类原型: export class ZegoMixerTask {   // 混流工作ID   taskID: string   // 混流工作对象的输出流列表(必填)   inputList: ZegoMixerInput[]   // 混流工作对象的输入列表(必填)   outputList: ZegoMixerOutput[]   // 混流工作对象的视频配置(可选,若对视频画面布局有要求,则必须显式填写输入的分辨率)   videoConfig: ZegoMixerVideoConfig   // 混流工作对象的音频配置(可选)   audioConfig: ZegoMixerAudioConfig   // 是否开启混流中携带各输出流的声浪信息   enableSoundLevel: boolean   // 通过 TaskID 结构一个混流工作对象   constructor(taskID: string) {       this.taskID = taskID       this.inputList = []       this.outputList = []       this.audioConfig = {bitrate: 48, channel: ZegoAudioChannel.Mono, codecID: ZegoAudioCodecID.Normal}       this.videoConfig = {width: 360, height: 640, fps: 15, bitrate: 600}       this.enableSoundLevel = false   }}1.1 创立混流工作对象新建一个混流工作对象,再别离设置输出、输入等参数。 ...

August 26, 2022 · 3 min · jiezi

关于sdk:产品说明丨如何使用MobPush快速创建应用

MobPush是MobTech推出的一款收费的推送服务工具,客户端SDK反对iOS和Android两大平台,集成不便简略快捷,且提供残缺的可视化数据和弱小的治理后盾  1.进入工作台关上http://www.mob.com并登录,抉择“开发者平台”即可进入工作台。  2.创立利用点击“创立利用”按钮,上传利用Logo和利用名称实现创立。 3.增加SDK产品点击"立刻接入"按钮或加号,抉择SDK产品后点击稍后集成。

August 10, 2022 · 1 min · jiezi

关于sdk:智能化推送服务MobPush产品使用介绍

MobPush是袤博科技MobTech推出的一款收费的推送服务工具,客户端SDK反对iOS和Android两大平台,集成不便简略快捷,且提供残缺的可视化数据和弱小的治理后盾 MobPush次要性能 MobPush劣势 推送流程Android推送流程: iOS推送流程: 音讯类型MobPush 提供提供三种推送音讯模式:告诉、自定义音讯、本地告诉。 告诉告诉是指在手机告诉栏(状态栏)上会有一条告诉音讯的展现。告诉次要给用户发送揭示类音讯,如热点内容、促销流动、版本更新揭示、订单状态、领取状态揭示等利用场景。自定义音讯自定义音讯又可称作透传音讯,是MobPush自定义的音讯协定,由MobPush SDK端收到音讯后透传给App解决,MobPush是不会把音讯展现到告诉类。本地告诉 本地告诉是不依赖于网络,无需通过服务器亦可依照条件向以后设施发送一条可见告诉,本地告诉通常用于特定工夫收回的告诉揭示,如闹钟这种固定工夫告诉场景。 MobPush SDK 可上报本地告诉用于开发者查看告诉明细。告诉属性MobPush反对定时和非定时设置推送属性 定时对某些须要定时发送推送的需要,MobPush能够在开发者平台设置发送工夫,可设置一个小时当前须要的推送音讯。非定时非定时即及时音讯,推送工作设置后就会立刻进入发送队列。推送指标MobPush反对推送指标蕴含:全副人群、设置标签、设置别名、Registration ID、地理位置 标签在MobPush 中,标签通常是给装置App的某个非凡群体用户打上雷同标签,能够给每个用户打上最多100个标签, 标签能够作为创立推送的指标人群抉择之一。例如: man 、 women、老用户。别名在MobPush中,一个设施只能指定一个别名,而且对同一个App中的用户,MobPush倡议设置成不反复的别名,这样能够依据别名来确定惟一用户。例如能够设置App用户零碎的惟一标识如Id 、 手机号码为别名。Registration IDRegistration ID是MobPush SDK初始化胜利后,MobPush给每个设施调配的惟一标识(同一个手机不同App的Registration ID不同), 能够通过iOS SDK、Android - SDK提供接口获取。开发者能够通过指定Registration ID给繁多设施发送推送。地理位置 地理位置是MobPush提供的可指定非凡地区的设施发送推送性能,以后能够- 针对某个城市发送推送。用户分群能够针对不同用户进行分群设置,能够依照标签汇合+地理位置+注册工夫+在线工夫+零碎版本等进行分群设置,从而达到更加精细化范畴指标推送。常见名词解释AppKey 注册MobTech开发者后,进入控制台增加利用由MobTech主动调配的利用标识。在MobPush中是SDK、Rest API和服务端通信的标识之一。 AppSecret 是由MobTech主动调配利用AppKey一起调配的对应密钥,在MobPush中是SDK、RestAPI和服务端通信校验的重要组成部分。 APNs 苹果官网推送告诉服务,APNs 容许设施与苹果的推送告诉服务器放弃常连贯状态。MobPush iOS的告诉音讯都是走APNs发送。APNs 鉴权形式 APNs鉴权形式分为2种:一种是通过p12证书,证书是一种扩大名为p12的文件,它是利用发送音讯给APNs的证实。APNs针对不同的环境有不同的证书和明码,因而p12证书文件会有两套:开发者环境证书及密钥、生产环境证书及密钥;一种是通过Token Authentication,这种不辨别开发者环境和生产环境,也须要APNs Auth Key形式的p8后缀证书,而且须要设置BundleID等信息。 DeviceToken 在应用APNs服务时,须要先由苹果推送服务获取的一个64位的惟一标识,而且该Token并非不变。所以在应用MobPush的时候须要每次启动初始获取到DeviceToken,并且SDK会上报给MobPush服务端与Registration ID绑定。 新增用户量 以后利用新注册绑定的设施数量。 创立推送数量 以后利用新创建的推送数量,是通过开发者平台创立和通过Rest API创立的总和。 指标数量 以后利用创立推送所波及的设施总数量。 推送胜利数量 以后利用创立推送收到推送音讯的设施总数量。 用户点击数 设施收到告诉音讯后点击的数量总和。 API调用数量 申请Rest API调用的总数量。离线音讯保留时长 一条给某个用户的推送,如果该用户以后不在线,则会保留为离线音讯,待用户下次上线时持续推送给他。能够通过该值为指定离线音讯时长,即在该时长范畴内用户上线会持续收到推送,否则过期。 默认时长为1天,最长为10天,可设置为0示意不保留离线音讯,只有在线用户能力收到。 MobTech开发者利用合规指南近年来,随着信息技术的疾速倒退和挪动互联网利用的遍及,越来越多的利用大量收集、应用个人信息,给人们生存带来便当的同时,也呈现了对个人信息的非法收集、滥用、透露等问题,集体信息安全面临严重威胁。 理解详情请点击“MobTech开发者利用合规指南”查看具体阐明。

August 10, 2022 · 1 min · jiezi

关于sdk:新闻速递-MobTech袤博科技参与中国信通院绿色SDK产业生态共建行动

日前,中国信息通信研究院(以下简称“中国信通院”)发动“绿色SDK产业生态共建口头”,MobTech袤博科技作为寰球当先的数据智能科技平台,受邀退出该口头。 随着挪动互联网环境日益简单,正当标准挪动应用软件开发包产品开发和运维,对行业整体平安程度晋升与用户权利保障至关重要。在此背景下,中国信通院发动该口头,并号召MobTech袤博科技等相干行业出名企事业单位独特签订倡议书,通过宣传疏导、规范编制、最佳实际遴选等形式,独特推动有序、衰弱的生态倒退。 作为深耕开发者服务的领军企业,MobTech十分重视数据安全、数据合规与个人信息的隐衷爱护。公司曾多次取得国家与行业在数字平安方面的认可,率先通过国家网络安全等级爱护三级测评、ISO27001信息安全管理体系认证、中国信通院“平安专项评测”等多项权威认证,并积极参与编制数据安全与治理指南2.0、数据安全经营治理平台技术标准等多个中国信通院我的项目。2022年,恰逢企业成立十周年,MobTech不仅持续晋升欠缺产品和服务水平,助力企业和社会数智化降级,还将在信息安全爱护、数据合规等问题上继续发力,共建数智化生态。 截至2022年5月,已有15家相干企业报名参加“共建口头”并签订《倡议书》,名单如下(排名不分先后): MobTech袤博科技 北京腾云天下科技有限公司 深圳市和讯华谷信息技术有限公司 北京贵士信息科技有限公司 每日互动股份有限公司 上海璟梦信息科技有限公司 北京金域互动科技有限公司 广州塔酷信息科技有限公司 神策网络科技(北京)有限公司 凡泰极客科技有限公司 北京美数信息科技有限公司 上海世全网络科技有限公司 北京易数科技有限公司 上海倍孜网络技术有限公司 上海优比客思科技有限公司

July 28, 2022 · 1 min · jiezi

关于sdk:融云直播-SDK-玩法翻新入围信通院实时互动创新应用优秀案例

7 月 23 日-24 日,第五届数字中国建设峰会于福建省福州市举办。关注【融云寰球互联网通信云】理解更多 峰会以“翻新驱动新改革,数字引领新格局”为主题,是中国数字经济倒退成绩展现的重要平台。在 24 日的数字互动论坛上,中国信息通信研究院(下简称“中国信通院”)重磅公布了“实时互动翻新利用优良案例”入围名单,融云直播场景化 SDK 榜上有名。 融云直播 SDK实时互动翻新利用优良案例2022.7.24第五届数字中国建设峰会数字互动论坛 据悉,为摸索实时互动行业的利用落地和实际倒退,中国信通院泰尔终端实验室于 2022 年 4 月启动“实时互动翻新利用优良案例”征集流动。 历经后期宣传、公开征集、模式审查等阶段,专家从案例内容品质、外围问题解决、创新性和独特性、施行难度与复杂性、案例利用功效及推广价值多个评议维度对申报案例进行专家打分和点评。 经综合评议,融云直播场景化 SDK 以高效率集成、高质量通信和一直迭代降级的翻新玩法等劣势入围并在数字互动论坛现场获颁证书。 高效率和高质量场景化计划的题中之义高效率接入、高质量通信都是实时互动大潮下的题中之义。 其中,直播行业倒退多年,曾经是一个市场微小的成熟产业。依据艾媒征询数据,2022 年中国在线直播用户规模将达 6.60 亿人,赛道炽热异样。而开发者若应用传统集成形式开发一个直播利用,须要把握 RTC 和 IM 相干底层常识,先别离集成 RTC 和 IM  SDK,再进行其余玩法性能的开发。动辄需面对三四百个 API,耗时耗力。 融云直播场景化 SDK,抽取最佳实际进行封装,以产品化 SDK 的形式提供给开发者,API 的命名也非常贴近市场,开发者毋庸开展对底层的学习,基于对场景的理解间接调用 API 即可实现集成。 直播场景用户感知最强烈的是两个步骤,唤起摄像头做直播前筹备 ➡ 开启直播。第一步 prepare,筹备视频直播,设置视频信息,输入视频流,配置曾经封装的美颜、贴纸等周边能力,进行视频流预处理;第二步是 beginLiveVideo,开启视频直播,退出房间并公布视频流。融云直播 SDK 曾经暗藏所有直播流程实现逻辑,开发者只须要调用接口就能够实现业务。(融云直播 SDK 相干 API) 在服务质量方面,融云寰球通信网络领有笼罩寰球 233 个国家和地区的数千个节点,能够实现寰球用户就近接入物理节点。低提早:以“IM+RTC+X”全通信解决方案为框架,采纳分布式通信网络,RTC 低提早直播和传统 CDN 直播相结合,延时最低可达 66 ms,跨国跨网均无障碍。 高质量:提供稳固的通信链路、优质的通信品质、平安的数据备份及牢靠的业务容灾能力,综合使用智能降噪、回声打消、弱网优化等技术,反对 2K+ 高清画质,实现音频弱网抗丢包 80%、视频弱网抗丢包 60%。 新性能和新玩法场景化计划的应有之策直播曾经成为大家生存中司空见惯的娱乐形式。 艾媒征询报告显示,大多数用户对输入内容繁多干燥的直播观看时长较短,优质且具备特色的直播内容能力吸引更多用户停留在直播间。 多样化的直播内容生态和丰盛的玩法翻新成为直播行业留住用户的要害。 除了主播对内容的创作能力,利用自身也须要提供翻新玩法反对,比方多布局的连麦模式。 一方面,这能够晋升 App 的活跃度。据企鹅智库数据显示,有连麦性能的直播间均匀观众数为 29.9 人,无连麦性能直播间这一数字仅为 7.8 人。也就是说,连麦这个能力,能够为一场直播吸引来 3 倍以上的观众。另一方面,多种布局的连麦模式,能够让主播与观众更好地交互,造成一种“共创”模式。这不仅能丰盛互动玩法,也能天然地输入 UGC 视频内容,进步内容品质和直播的可玩性。 ...

July 26, 2022 · 1 min · jiezi

关于sdk:海外APP推送下篇海外厂商通道集成指南

作者:极光高级工程师——史坤坤 上篇回顾上篇咱们分享了海内各个厂商的推送通道与FCM通道的比照,理解了厂商通道的劣势。那么上面咱们手把手教你如何集成海内厂商通道。 APP集成海内厂商通道攻略理解了厂商通道与FCM通道的区别后,厂商通道的劣势不言而喻了。为了进步APP告诉的送达率,有必要集成厂商通道来补救FCM通道的有余。在此,咱们整顿了各个厂商通道在海内的反对状况。 截止目前,除三星和vivo外,小米、OPPO、华为、光荣均有各自的厂商通道加持。其中,华为和光荣,国内与海内自身曾经互通,与国内厂商通道应用和集成形式无区别,在此不再赘述,具体可参考极光一键集成厂商通道的文档。 https://docs.jiguang.cn/jpush...  极光推送SDK曾经对各大厂商的推送SDK进行了封装,可不便开发者疾速集成厂商通道,无需独自实现各个通道的集成。同时,也反对开发者在后盾对立治理推送策略、查看推送数据报表等。因为只有小米和OPPO在海内与国内的反对状况有所区别。上面着重对这两个厂商的海内通道做下阐明。 01、经营平台两个厂商的开发者开放平台,都能够通过同一个平台链接进行国内与国际版的切换。 a. 小米账号是互通的,但新建的利用做了国内与海内的辨别,当切换到英语时,新建利用会先同步到海内的利用市场。如此,能力应用海外版SDK进行音讯推送。但海外版SDK用在国内设施上运行时,则会显示注册失败。 当通过经营平台进行音讯推送时,须要严格依据设施的归属地。简略总结为: 如果指标用户是国内用户,须要通过国内推送经营平台发送;如果指标用户是海内用户,须要通过海内推送经营平台发送;如果指标用户既蕴含国内用户又蕴含海内用户,能够抉择国内&国外推送经营平台同时推送该音讯,用户不会反复收到;b. OPPO的账号可登录海外版,但信息则不互通,须要从新注册开发者信息,注册时须要提供身份证明、国内VISA银行卡。进行语言切换时,会主动退出以后账号,而后从新登录。须要留神的是,必须注册企业开发者,才能够应用推送性能。 当通过经营平台进行音讯推送时,也须要依据设施的归属地,应用不同的平台进行推送。应用国内推送经营平台发送的音讯,只有国内设施能够收到;应用海内推送经营平台发送的音讯,只有海内设施能够收到; 02、SDK集成a. 小米SDK集成辨别国内版本和海内版本,两个版本SDK无奈同时共存于同一个APP。同时集成,在编译时会有比拟多的抵触。 尽管无奈同时集成,但开发时所应用的API是雷同的,即当开发者想同时反对国内和海内时,间接替换SDK即可,有一点须要留神的是,如果集成的海外版SDK,则必须减少先通过MiPushClient.setRegion接口设置数据存储区域,可选区域如下: public enum Region {Global,//新加坡Europe,//欧洲德国法兰克福Russia,//俄罗斯莫斯科India//印度孟买}而后再调用MiPushClient.registerPush接口注册小米推送服务。否则会抛出    IllegalArgumentException异样。b. 对于OPPO,适配海内通道则比较简单。SDK则无需任何更改,国内设施与海内设施通用。 03、后盾服务开发在后盾服务适配方面,两个厂商均无需批改服务端SDK,须要做的适配工作雷同,依据设施的归属地,应用不同的api地址进行音讯推送。在获取设施归属地方面略有差别。 a. 小米提供了独自的api接口用来查问设施归属地。 b.OPPO则能够依据regid来判断:regid的前缀有地区缩写,CN,IN,RU等;可辨别国内与海内用户。但在官网文档上没有找到相干阐明,该信息通过官网的技术支持理解到,理论验证也的确如此。服务端依据国内与海内用户,应用不同的域名进行推送。 04、告诉送达成果a. 小米厂商通道送达成果与国内保持一致,即使强行进行利用后,依然能够失常收到推送音讯。 b. OPPO厂商通道,咱们通过OPPO官网技术支持理解到:"在海内零碎上减少了厂商的长连贯通道,反对通过厂商来发送告诉音讯。而在告诉展现方面,则沿用了谷歌FCM的展现逻辑,将收到的音讯转给FCM,因而会有与FCM通道会一样的问题,即“强行进行”APP后,无奈持续收到告诉"。对于这一说法,咱们在拿到海外版真机后做了验证,通过“强行进行”APP后,是能够失常收到告诉并展现的,应该是厂商曾经实现了优化。 05、APP渠道散发a. 因为小米厂商对于国内和海内的设施进行了版本辨别,国内版SDK只能装置在国内设施,海外版SDK只能装置在海内设施,因而,开发者在散发利用时,须要进行多渠道散发,国内利用市场应用国内版本的SDK。Google Play上应用海内版本的SDK。 b. 因为OPPO 厂商SDK不辨别国内外版本,能够通用。因而,不须要针对国内外的环境而对APP进行不同的渠道散发。但须要留神的是,如果海内的利用没有国内主体并且上架利用商店,那么必须要在OPPO海内利用商店上架能力失常应用推送。海内利用商店反对的国家有:印度、印度尼西亚、泰国、越南、菲律宾、马来西亚、中国台湾。 小结极光目前已全面兼容反对海内厂商通道,应用极光推送,您能够免去简单的集成过程,一键集成厂商SDK,进步集成效率。详见 http://www.jiguang.cn 对于极光极光(Aurora Mobile,纳斯达克股票代码:JG)成立于2011年,是中国当先的客户互动和营销科技服务商。成立之初,极光专一于为企业提供稳固高效的音讯推送服务,凭借先发劣势,曾经成长为市场份额遥遥领先的挪动音讯推送服务商。随着企业对客户触达和营销增长需要的不断加强,极光前瞻性地推出了音讯云和营销云等解决方案,帮忙企业实现多渠道的客户触达和互动需要,以及人工智能和大数据驱动的营销科技利用,助力企业数字化转型。

July 26, 2022 · 1 min · jiezi

关于sdk:极客星球-开发者服务合规检测护航企业数字生态建设

数据安全治理趋严 平安合规成为行业风向2021年地方网信办、工业和信息化部、公安部、国家市场监管总局四部委联结公布《常见类型挪动互联网应用程序必要个人信息范畴规定》,随后《数据安全法》《个人信息保护法》等相干法律法规相继出台,同时,工信部钻研起草《挪动互联网应用程序个人信息爱护治理规定》并公开征求意见。2022年,工信部将重点突出要害责任链监管,对利用商店、第三方软件开发工具包、终端企业、重点互联网企业等实现监管全笼罩。平安专项整治口头一直推动,数据合规和个人信息爱护成为行业风向。 开发者服务平安合规检测策略与标准与App合规相比,开发者服务需遵循雷同的法律法规和规范,如个人信息保护法、数据安全法等;由网信办、各地区网安、工信部、市场监督总局等机构进行对立治理;信息收集都须要用户批准隐衷协定,获得受权后能力进行信息收集工作,并且在信息收集上需遵循“最小必要”与“目标明确”准则,且围绕数据生命周期发展数据治理和爱护。 差别之处则次要体现于隐衷协定展现形式及监管报备形式不同,且第三方开发者工具的数据量级和采集维度远大于App利用,因而在合规检测过程中,企业须要首先关注代码平安检测,包含动态扫描和自动化挪动平安浸透测试。其次,平安经营检测同样至关重要,企业须要欠缺审批、公布、变更流程,从而进步数据指标的稳定性、完整性、可用性,同时,做好舆情监测和应急响应的筹备以应答可能呈现的平安经营问题与挑战。 值得关注的是, 个人信息爱护检测和行为平安检测也是开发者服务合规检测的重要组成部分,隐衷协定、数据采集清单以及合规条例检测都是实现其合规的保障。 厘清合规要点 欠缺组织建设助力开发者服务合规检测卢华指出,在企业内部,各种法律法规不断完善,各监管部门职责一直清晰,各评估机构、检测公司也在帮忙企业做好合规。在企业外部,则须要相干部门和人员相互配合,做好合规工作。合规要点包含:• 构建残缺的隐衷协定:涵盖采集数据的方方面面,明确采集数据的目标、用处等;• 记录受权证实:在用户批准受权时,保留好用户批准的记录,做好自证的记录;• 合规检测和采集数据审核:在采集数据之前,合规部门需进行残缺的审批;• 建设“双清单”:依照相干的法律法规的指引,建设外部数据采集和数据共享的“双清单”;• 等级爱护:针对要害的零碎申报网络安全等级爱护,并做好年审工作;• ISO体系认证:如ISO27001信息安全管理体系认证、ISO20000信息技术服务管理体系治理认证等以及隐衷爱护相干认证;• 监管部门认证、备案:及时到工信部网站进行第三方软件开发工具报备、加入权威部门或研究院的认证或测评;• 明确个人信息爱护负责人和组织架构:参考信息安全技术和集体信息安全标准,当解决超过一百万条个人信息或十万条集体敏感信息时,企业应指定个人信息爱护负责人并明确其具体职责;• 做好相干的应急响应工作;• 梳理App合规与平安指南等。 因而,在具体的合规检测过程中,倡议企业做好检测相应的分类分级。从代码平安检测、行为平安检测、平安经营检测到个人信息爱护检测。合规检测是一项简单且繁琐的工作,须要多部门进行配合、协调。为进步整体工作效率,MobTech袤博科技踊跃成立合规委员会,并通过组织建设的欠缺,充沛协调各部门工作,汇合产研、数据治理、数据安全、法务等多个部门的独特力量实现开发者服务合规的重要指标。 严守合规防线 构建挪动利用清朗环境 护航企业数字生态建设挪动互联网的隐衷监管合规是行业欠缺的必经之路,也是以后数据智能等相干企业须要重点关注的趋势。作为深耕开发者服务十年的领军企业,MobTech袤博科技一贯高度重视数据安全、数据合规与个人信息的隐衷爱护。公司曾多次取得国家与行业在数字平安方面的认可,率先通过国家网络安全等级爱护三级测评、ISO27001信息安全管理体系认证、中国信通院“平安专项评测”等多项权威认证,并积极参与数据安全与治理指南2.0、数据安全经营治理平台技术标准参编等多个中国信通院我的项目。 数智赋能,平安共赢。MobTech袤博科技将持续严守数据安全底线,为营造平安、合规、清朗的挪动应用环境贡献力量。往年5月,公司也将携系列全新降级的数据智能解决方案精彩亮相亮相2022数博会,致力于通过“智改数转”赋能千行百业,同时在信息安全爱护、数据合规及数据安全问题上继续发力,全力护航企业数字生态建设。

June 6, 2022 · 1 min · jiezi

关于sdk:基于-Agora-SDK-实现-Windows-端的多人视频互动基于362版本

本文介绍如何通过 Agora SDK 在 Windows 平台疾速实现互动直播。互动直播和实时通话的区别就在于,直播频道的用户有角色之分。你能够将角色设置为主播或者观众,其中主播能够收、发流,观众只能收流。 Demo 体验Agora 在 GitHub 上提供一个开源的实时音视频通话示例我的项目 OpenLive-Windows。在实现相干性能前,你能够下载并查看源代码:https://github.com/AgoraIO/Basic-Video-Broadcasting/tree/master/OpenLive-Windows-MFC 前提条件Microsoft Visual Studio 2017 或以上版本反对 Windows 7 或以上版本的 Windows 设施无效的 Agora 账户(收费注册)如果你的网络环境部署了防火墙,请依据声网文档核心的「利用企业防火墙限度」关上相干端口。 设置开发环境 本节介绍如何创立我的项目,并将 Agora SDK 集成至你的我的项目中。 创立 Windows 我的项目参考以下步骤创立一个 Windows 我的项目。若已有 Windows 我的项目,间接查看集成 SDK。 1.关上 Microsoft Visual Studio 并点击新建我的项目。 2.进入新建我的项目窗口,抉择我的项目类型为 MFC 应用程序,输出项目名称,抉择我的项目存储门路,并点击确认。 3.进入MFC 应用程序窗口,抉择应用程序类型为基于对话框,并点击实现。 集成 SDK参考以下步骤将 Agora SDK 集成到你的我的项目中。 1.配置我的项目文件 依据利用场景,从 SDK 下载获取最新 SDK,解压并关上。关上已下载的 SDK 文件,并将其中的 sdk 文件夹复制到你的我的项目文件夹下。2.配置我的项目属性 在解决方案资源管理器窗口中,右击项目名称并点击属性进行以下配置,配置实现后点击确定。 进入 C/C++ > 惯例 > 附加蕴含目录菜单,点击编辑,并在弹出窗口抉择解压的libs/include。进入链接器 > 惯例 > 附加库目录菜单,点击编辑,并在弹出窗口中解压的libs/x86或libs/x86_64。进入链接器 > 输出 > 附加依赖项菜单,点击编辑,并在弹出窗口中解压的 agora_rtc_sdk.lib。实现音视频直播本节介绍如何实现音视频直播。视频直播的 API 应用时序见下图: ...

May 12, 2022 · 3 min · jiezi

关于sdk:基于-Agora-SDK-实现-Windows-端的一对一视频通话基于362版本

前提条件Microsoft Visual Studio 2019 或以上版本反对 Windows 7 或以上版本的 Windows 设施无效的 Agora 账户(收费注册)注:如果你的网络环境部署了防火墙,请依据声网文档核心的「利用企业防火墙限度」关上相干端口。 设置开发环境本节介绍如何创立我的项目,并将 Agora SDK 集成至你的我的项目中。 创立 Windows 我的项目参考以下步骤创立一个 Windows 我的项目。若已有 Windows 我的项目,间接查看集成 SDK。 创立 新的MFC我的项目 1.关上 Microsoft Visual Studio 并点击新建我的项目。 2.进入新建我的项目窗口,抉择我的项目类型为 MFC 应用程序,输出项目名称,抉择我的项目存储门路,并点击确认。 3.进入MFC 应用程序窗口,抉择应用程序类型为基于对话框,并点击实现。 初学者间接下载文中前面的github地址我的项目 集成 SDK参考以下步骤将 Agora SDK 集成到你的我的项目中。 1.配置我的项目文件 依据利用场景,从 官网获取最新 SDK,解压并关上。将下载包中的 sdk 文件夹复制到你的我的项目文件夹下。目前3.6.2版本,目录构造为libs/include,libs/x86,libs/x86_642.配置我的项目属性 在解决方案资源管理器窗口中,右击项目名称并点击属性进行以下配置,配置实现后点击确定。 进入 C/C++ > 惯例 > 附加蕴含目录菜单,点击编辑,并在弹出窗口抉择解压的libs/include。进入链接器 > 惯例 > 附加库目录菜单,点击编辑,并在弹出窗口中解压的libs/x86或libs/x86_64。进入链接器 > 输出 > 附加依赖项菜单,点击编辑,并在弹出窗口中解压的 agora_rtc_sdk.lib。实现音视频通话本节介绍如何实现音视频通话。视频通话的 API 调用时序见下图: 1. 创立用户界面依据场景须要,为你的我的项目创立音视频通话的用户界面。若已有用户界面,能够间接初始化 IRtcEngine。 ...

May 11, 2022 · 3 min · jiezi

关于sdk:基于-Agora-SDK-实现-iOS-端的多人视频互动

视频互动直播是以后比拟热门的玩法,咱们常常见到有PK 连麦、直播答题、一起 KTV、电商直播、互动大班课、视频相亲等。 本文将教你如何通过声网Agora 视频 SDK 在iOS端实现一个视频直播利用。注册声网账号后,开发者每个月可取得 10000 分钟的收费应用额度,可实现各类实时音视频场景。 话不多说,咱们开始入手实操。 一、 通过开源Demo,体验视频直播可能有些人,还不理解咱们要实现的性能最初是怎么的。所以咱们在 GitHub上提供一个开源的根底视频直播示例我的项目,在开始开发之前你能够通过该示例我的项目体验视频直播的体验成果。 image622×1108 87.4 KB mage608×1102 99 KB Agora 在 GitHub 上提供开源的互动直播示例我的项目 OpenLive-iOS-Objective-C 与 OpenLive-iOS-Swift。在实现相干性能前,你能够下载并查看源代码。 Objective-C Github链接:Basic-Video-Broadcasting/OpenLive-iOS-Objective-C at master · AgoraIO/Basic-Video-Broadcasting · GitHub 4Swift Github链接:Basic-Video-Broadcasting/OpenLive-iOS at master · AgoraIO/Basic-Video-Broadcasting · GitHub 1 二、 视频直播的技术原理咱们在这里要实现的是视频直播,Agora 的视频直播能够实现互动成果,所以也常常叫互动直播。你能够了解为是多个用户通过退出同一个频道,实现的音视频的互通,而这个频道的数据,会通过声网的 Agora SD-RTN 实时网络来进行低延时传输的。 须要特地阐明的是,Agora互动直播不同于视频直播。视频通话不辨别主播和观众,所有用户都能够发言并看见彼此;而互动直播的用户分为主播和观众,只有主播能够自在发言,且被其余用户看见。 下图展现在 App 中集成 Agora 互动直播的根本工作流程: image870×600 51.2 KB 如图所示,实现视频直播的步骤如下: 获取 Token:当 app 客户端退出频道时,你须要应用 Token 验证用户身份。在测试或生产环境中,从 app 服务器中获取 Token。退出频道:调用 joinChannel 创立并退出频道。应用同一频道名称的 app 客户端默认退出同一频道。频道可了解为专用于传输实时音视频数据的通道。在频道内公布和订阅音视频流:退出频道后,app 客户端均能够在频道内公布和订阅音视频。App 客户端退出频道须要以下信息: ...

May 10, 2022 · 6 min · jiezi

关于sdk:重新认识融云不止即时通讯

始于即时通讯,不止即时通讯。关注【融云寰球互联网通信云】理解更多 开办于 2014 年的融云,在往年迎来 8 周年庆。从即时通讯服务起家,现在的融云未然齐全无奈被“即时通讯”这四个字定义。 是时候了。 让咱们重新认识一下融云——8 年来,融云围绕开发者服务潜心打造各种能力,并在与市场的碰撞中迎接生态的交融衍变,最终造成丰盛的产品构造和翻新的服务模式,开启了空间辽阔的通信服务新篇章。 潜心笃行,徐徐图之开发者基因驱使下,“所有为了开发者”决定了融云在每一个倒退节点中的价值排序。 融云开创团队脱胎于中国移动的飞信业务。彼时,即时通讯是复杂度最高的技术之一,想在社交赛道发力的守业团队动辄破费数月工夫都无奈攻克。融云团队发现了这一市场空缺,将即时通讯技术封装为 SDK,开创性提供通信云 PaaS 服务,开发者接入即可取得即时通讯能力。 即时通讯 SDK 转动了融云这艘大船前行的第一个齿轮,也关上了一个能源不竭的翻新引擎。 尔后,融云的前路呈现出两种图景。 一方面,继续深入 IM 即时通讯。融云 IM 即时通讯 SDK 经验了几个倒退阶段,一开始强调性能丰富性,起初要求开发便捷性,当初谋求极致稳固和无感部署。(融云 IM 即时通讯) 另一方面,同步发展其余通信业务的开拓创新。融云相继推出 RTC 实时音视频 SDK,推送、审核、美颜等一系列通信周边能力,最终造成 IM+RTC+X “全”通信解决方案。(融云 RTC 实时音视频) (融云通信周边能力 X) 8 年来,市场波诡云谲,机会瞬息万变。 融云在本人的策略门路上笃定前行,不变有二: 一是对外围业务的深刻耕耘。作为长期主义者,融云对通信技术进行继续投入和摸索,率先打造笼罩 233 个国家和地区的寰球通信网络,在寰球搭建多个数据中心,3000 多个动静减速节点,实现即时通讯和实时音视频双核心业务高可用、高质量、低提早的稳固服务。正因如此,融云成为了寰球 25 万+ 开发者的信赖之选。 在服务开发者的过程中,融云也始终在寻找搭建残缺生态和克服边界扩张之间的平衡点。 融云心愿成为开发者业务发展的商业伙伴,而不仅仅是某个单点技术提供者。而商业,则意味着以生态系统实现赋能。因而,融云不断完善生态能力,从产品研发到业务上线及遍布寰球的本地化经营,融云均可提供残缺的能力撑持。 在周边能力生态的搭建上,融云采取引入而非自研的形式,通过联结生态搭档的形式实现能力边界的拓展。既能够给开发工作提速,也更聚焦主业,更容纳生态。 泛滥产业上下游退出融云构建的开发者服务生态,成为融云服务的延长。开发者以通信服务为外围介质进入融云生态,在生态赋能和全生命周期服务的陪伴下与市场碰撞倒退。 二是对外围价值观的深刻践行。互联网倒退至今,浸润其中多年的咱们曾经对很多思维形式司空见惯甚至奉为圭臬,比方施展网络效应实现高速增长、小步快跑迭代产品、通过定位霸占用户心智等等。 但在所有互联网叙事之上,融云要加上一条“所有为了开发者”。 这不仅决定了融云在技术路线上稳步发展,徐徐图之,不冒进求快;也肯定水平上决定了融云的产品门路,就是一直满足开发者的需要,给开发者简略、极致的体验。 惟实励新,初心致之如何真正让开发者的业务实现更加简略高效?这是融云在产品研发中始终思考的问题。 融云的策略是多为开发者做一点,更贴近市场一点。去年,融云给市场和行业交出了答卷——笼罩社交全场景的系列场景化 SDK。(融云语聊房 SDK) (融云直播 SDK) (融云呼叫 SDK) 疫情以来,咱们的生存经验了一场重大的数字化重构,把线下场景还原到线上的过程霎时减速。data.ai 的《2022 年挪动市场报告》针对 17 个行业和 30 个市场进行剖析指出:智能手机简直涉及咱们生存的方方面面,它永远地扭转了移动用户的行为习惯。 ...

April 7, 2022 · 1 min · jiezi

关于sdk:融云直播-SDK-升级让直播PK起来

近日,融云直播 SDK 2.1 上线,在 7 种合流布局满足直播连麦所有热门场景的根底上,上线 PK 能力,为开发者提供丰盛直播内容和晋升用户活跃度的最佳经营抓手。关注【融云寰球互联网通信云】理解更多 直播江湖远阔,丰盛内容“打天下”艾媒征询近期公布的《2021 年度中国在线直播行业倒退钻研报告》显示,预计 2022 年中国在线直播用户规模将达 6.60 亿人。 依据报告,产业链残缺是在线直播行业继续疾速倒退的次要驱动力之一。报告梳理了由 MCN 机构、直播平台、技术支持和设施提供等形成的直播行业图谱,并展现了优良案例。 融云凭借贴近市场的直播场景化 SDK、IM + RTC + CDN + 美颜+审核等残缺解决方案入选图谱。(中国在线直播行业图谱,起源 艾媒征询) 报告显示,有 46.1% 国内在线直播用户一周内观看直播的次数在 4-5 次;超过六成用户观看直播的均匀时长在 30 分钟-1 小时之间。 大多数用户对输入内容繁多干燥的直播观看时长较短,优质且具备特色的直播内容能力吸引更多用户停留在直播间。 data.ai 的《2022 年挪动市场报告》则从另一个角度验证了直播行业的增长趋势,2021 年,用户有 70% 的工夫花在社交与照片和视频利用上。其中,前 25 名的直播利用应用时长同比增长 40%。(寰球在线直播利用增长态势,起源 data.ai) 这个报告还展现了直播市场繁荣景象的另一个切面,用户收入方面也呈现了相似的增长。用户心愿用打赏的形式来反对他们喜爱的主播,为创作者经济中的内容创作者提供了变现路径。 PK 最佳实际,仅需 7 个 API广泛的共识是,随着互联网人口红利的逐步隐没,多样化的直播内容生态和丰盛的玩法翻新是保留用户的要害。 丰盛内容和翻新玩法也始终是直播等产品施展设想,继续翻新的次要形式。比方,在直播中退出家族等机制,通过家族擂台赛等玩法设计晋升产品的活跃度和实现用户增长。这就须要产品具备 PK 的能力。 在其余没有家族玩法的直播利用中,PK 打赏也是撬动营收大门的金钥匙。所以,PK 简直会呈现在所有支流直播产品中。 融云直播 SDK2.1 将直播 PK 的实现逻辑进行抽取封装,集成不便、接口简略,7 个 API 涵盖视频直播 PK 的全副流程: 发动 PK 邀请:主播调用 发动 PK 接口,发动邀请。被邀请的主播批准即开始 PK,回绝可传输起因。 ...

March 22, 2022 · 1 min · jiezi

关于sdk:隐私合规检测第三方SDK调用的隐私权限

前言看了一圈各大网站目前对于隐衷合规检测的分享,发现大家简直都是本人写一套动静代理、Hook或者ASM来实现代码拦挡从而检测不合规的代码堆栈,尽管这也是一个很好的办法,然而对于一些很紧急的工作又或者是刚入门的开发者来说,无疑是很耗时间的,所以笔者在这里提供一种目前 Android 11 反对的API思路。官网文档传送门 最近被工信部下架的利用太多了,隐衷合规检测特地严,明明把所有能看失去的隐衷合规问题都解决了,然而工信部就是说你没解决。Ok,fine! 你说没解决就没解决吧(欲哭无泪) 尽管咱们是把“看失去”的隐衷问题都解决了,然而那些看不到的呢?比如说依赖的第三方 SDK,它们会不会在你不晓得的状况下偷偷调用了一些隐衷权限呢?置信个别的公司我的项目都是比拟大型的,依赖了各种各样的第三方SDK吧(如果是大佬的话就当我没说,毕竟大佬们都喜爱本人造轮子~) 检测办法为了让利用及其依赖项拜访用户私密数据的过程更加通明,Android 11 引入了数据拜访审核性能。笔者应用的这种形式,是针对Android 11及以上的,因为这是Android 11的新个性,具体能够看官网文档。想要检测利用应用的隐衷权限的话,须要先临时把targetSdkVersion升到30,而后等检测完不合规的中央后再还原回本来应用的 targetSdkVersion 版本。 其实当 Android 11 的新个性进去之后,开发者们必定或多或少的对AppOpsManager.OnOpNotedCallback有印象,然而真到了须要用的时候,可能就想不起这个回调了,在 App 中注册了这个回调之后,当利用每次产生以下任一事件时都执行相应操作: 利用的代码拜访私密数据依赖库或 SDK 中的代码拜访私密数据注:此博客所讲的例子是基于定位权限的,其余隐衷权限同理。 简略应用以下代码段是用于数据拜访时的AppOpsManager.OnOpNotedCallback回调: override fun onCreate(savedInstanceState: Bundle?) {    val appOpsCallback = object : AppOpsManager.OnOpNotedCallback() {        private fun logPrivateDataAccess(opCode: String, trace: String) {            Log.i("youzi", "Private data accessed. Operation: $opCode\n Stack Trace:\n $trace")        }        override fun onNoted(syncNotedAppOp: SyncNotedAppOp) {            logPrivateDataAccess(syncNotedAppOp.op, Throwable().stackTrace.toString())        }        override fun onSelfNoted(syncNotedAppOp: SyncNotedAppOp) {            logPrivateDataAccess(syncNotedAppOp.op, Throwable().stackTrace.toString())        }        override fun onAsyncNoted(asyncNotedAppOp: AsyncNotedAppOp) {            logPrivateDataAccess(asyncNotedAppOp.op, asyncNotedAppOp.message)        }    } // 创立AppOpsManager实例并增加下面定义的回调    val appOpsManager = getSystemService(AppOpsManager::class.java) as AppOpsManager    appOpsManager.setOnOpNotedCallback(mainExecutor, appOpsCallback)}回调里须要重写的几个办法笔者就不多赘述了,官网文档里讲得曾经很具体了。这里的logPrivateDataAccess办法是本人写的,名字可随便定义,用于打印应用到的权限名字,还有应用到的代码堆栈,不便大家看到在哪里调用了某个权限。 ...

March 17, 2022 · 2 min · jiezi

关于sdk:编译SDK出现aclocal115-command-not-found错误

1、具体谬误报错信息:line 81: aclocal-1.15: command not foundWARNING: 'aclocal-1.15' is missing on your system. You should only need it if you modified 'acinclude.m4' or 'configure.ac' or m4 files included by 'configure.ac'. The 'aclocal' program is part of the GNU Automake package: <http://www.gnu.org/software/automake> It also requires GNU Autoconf, GNU m4 and Perl in order to run: <http://www.gnu.org/software/autoconf> <http://www.gnu.org/software/m4/> <http://www.perl.org/>make: *** [Makefile:579: aclocal.m4] Error 127-e error code=2! 2、解决办法首先获取起源:$ wget https://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz解压文件:$ tar -xzvf automake-1.15.tar.gz构建并装置:$ cd automake-1.15$ ./configure --prefix=/opt/aclocal-1.15$ make$ sudo mkdir -p /opt$ sudo make install增加环境变量:$ export PATH=/opt/aclocal-1.15/bin:$PATH$ aclocal --versionaclocal(GNU automake)1.15当初,当调用aclocal时,您将取得正确的版本。如果呈现版本还是不对能够去将/usr/bin目录下建设软链接$ cd /usr/bin$ rm aclocal$ ln -s /opt/aclocal-1.15/bin/aclocal-1.15 aclocal

February 28, 2022 · 1 min · jiezi

关于sdk:第三代场景化-SDK-引领通信云厂商下阶段发力方向

瞄准 Z 世代需要,成为很多产品的增长明码。这个出生于 1995 年 - 2009 年间的年老群体,是“齐全的挪动设施用户”,他们违心利用多媒体学习、娱乐,习惯于解决大量视觉信息。 因而,他们对新事物的承受能力、学习能力十分强,也在长期信息爆炸的环境下造成了“寻求刺激、谋求新鲜感”生产习惯。 社交、泛娱乐类利用更要求新求变,能力在人们曾经被大量精心设计的软件、信息流占据和扩散的注意力中,分得一杯羹。这种市场需求侧的趋势特点,也在倒逼生产方式,甚至是行业供应链发生变化。 利用集成的生产环节与到达用户的面市环节间隔越来越短,意味着开发者在利用研发阶段要尽可能地抉择性能封装贴近市场、集成形式简略不便的解决方案。这一趋势也被艾瑞征询公布的行业报告所印证。 艾瑞征询在近期重磅公布的《2021 年寰球互联网通信云行业钻研报告》(以下简称《报告》)中将残缺封装的场景化 SDK 产品划分为第三代 SDK 产品,《报告》这样形容: 为进一步赋能开发者,升高二次开发人员投入,互联网通信云厂商提供的 SDK 正朝着开箱即用的方向迭代,力求帮忙开发者跳过对底层逻辑的学习过程。目前已呈现能依据不同的交融场景,将各种根底服务有机联合起来,间接封装为特定的场景化 SDK。 (艾瑞报告原文) 这种场景化 SDK 为开发者提供贴近业务的 API 与回调,让我的项目开发者的重心从技术语言转向业务逻辑,简略便捷地实现产品搭建。 (互联网通信云产品的演进) 第三代 SDK 的整体表现力 《报告》在论述第三代 SDK 的代际劣势时,以融云的场景化 SDK 为示范案例,对第三代 SDK 的体现能力予以特关注。融云提供第三代直播 SDK、语聊房 SDK、1v1 SDK 等特定场景封装 SDK 包,用户无需思考底层逻辑,只需关注业务需要,大幅升高了 SDK 的应用难度。融云通过欠缺产品根底性能为前端通信利用场景提供撑持,目前已针对趣味社交、娱乐直播、互动游戏、出海业务等场景造成独特的解决方案。 融云的场景化 SDK、利用场景和解决方案 个别状况下,开发者在进行社交 APP 利用的产品开发时,如果采纳第一代 SDK 产品,须要通过后端开源代码和前端开源代码做二次开发,难度十分大。 采纳第二代 SDK 产品,须要开发者对前端开源代码做二次开发。想要开发一款社交软件,仅在软件必备的音视频能力方面就须要消耗微小精力和工夫,还须要进行相干场景的业务逻辑钻研梳理和磨合试错。实现产品交付,至多须要 2~3 个月的工夫。 对于互联网开发者而言,这个周期的消耗很可能意味着错过一个时代,当大量同质化的 APP 产品利用呈现时,这 2~3 个月的蹉跎,已使得竞争者的先发劣势依然如故。 第三代 SDK 的呈现,将齐全扭转这一现状。就拿融云语聊房 SDK 来说,它能让开发者真正体验到什么叫做“开箱即用”,只需 30 分钟便可接入 SDK,5-7 天便可上线一款性能残缺的语聊房利用。 ...

January 6, 2022 · 1 min · jiezi

关于sdk:极客星球-Android原生SDK无缝嵌入鸿蒙开发黑科技

一、背景 鸿蒙的原生开发是无奈反对到安卓原生配置的,导致鸿蒙间接嵌入安卓库须要做相应的革新。MobTech作为第三方SDK提供方,有必要为开发者提供更不便的接入解决方案。咱们的指标是鸿蒙开发者和安卓开发者接入MobSDK的老本是一样的。在这个终极目标的前提下,咱们须要冲破鸿蒙的一些限度。 本文次要就如何冲破安卓和鸿蒙之间的差别做到无缝迁徙开展,同时将为大家介绍鸿蒙的一些原理性知识。上面咱们将从鸿蒙与安卓的差别、兼容的卡点、冲破的原理几个方面进行深刻探讨。 二、鸿蒙我的项目 VS 安卓我的项目 从我的项目整体构造上来看,鸿蒙和安卓根本是雷同的,蕴含代码、资源、布局、配置和国际化等。然而深刻理解则发现存在很大的差异。 1、四大组件到Ability 鸿蒙为了跟安卓剥离的更为彻底,曾经齐全废除了四大组件的设计(仅仅保留四大组件的概念),这种扭转带来的问题是须要重写原来这部分安卓代码。 组件主题 2、AndroidManifest.xml到config.json 鸿蒙废除了XML的配置,采纳了json格局来配置我的项目,然而这种扭转并不是简略的文本格式的转变,外面可配置的内容也做了很大的批改,甚至有些属性是只有鸿蒙才有的,而有些在安卓里的属性在鸿蒙里已被齐全破除。 3、AAR变成了HAR HAR(HarmonyOS Ability Resources)能够提供构建利用所需的所有内容,包含源代码、资源文件和config.json文件。HA不同HAP,HAR不能独立装置运行在设施上,只能作为利用模块的依赖项被援用。 从下面HAR的解释来看,HA和AAR作用是一样的,但外面的内容却大不一样,这就导致了鸿蒙上是不能间接应用AAR的,而同样安卓上也是不能应用HAR。 4、鸿蒙不反对kotlin语言 如果原来安卓SDK是kotlin语言编写的,那么间接放入鸿蒙工程中,是跑不起来的。目前鸿蒙还不能反对kotlin语言。 三、无缝兼容的卡点 1、 AndroidManifest.xml四大组件怎么配置到鸿蒙外面?2、 资源文件怎么打入到鸿蒙包外面?3、 如何无妨碍的应用AAR包?4、 安卓源码如何和鸿蒙一起通过编译? **四、理解原理,冲破限度 鸿蒙打包后生成的是hap文件,解压后的构造如下: hap文件里assets文件夹对应的就是resources文件夹下的各种资源,而libs是依赖的各种jar、har、so等第三方库,dex其实是咱们编写的鸿蒙代码编译成的后果。 最为神秘的就是其中的.apk文件了,它就一个作用:用来兼容安卓零碎。如果没有这个apk,在安卓手机上基本就无奈运行hap文件,它就是一个入口,通过它能够去加载鸿蒙的代码。次要是ShellMyApplication和 MainAbilityShellActivity 去实现加载鸿蒙,有点相似插件化的概念。 ShellMyApplication外围事件 判断鸿蒙环境是否加载实现初始化鸿蒙利用加载鸿蒙的Ability初始化数据总线 接管零碎产生的各种事件而后转发给鸿蒙利用MainAbilityShellActivity外围事件 初始化AbilityShellActivityDelegate代理安卓零碎的各种回调事件有了apk,咱们就有了冲破卡点的入口。因为apk里了咱们须要的AndroidManifest.xml文件、资源文件夹。咱们要做的就是在编译的过程中将原来安卓SDK的配置写进去就能够了。 最终成果 最初,咱们在鸿蒙里接入分享SDK和安卓里接入分享SDK的比照成果: 能够看到当初所有的配置都跟安卓上一样(除了GroupID不同而已),也无需减少其余额定配置。 五、总结 通过冲破鸿蒙无安卓配置的卡点并加上业务逻辑封装成一个独自的插件,咱们就能抹平鸿蒙我的项目接入安卓SDK所代来的差别,使得鸿蒙开发和安卓开发简直能够无缝连接。 目前MobTech的ShareSDK有包含微信、QQ、微博、抖音在内的多个平台曾经“鸿蒙化”,开发者接入这些平台将跟接入安卓保持一致,后续咱们会进一步裁减平台的数量,同时也会将MobTech下的其余SDK也逐渐“鸿蒙化”,不便开发者接入。

November 18, 2021 · 1 min · jiezi

关于sdk:极客星球-Android-SDK架构设计之路

编者按:7月15日晚,由MobTech袤博科技主办的一档线上技术直播分享栏目【Coder Park】第一季第二讲《挪动端新风向》顺利在云端举办,客户端负责人文军分享了MobTech袤博科技Android SDK架构设计之路,从0到1开发及迭代过程中遇到的一系列难题,独特探讨其解决思路和SDK开发架构降级。 以下为分享内容: MobTech袤博科技开发者服务历时9年,现已笼罩寰球近155亿+挪动端设施,业务笼罩营销、金融、商业天文等多个垂直行业,同时为政府业务提供反对。对于App开发者来说,会常常面临架构选型以及SDK接入的一些痛点和问题,明天从“SDK架构设计”这个主题登程,分享MobTech袤博科技如何系统化打造SDK服务。 ▌浅谈SDK SDK是软件开发工具包的缩写,它的次要作用次要包含以下方面。一是提供软件必备性能,二是升高软件开发和保护老本,三是极大缩短软件开发周期,四是当今挪动互联网腾飞的X因素,能够说没有SDK挪动互联网不会倒退这么迅速。 SDK服务蕴含以下方面:一是提供SDK根底业务性能,如受权分享、推送、一键登录等;二是提供欠缺SDK的集成工具和文档,不便开发疾速接入;三是须要提供三方开放平台反对,除了对Android和iOS原生App开发反对外,还须要提供像Unity、Cocos、Uniapp、Flutter、APICloud等平台反对;四是须要提供7x24小时的在线服务,保障能及时响应开发者的各种问题。 ▌Mob SDK架构 那么在解读MobSDK架构前,咱们先来全面理解一下MobSDK。想必很多开发者理解咱们,都是从ShareSDK开始,咱们自2012年起,通过这款产品关上了挪动开发者的市场,在ShareSDK引领市场的同时,咱们陆续开发了MobPush、一键登录、短信验证码、MobLink等系列产品。MobPush这款产品自上线以来,通过了3年工夫的一直优化和降级,目前在全方位推送性能和推送指标上都达到行业第一梯队程度,并且完全免费。秒验SDK则提供了当下比拟风行的一键登录性能,上线3年多,物美价廉且失去多方好评。目前产品推出9周年感恩回馈流动,为新老用户带来了超多优惠福利,感兴趣能够点击“浏览原文”理解。 MobSDK的整体架构按性能反对分为三局部,第一局部是SDK根底性能,第二局部是集成工具反对,第三局部是三方开放平台反对,每一部分和模块都是反对横向扩大的。 第一局部SDK根底性能架构可分为三层,第一层是SDK业务层,第二层是通用性能层,第三层是根底工具汇合层。SDK业务层将各业务之间相互独立开,这样每个性能SDK之间是互相独立的,不便迭代和保护。通用性能层会将一些通用的性能从各SDK中抽离进去,独自为一个模块。根底工具汇合层提供了根底工具框架,是通过长期积攒的,稳定性较强,也独立出了新的模块。 第二局部是集成工具,这一块也是尤为重要。首先要让开发者接入进来,那么就须要提供更加快捷接入形式,除了传统集成文档之外,咱们提供了0代码集成工具,像gradle插件、cocoapods、maven仓库、三方开放平台组件(如Flutter组件、APICloud组件、UnityPackage等)。 第三局部是三方开发平台反对,针对Unity、Cocos、Uniapp、Flutter、APICloud等平台,咱们提供了开源的桥接代码和组件反对,不便所有挪动开发者都能接入SDK。 ▌从0到1开发 个别从0设计一款SDK,总体上能够分为5个步骤:基础架构的设计、凋谢API接口设计、业务性能框架设计与开发、根底外围库设计与开发、打包与公布。 第一步是基础架构设计,一个好的架构可次要从可读性、可扩展性、可维护性三个方面进行思考,即功能模块间互相独立,升高耦合度,保障构造清晰易于保护。通常咱们能够把SDK架构简略分为两个档次:业务层和通用性能层。业务层能够独立成业务模块,包含凋谢API接口和业务性能实现,能用性能层能够分为两个模块,包手通用功能模块和根底工具模块。 第二步是凋谢API接口设计,是间接凋谢给开发者调用的,所以常常要转化角色。针对如何调用这个接口,如何用起来更方便快捷,并且不必去思考任何场景和问题,总结了以下几个要点。 1.API接口命名须要标准,且通俗易懂; 2.接口输出参数尽量少,如有必要参数,须要做好参数校验; 3.接口尽量保障是非阻塞的,这样不影响开发者失常业务逻辑解决; 4.接口调用日志须要清晰明了,便于调试; 5.接口后果最好是间接返回,尽量少的应用回调,如有必要,能够在回调办法命名上明确回调所在线程,如在主线程回调,能够应用onResultInMainThread这种形式来命名回调办法。另外应用回调时须要思考内存透露问题,因为开发者有可能是应用匿名外部类的形式进行回调传参,这时如果调用程序的生命周期完结时回调还没有回来,就须要被动移除回调,避免内存透露,所以应用回调时还须要提供移除回调的办法。 第三步是业务性能框架设计,不要适度设计,依据具体的业务需要来设计即可,不要为了一些将来很小概率产生的需要变动提前设计。 第四步是根底外围库设计与开发,在外围库提炼过程中须要保障性能间相互独立,升高耦合度。 最初是打包与公布,能够通过jenkins主动获取代码和执行编译打包,最终公布到maven上,能够大大降低人为本地打包出错的危险。 ▌SDK次要问题及解决路径 SDK开发次要面临以下问题:SDK包体大小、兼容适配、四方依赖问题、隐衷合规问题。 对于SDK包体大小,首先是代码肯定要精简,不适度设计,代码撰写需尽量最优雅最简洁的,其次混同,实践上除了四大组件以及凋谢API接口外,其它的都须要进行混同。兼容适配次要有4个层面的兼容问题:零碎版本兼容、厂商兼容、屏幕兼容、以及新老版本兼容。零碎版本兼容咱们须要适配android 4.0以上的所有版本,个别官网每年Q3会公布一个新的版本,在新零碎正式公布前咱们须要做好适配,个别咱们会在Q1-Q2钻研并实现新零碎的适配,做法先是先整体钻研新零碎的变更,并圈出与SDK相干的重点变更,最初依据官网指南,进行相干适配批改与测试;厂商兼容,这块次要通过机型兼容笼罩测试来进行性能适配,个别会笼罩5大厂商的支流机型;屏幕兼容,次要中波及界面相干的适配和测试;新老版本兼容,须要确保所有SDK版本都是向下兼容的,保障SDK发新版本后,开发者能够不必批改一行代码就能间接更新到新版本SDK。 四方依赖指的是依赖的开源框架(如supportv4包、OkHttp等)、开放平台(如QQ分享、微信分享)、开发平台(如Flutter、Unity、Cocos等)。首先须要去开源依赖,不依赖任何三方工具包,齐全基于原生的android.jar进行开发。对于依赖的四方开放平台和反对的开发平台,咱们须要进行更新监控,以及定期更新,保障提供的根底性能能失常运行。隐衷合规次要关注官网隐衷调整、利用市场隐衷政策、以及国家网络信息安全政策。通常咱们能够走第三方平安检测机构进行权威检测,以及相干适配批改。 针对隐衷合规这块,MobSDK次要有三方面:一是隐衷政策申明,MobTech袤博科技针对SDK业务性能,出具了相应的隐衷政策,确保SDK性能在非法合规的场景下应用。(对隐衷适配这块也设计了隐衷管制API,在用户未提交隐衷受权前,是不会做任何网络申请和API调用的,批准受权后,才会初始化相干SDK性能);二是定期向第三方查看机构送检,三方查看机构会依照国家最新相干规定和政策进行权威的安全检查,并输入检测报告,以后咱们通过了梆梆平安和爱加密等平安机构的检测;三是咱们出具了残缺的合规与平安指南,依据指南能够解决隐衷合规相干的问题。 -------------------------------------------★对于咱们★-------------------------------------- MobTech袤博科技作为使用大数据技术帮忙企业拥抱数字时代的强力助推器,使用卓越的创新力和当先的大数据技术,帮忙企业将数据转化为营销经营的洞察力。 将来,MobTechch袤博科技将积极探索大数据深度利用及倒退,以客户需要为导向,贴合更多利用场景探寻市场未知的可能性,为全行业用户构建谐和欠缺的数据智能生态。

August 6, 2021 · 1 min · jiezi

关于sdk:TRTC代码示例文档集合完毕哪里不会点哪里

为了帮忙开发者能够更好的了解腾讯云实时音视频 SDK 的 API 如何应用以及场景化利用如何开发,从而疾速实现音视频场景的基本功能,咱们将 TRTC 实时音视频 SDK 局部 API 应用示例汇合在一起,为各位开发者演示了一遍!(5555讲真,TRTC真的是开发者们的好敌人,yyds!连小编都惊叹了!) 话不多说,咱们来看看TRTC的代码示例有多赞,摆图镇楼!如下别离是此次TRTC 代码示例的两个局部:API 示例、TRTC 场景化解决方案。 - API 示例 -API 示例汇合了以后 TRTC 所反对的各个客户端,常见的如iOS、Andrid、Windows等,让开发者们可疾速查问并搭建本人的音视频利用。 咱们来看看这个示例文档有多厉害! 以iOS为例子,咱们进入腾讯云实时音视频产品文档页后,点击“代码示例”抉择"iOS API 示例”画面即刻跳转至 Github。从上面的动图咱们能够分明的看到,iOS示例我的项目蕴含了iOS语音通话、视频通话等场景,用户能够依据需要点击接口页面。咱们还为用户提供了具体了运行示例,手把手教学,几乎不要太贴心! - 场景化解决方案 -除了客户端的API 示例,依据不同的利用场景,腾讯云也为开发者提供了常见的几个利用场景的解决方案。其中包含了社交娱乐类(互动直播、语音沙龙、语音聊天室)、教育类(互动课堂)、通信类(多人视频会议、语音通话、视频通话)。这几大类场景是目前市面上最火的利用场景,咱们也为用户具体的介绍每个利用场景是如何接入。 以咱们常见的互动直播为例,示例内容有 Github 源码以及接入操作文档。当咱们进入到腾讯云实时音视频产品文档页,点击“代码示例”抉择互动直播,点击“GitHub 源码”会立刻跳转到TUILive的Github工程,在该工程中,蕴含有具体的代码及相干文档,不便开发者“码上操作”。 同时,咱们也筹备了一个十分具体的接入文档,开发者能够依据步骤抉择更加灵便的接入对应的音视频场景,同时丰盛的Demo图示也不便开发者以及产品经理更加直观、疾速的理解到咱们的场景化解决方案。 咱们点击示例代码中的互动直播关上接入文档页面,文档十分具体的向用户展现了场景的操作过程,同样的手把手用文字解释了如何操作,不要太打动!而且,每个场景咱们都有对应不同的客户端操作文档,用户能够依据本人的需要抉择查看,操作也太骚了! 这么可恶的工具确定不 pick 一下吗?说不定下一个叱咤互联网的 App 就是你哦!

August 4, 2021 · 1 min · jiezi

关于sdk:一键安装JS-SDK-网页版WebRTC-网页-SIP客户端-语音通话可以做web坐席

服务器环境要求CentOS 6.9 64bit 下载脚本文件并装置wget http://voip-sdk.oss-cn-beijin... wget http://voip-sdk.oss-cn-beijin... yum -y install dos2unixdos2unix ./*.shchmod a+x ./*.sh ./install_rtc_sip.sh 批改绑定的域名批改绑定的域名 批改两个中央/etc/nginx/conf.d/websdk.conf 替换域名证书/data/wwwroot/rtcsip-demo/ssl 重启Webservice nginx restart 呼叫测试

July 6, 2021 · 1 min · jiezi

关于sdk:继融云发布语聊房-SDK-10-Demo后开箱即用如何做到唯快不破

沉迷在语聊房社交场景的开发者可能曾经发现,一款真正意义上的开箱即用的通信云产品近期悄悄问世。这是融云开发的,也是业界第一款封装了简单业务逻辑的语聊房 Demo,融云深谙开发者唯快不破的心理,以“IM+RTC”协同能力SDK打造的语聊房 Demo,助力开发者抢占热门开发先机,同时也开掘并率先实际了 PaaS 赛道的新增长点。 因而,上周融云语聊房 Demo一经推出,迅速受到社交场景开发者的热捧,下载试用的开发者真正体验到 30 分钟接入 SDK,5-7天便可上线一款性能残缺的语聊房 App 的快捷开发。 图:融云语聊房性能一览 30 分钟接入 SDK,是如何开箱即用的? 融云语聊房 Demo 何以可能满足开发者疾速上线需要?这在于融云通过剖析语聊产品的场景业务逻辑,把 IM 和音视频通信两个不同能力,基于场景交融在一起造成一个新的SDK,对开发者来说,无需再去关注底层技术,无需额定调用繁多能力。 在 IM 方面,因为语聊社交利用都存在麦位治理、送礼物、私密聊天等通用性场景,在融云语聊房新产品 Demo 中,将这些通用性场景从业务逻辑上进行了封装,提供了以下性能,真正做到了开箱即用,唯快不破。 基于 IM 信令, 反对实时连麦,自在与排队模式的麦位治理,反对全局与独自闭麦等连麦互动性能,房主还可设置管理员,协同治理邀请上麦、抱麦、下麦、敞开座位、座位禁麦、踢出房间等操作; 在“送礼”场景中,反对对单人或全麦位成员送礼物,自定义礼物数量; 为了满足房间内房主与观众、观众与观众间的繁多沟通需要,体验人生如初见的美妙,融云在场景化 Demo 中还封装了基于IM能力的文字、语音、表情、图片等私信音讯性能。 在音视频方面,语聊房场景通常都离不开语音直播、音乐播放等音频场景。融云为语聊房的场景化 SDK 内置了 RTC 能力, 能反抗 80% 的音频丢包; 可智能降噪,回声打消。 另外,通过抖动缓冲、前向纠错、丢帧弥补等技术,缩小网络抖动和弱网环境下的提早,保障语音通话低延时且清晰,让用户在简单网络环境和多设施接入的状况下,也能实现畅通优质的语音通话。 把简单留给本人,用心从开发者体验登程,省时省力事倍功半 对于开发者而言,个别状况下,要实现雷同品质的语聊社交利用产品上线,必须要进行二次代码开发,自行集成与业务场景相干的 SDK,一直研磨和试错业务逻辑,至多须要 2 至 3 个月的工作量和工夫老本。很可能当App从 0~1 开发上线之后,市场上曾经呈现了大量同质化的产品,导致利用失去竞争力。融云语聊房新产品 SDK 1.0 & Demo 的面市,就是通过根底工具的翻新实现降维打击,帮忙开发者博得先发劣势。 但对于融云而言,要研发场景化的 SDK,就不可避免地要在 SDK 中交融多重简单的业务逻辑,也就必须要面对简单的业务逻辑与通用性技术之间的均衡问题。在此之前,作为 PaaS 厂商,融云只需关注根底的 SDK,强调其最大的通用性、最宽泛的应用场景和最常见的性能,封装的也只是最根底的能力。然而在这款新产品的研发中,不仅要思考语聊房的场景实现和业务能力,而且要针对语聊类场景,谋求 SDK 的最大通用性。 这就意味着在研发侧,不是单纯地研发一个 SDK,而是要把很多与业务相干的能力集成在SDK外面。难点在于要更多地面临产品层面的挑战,思考的是产品在特定场景下的通用性,和诸多业务能力的形象,相当于在两个相互排挤的中央找到共通点。 ...

June 28, 2021 · 1 min · jiezi

关于sdk:融云发布语聊房SDK-10-Demo-满足开发者开箱即用需求

日前,寰球当先的互联网通信云厂商融云正式上线语聊房SDK 1.0 & Demo,该场景Demo是基于融云IM和RTC能力整合成的SDK 1.0而开发,开发者无需再额定调用繁多能力,便可实现高质量的利用开发,不仅升高开发难度,晋升开发效率,同时还帮忙开发者节俭了开发成本,彰显融云以IM+RTC全能力协同赋能热门利用场景的劣势。 目前,开发者在融云官网可下载语聊房Demo产品进行试用,开发文档也同期上线。该Demo应用上方便快捷,只需通过手机号就可实现注册登录;而且产品界面敌对,功能强大,可实现房主端、观众端的自在交换,以及公屏聊天、私信和礼物等丰富多彩的互动。能够说,融云语聊房Demo的残缺性能,简直囊括语音社交的所有需要,开发者齐全能够开箱即用。 语聊房Demo汇聚五大亮点性能 语聊社交场景因年初Clubhouse而大火,就目前的市场而言,因年老群体对社交互动需要的日益增长,语音社交软件还没有达到饱和,因而基于语聊而衍生的多种社交玩法,将来发展前景十分可观。 融云此次推出的语聊房Demo,正是满足了开发者想要疾速开发爆款语聊APP的需要。该款Demo是多对多的群聊场景模式,以房主和观众席8人为主,也能够切换成房主加观众席4人模式,产品汇聚了五大亮点性能: 亮点一:实时连麦互动。产品反对实时连麦,自在与排队模式的麦位治理切换,反对全局与独自闭麦,房主还可设置管理员协同治理。 在房主麦位操作中,房主点击本人头像可敞开麦克风或下麦。如果点击麦上用户头像可操作麦位治理,反对邀请上麦、抱麦、下麦、敞开座位、座位禁麦、踢出房间。 在观众麦位操作中,观众在麦上时,可点击本人头像,进行敞开本人的麦克风或断开连接的操作。还可点击麦上他人头像,调出该用户的“资料卡”界面。 图1: 实时麦序治理 亮点二:实时同步百万观众。除主界面可反对4位和8位观众的切换,“场外”反对观众数量无下限,观众激增也能轻松应答。这一点也充沛显示了融云架构自在伸缩,可扩大的技术实力,和从容应对高并发的平台能力。 亮点三:灵便的礼物性能。反对对单人或全麦位成员送礼物,自定义礼物数量。用户在本场直播收到的礼物价值总数,会在麦位上显示进去,可为语聊社交的敌人平添“攀比”的乐趣。 亮点四:私信性能。房主与观众、观众与观众间还可通过私信性能取得联系,反对发送文字、语音、表情、图片等私信音讯,这次要满足了陌生人的社交互动,因为是语聊,聊天对象未知神秘,没有视觉形象先入为主的概念,让大家更关注于精力层面的交换。 亮点五:音频治理。房主可自行设置背景音乐、气氛音效,产品还备有耳返监听,反对本端与远端音量控制,麦克风音量控制,下载播放云端音乐,增加本地音乐,播放列表等治理形式,为用户提供多重听觉体验。 图2:音频治理性能 语聊房SDK 1.0汇合六大特点 此次,与融云语聊房Demo联结公布的还有融云语聊房SDK 1.0,语聊房Demo就是基于领有IM+RTC协同能力的SDK 1.0版本而打磨开发的。该SDK 1.0集融云PaaS平台能力六大特点,在官网隆重亮相。 特点一:30分钟疾速集成。SDK 1.0是业界第一个齐全基于场景化的SDK,它可能让开发者疾速集成IM和RTC双重能力,无需从数百个SDK中自行寻找、调用适宜语聊房场景的SDK,是真正从开发者角度登程,为开发便捷而诞生的SDK。 特点二:高质量的音频能力。因为该款语聊房SDK内置RTC能力,能反抗80%的音频丢包,可智能降噪,回声打消,通过抖动缓冲、前向纠错、丢帧弥补等技术,缩小网络抖动和弱网环境下的提早,保障语音通话低延时且清晰,让用户在简单网络环境和多设施接入的状况下,也能实现畅通优质的语音通话。 特点三:丰盛的麦位自定义属性,可满足多人语聊互动、多人语聊+游戏互动、多人语聊+赛事直播、多人语聊+私密影院、以及1对1陪聊等多种场景。 特点四:在麦位治理方面,邀请上麦、抱麦、下麦、座位禁麦等便捷齐全的麦位治理,满足了房主以及观众对保护房间秩序和污染及房间环境的需要。 特点五:从容应对高并发。在利用中,很可能会呈现某一房间热度居高不下的状况,融云语聊房SDK 1.0则可能反对高频并发的房间内成员状态同步,做到不丢音讯、不乱序、不重序。 特点六:弱小的聊天零碎。支持系统、本地、播送、定向、自定义等多种音讯类型,可为用户带来多样性的交互体验。 结语 弱小的产品源于雄厚的技术实力,融云语聊房SDK 1.0 & Demo联结公布岂但功能强大,而且颠覆了业界对SDK的固有认知,最终彰显的是融云IM+RTC的协同能力:基于IM技术赋能语聊房Demo的聊天零碎,由IM信令管制实现麦位治理,基于实时音视频技术赋能Demo的语音直播。 尤其重要的是,开发者无需调用多个接口和更多SDK,便可轻松实现语聊场景产品的高质量开发。将来,融云在继续晋升IM+RTC技术能力的同时,也会将场景化SDK和Demo的研发复制到其余热门利用场景中,为开发者提供更便捷的应用体验。

June 21, 2021 · 1 min · jiezi

关于sdk:深度链接没你想得那么简单好的Deeplink应该是这样的

挪动互联网时代,流量被扩散到能够实现各种性能的App上,搜索引擎所能获取的挪动互联网数据仍然仅仅限于网页,对于各类App内的信息搜索引擎无从获悉。APP已成为大部分流量的次要入口,浏览器的搜索引擎劣势越来越小。 随着各个APP围起来的内容越来越多,买通网页和挪动App之间壁垒,实现两者之间的跳转成为倒退的必经之路,深度链接(Deeplink)也因而应运而生。通过数十年的倒退,深度链接对于开发者、产品、经营来说早已不再生疏。 然而大部分人对于深度链接的意识还停留在最原始、最根底的性能阶段。比方你可能晓得深度链接(Deeplink)能够绕过被链接的首页,间接链接到内容页。甚至你还晓得深度链接次要是由APP开发者通过被动内嵌网络编码的形式来让更多的智能手机用户发现利用中的相干信息,促使不同APP间能够像网页链接一样产生平台间的跳转与浏览以满足客户的需要。 然而,你不晓得深度链接在实现App与网页跳转之外,还能够实现首次装置场景复原(就是对于通过分享链接下载App的用户在第一次关上App的时候可能间接进入分享对应的内容页)。 也不晓得深度链接能够追踪用户起源,做更加精准的数据统计,帮忙给到更加精准的经营策略。 更不晓得深度链接还能够无码邀请,主动进行用户关系匹配,不必填写邀请码就能实现邀请操作,让邀请拉新变得简略…… Deeplink技术曾经进入到深度倒退阶段,并没有人们设想中的那么简略。否则App在自建Link性能的时候就不会遇到那么多问题了。 比方兼容性问题(这个平台能够,但另一个平台就不行了);比方未装置时容易呈现404、“链接生效”“不可辨认的连贯”“无奈关上的链接”等谬误提醒;又比方用户操作屡次能力关上问题……这就是为什么历经10多年的倒退,咱们明天仍然在强调Deeplink的重要性,且更强调一直深挖Deeplink在起源追溯、专属短链、无码邀请等性能上的实现。深度链接(Deeplink)是一个能够从任何中央将用户带到利用内容页的简略形式,它能够让APP的页面像一个网站的页面一样,又能够被搜索引擎所索引,被用户所搜寻,被用户与敌人分享,被广告主投放广告。无论是对于用户、开发、产品还是经营来说,都是能够极大晋升效率,让挪动生存更加便当的技术。 能够预感的是,将来,深度链接将会被更加宽泛地、更加粗浅地利用,成为App与多个平台(QQ、微信、微博、Twitter、Facebook、短信、各大浏览器等)连贯的重要纽带。

June 10, 2021 · 1 min · jiezi

关于sdk:Qcon全球软件开发大会-融云分享SDK交付质量保障经验

2021年5月29-31日,由极客邦科技旗下 InfoQ 中国主办的综合性技术盛会 QCon 寰球软件开发大会于北京召开。大会设置了包含“人工智能驱动业务实际”、“云原生技术利用”、“大数据实时计算与剖析”、“音视频体验晋升实战”、“低代码实际与利用”、“弹性工程及运维体系”等在内的 35 个技术专题,邀请业界顶级的技术专家,面向技术团队负责人、架构师、工程总监、开发人员分享技术创新和实际。 图1:2021Qcon·北京站 在音视频服务解决方案专场中,寰球互联网通信云当先厂商融云作为受邀嘉宾,重点解析了融云音视频SDK的自动化测试链路摸索与实际,让开发者理解了SDK 打包集成测试过程中的难点痛点,以及多样性 SDK 自动化交互测试设计思路。 测试的终极目标是保障SDK品质 融云自2014年创建以来,专一于通信云赛道,以提供SDK/API的形式,为数百种利用场景赋予通信云能力。为了一直满足开发者对产品性能的需要,成立7年来,融云的SDK接口数量从279个增长到597个,服务端的API接口数量从36个增长到107个,并且适配Android、iOS、Web、Flutter、小程序、桌面版等全平台。 同时,融云还将泛滥的SDK汇合成不同类型的Demo,不便开发者调用,笼罩了直播模式SealLive、即时通讯SealTalk、融云课堂SealClass、实时音视频SealRTC、语音聊天室SealMic、视频会议SealMeeting等泛滥场景。这些场景化的Demo和SDK已累计服务超过 30万款App,SDK触达50亿用户。 随同着SDK数量增长,和场景Demo的多样化,开发者最关怀的是融云如何保障终端SDK的品质。会上,融云自动化测试架构师陈沛杰发表了《融云 SDK 交付品质保障摸索及利用》的主题演讲,从实战经验登程,为开发者答疑解惑。 图2:融云自动化测试架构师陈沛杰发表演讲 目前,掂量音视频品质的指标泛滥,分为间接与音视频相干的和与网络相干的两大类。其中,间接与音视频相干的包含视频连通率、卡顿、清晰度、花屏、黑屏、首帧工夫,以及音频啸叫克制、回声对消、噪声克制等;而在网络传输中,弱网、丢包、延时、抖动和网络自适应调整,也会影响终端SDK品质。此外,CPU、内存、IO、流量、发热等性能指标,与平安、兼容相干的动态代码扫描、平安工具剖析,以及版本兼容、设施碎片化等,也都是影响终端SDK品质的因素。 因而,为交付有质量保证的SDK,融云的做法就是两个字:测试。只有通过测试,能力把握这些指标,进而针对薄弱环节加以优化,确保SDK稳定性。在测试环节,融云通过工具化、脚本化的形式,实现Demo业务测试的自动化,通过对业务测试、专项测试、SDK 接口测试的疾速迭代,来跟进和把握相干指标数据。 基于业务的专项自动化测试实际 融云对Demo业务自动化测试的思考基于两个维度:一个是如何实现业务自动化测试,保障终端 SDK 产品多样性以及多端交互的稳定性?另一个是音视频专项测试是如何进行的? 在业务自动化测试实际方面,融云通过对终端业务自动化测试工具的选型,制订出迷信的终端业务自动化测试流程。 图3:终端业务自动化测试流程 通过这一流程,首先能够实现在大量的 Android 、Web、iOS 、Win、Mac 之间任意自由组合,进行多端交互、穿插测试。其次,利用插件重点关注连通率、稳定性、画面检测(黑屏、绿屏等)、性能数据、弱网和抓包数据等重要质量指标。第三,残缺保留了终端过程数据。例如:日志、实在终端渲染后音频、视频画面录制等。 在音视频专项测试的实际方面,测试须要实现端到端的整体笼罩,包含采集、预处理、编码,到网络传输,再进行解码、后处理和渲染的整个传输过程。 图4:音视频专项测试实际 要实现这一过程,陈沛杰以音视频抗丢包自动化测试为例,介绍了次要步骤: 第一,通过业务UI自动化平台链接到网损仪路由; 第二,由接口调用网损仪的相干参数传输至终端设备,录制终端画面后,上传至平台。 第三, 主动或人工剖析,实现音视频抗丢包自动化测试。 此外,融云还可通过传统手工+测试工具联合的形式,进行自动化测试,实现端到端的延时测试,以及通过工具实现性能数据统计等。 通过这些测试,最终能够把握诸如CPU 占用率、内存占用值、耗电量、流量、FPS、卡顿等相干性能指标,以及视频、声音提早;视频、声音品质;啸叫间隔、啸叫克制和音频、视频通话抗丢包的测试数据。 融云SDK接口自动化测试摸索 所谓SDK接口自动化测试,就是要验证SDK 接口字段校验覆盖率、SDK 接口简单调用的可测试性以及零碎版本及设施碎片化覆盖率。目前,广泛应用的SDK接口测试计划有三种:SDK单元测试、UI自动化办法和注册播送办法。 图5:SDK接口测试计划 在实践中,融云认为SDK自动化测试工具应具备以下能力: 第一,大部分 SDK 接口做到脱离 UI 能够疾速迭代; 第二,能够对 SDK 接口字段进行自由组合逻辑校验; 第三,能够范畴性的发展 SDK 打包集成测试。 基于此,融云对SDK自动化测试工具进行了两次摸索与迭代,第一版采纳的是终端设备微服务模式,SDK 接口绑定 URL 地址;第二版则通过 URL 动静反射接口,实现了参数动静反射序列化。 ...

June 4, 2021 · 1 min · jiezi

关于react-native:使用-Agora-SDK-开发-React-Native-视频通话App

在 React Native 的利用中,从头开始增加视频通话性能是很简单的。要保障低提早、负载平衡,还要留神治理用户事件状态,十分繁琐。除此之外,还必须保障跨平台的兼容性。 当然有个简略的办法能够做到这一点。在本次的教程中,咱们将应用 Agora Video SDK 来构建一个 React Native 视频通话 App。在深入探讨程序工作之前,咱们将介绍利用的构造、设置和执行。你能够在几分钟内,通过几个简略的步骤,让一个跨平台的视频通话利用运行起来。 咱们将应用 Agora RTC SDK for React Native 来做例子。在这篇文章中,我应用的版本是 v3.1.6。 创立一个Agora账户在声网官网注册并登录后盾。 找到 "项目管理 "下的 "我的项目列表 "选项卡,点击蓝色的 "创立 "按钮,创立一个我的项目。(当提醒应用 App ID+证书时,抉择只应用 App ID。)记住你的 App ID,它将在开发App时用于受权你的申请。留神:本文没有采纳 Token 鉴权,倡议在生产环境中运行的所有RTE App 都采纳Token鉴权。无关Agora平台中基于Token的身份验证的更多信息,请在声网文档核心搜寻关键词「Token」,参考相干文档。示例我的项目构造这就是咱们正在构建的应用程序的构造: .├── android├── components│ └── Permission.ts│ └── Style.ts├── ios├── App.tsx.让咱们来运行这个利用须要装置 LTS 版本的 Node.js 和 NPM。确保你有一个 Agora 账户,设置一个我的项目,并生成 App ID。从主分支下载并解压 ZIP 文件。运行 npm install 来装置解压目录中的 App 依赖项。导航到 ./App.tsx,将咱们之前生成的 App ID 填入 appId: "<YourAppId>"如果你是为 iOS 构建,关上终端,执行 cd ios && pod install连贯你的设施,并运行 npx react-native run-android / npx react-native run-ios来启动应用程序。期待几分钟来构建和启动应用程序。一旦你看到手机(或模拟器)上的主屏幕,点击设备上的开始通话按钮。(iOS模拟器不反对摄像头,所以要用实体设施代替)。通过以上操作,你应该能够在两个设施之间进行视频聊天通话。该利用默认应用 channel-x 作为频道名称。 ...

April 19, 2021 · 4 min · jiezi

关于sdk:技术人如何调研和选型第三方-SDK全文干货

多年当前,2020 年会从许多切面上被定义为改革的一年。其中之一是,实时音视频技术彻底变成了一项基础设施级别的能力。语聊房、在线 KTV、多人相亲、近程医疗、互动教育等多种利用场景涌现,并逐步被承受,人们的工作、生存、学习越来越多地基于实时音视频服务开展,更多人也开始关注撑持这些利用场景背地共通的底层技术。 音视频技术能够赋能上百种利用场景,开发者该如何抉择最敌对的音视频厂商,成为一大课题。鱼哥对市场上具备一线实力的通信云厂商一一进行了调研,除了大厂的网易云信、腾讯云的通信能力之外,处于垂直赛道的声网、融云都能够算作一线实力厂商了。要抉择一款适宜本人App的音视频产品,鱼哥倡议应该从几个方面着手思考。 一、自研还是第三方? 作为开发者来说,抉择音视频产品时候,面临的第一个问题就是自研,还是应用第三方服务?自研的益处就是领有全副的知识产权,日后会把握比拟大的主动权,而且能够按需定制,个性化随需调整。但同时,也意味着后期要投入高额的研发费用,并且,日后也同样承当着较为低廉的经营维护费用。因为,一个产品上线后,面临着随市场变动,随时减少新性能、进行产品迭代的问题,如果抉择自研,音视频技术门槛较高,开发团队须要一直学习专业性能力,学期周期较长,面临新利用场景的应变性就会较差。这样将会导致错失一个 App最好的市场成长机会。 而且,自研厂商没有应答不同场景的技术积攒,比方音视频倒退至今,从最后的 1对1 到 1 对多,再到多对多的音视频通话场景,对自研厂商来说,都是一个从 0 到 1 的过程,这也是宽广自研开发者,最为头疼的问题。 因而,个别作为大厂来说,或对安全性要求极高的 App 利用场景来说,抉择自研可能是较好的计划。但对宽广社交娱乐、在线教育、近程医疗这一类较为惯例类的 App 来说,对初创开发者,鱼哥倡议抉择靠谱的第三方音视频产品接入。 什么是靠谱的第三方音视频产品?鱼哥认为起码是一线实力厂商,技术实力要到家。融云团队的核心成员全副来自中国移动飞信团队,飞信作为一款国民级产品,它的用户规模是 10 亿级注册和亿级沉闷量。当年的飞信自身就有音视频能力,所以融云音视频的技术积攒,由来已久。 作为国内当先的云通信厂商,融云既提供音视频服务,还有实力出众的即时通讯产品。去年也实现了数亿的 D 轮融资,明确了公司将来倒退方向就是继续晋升“图、文、音、视”全通信能力,重点加大实时音视频产品的研发投入。这是投资机构给融云的背书,这样的公司倒退稳固,开发者能够思考抉择置信。 二、大厂还是垂直畛域的音视频厂商? 如果初创企业临时不思考自研,抉择第三方接入服务,那么大厂和垂直畛域的音视频厂商到底该如何选呢? 个别大厂,都提供从 IaaS 到 PaaS、甚至 SaaS 的整体服务,大厂是基于 IaaS 能力的向上封装出的 PaaS 能力,这里不仅限于音视频能力还有 CDN,推送、测试等诸多服务,供开发者抉择的空间比拟大。而且,如果一套 IaaS+PaaS 都是抉择大厂服务,开发者能够一站式洽购,可能较为省事。但有一点,鱼哥要揭示开发者留神的,大厂尽管研发实力比拟强,但实际上在音视频这一垂直赛道上的研发厚度和教训积攒上,并没有垂直厂商强。 那么垂直厂商的劣势在哪里呢?鱼哥认为除了教训积攒、技术专一、研发实力全副 ALL in在音视频赛道之外,可能提供一体化产品与服务的厂商最感动人。比方融云从去年开始,第一个提出以“一套 SDK 解决所有通信场景”,这意味着融云能够提供“实时音视频RTC+即时通讯IM+推送Push”一整套解决方案给开发者。 融云的IM间断 6 年市场占有率第一,是业界惟一承诺音讯可 100% 达到,且不丢、不重、不乱序的厂商;融云音视频产品复用IM通信信令通道,稳固牢靠,最低音讯延时仅为66 ms,确保端到端之间提早无感知的实时互动。同时,融云的推送 Push 音讯服务,免去了开发者逐个对接各零碎级别的推送厂商,曾经实现对小米、华为、OPPO、vivo、魅族等多家推送通道的逐个适配。 除了产品能力一体化外,融云在业务反对上的服务也做到了一体化。比方,个别大厂都不反对的定制化业务服务,融云也会提供。举个例子,融云极具特色的音乐教学场景,就是融云音视频产品依据客户个性化需要,针对不同乐器进行音频参数调整,对各种支流乐器进行了适配,提供举世无双的音频教学体验。 此外,除了 7*24 小时的技术支持服务外,对一般性的故障排查,客户能够通过在线客服、工单、VIPQQ 群反馈问题。在工单解决上,融云独创业界 1 小时工单最快响应机制。一旦客户反馈的问题波及SDK性能,融云的响应速度是可使SDK按周迭代,在迭代时还会思考版本的向前兼容性,保障降级的稳定性以及版本回滚的需要。 因而,无论是抉择大厂,还是垂直畛域的音视频服务,对开发者最敌对的厂商肯定是在音视频畛域具备深厚的研发实力,在 RTC+IM 赛道上具备双重能力,可能提供整体解决方案的厂商。 三、如何选型?什么是对开发者最敌对的厂商? 具体到音视频产品的选型调研,鱼哥其实跟实在应用融云的开发者详聊过。当初,能够将要点总结如下,分享给面临选型的开发者们。 首先,易上手,易了解,易接入。对于新的代码片段的了解,是开发者每日都要做的工作,但是否易上手、易了解至关重要,这关系到开发者是否可能顺利接入和应用你的产品。如果开发文档易读、残缺,接口灵便容易接入,是一个音视频厂商对开发者最大的敌对。 其次,稳定性。在实现接入SDK后,产品上线经营的基石就是稳定性。稳定性也受到诸多因素的影响。比方弱网环境下怎么办?高并发状况下怎么应答?这些都是考验一线通信云厂商实力的中央。融云在弱网环境下通过 NACK(丢包重传)、FEC(前向纠错)和动静调整码实现自适应带宽管制,做到智能应答,保障通话质量。 ...

April 12, 2021 · 1 min · jiezi

关于android:浅谈一个优秀的-Android-SDK-需要具备哪些要点

一、前言从事 Android 研发的工作有五年多的工夫了,最近两年多的工夫始终参加开发和保护神策数据 Android SDK[1]。两年工夫,从懵懵懂懂到略有心得,心愿通过本文介绍下 SDK 开发过程中的一些教训。期待对大家有所帮忙,更期待可能失去大家的领导。 正式介绍 SDK 开发教训之前,咱们先来答复两个问题: 1. 什么是 SDK ?置信做过 Android 研发的同学,对很多第三方的 SDK 应该不会生疏,例如:极光 SDK、支付宝 SDK、微博 SDK 等。SDK 的全称是 Software Development Kit,翻译过去是软件开发工具包,通常是为辅助开发某类软件而编写的特定软件包。 2. App 开发与 SDK 开发有什么区别呢?App 开发偏差于用户层面,从 UI 展现到业务逻辑解决,全程解决用户的行为。而 SDK 开发偏差于性能方面,重视性能的开发实现,对于 UI 的设计与开发占比很少。 基于上述两个事实,咱们来看下 SDK 开发中的一些开发准则。 二、开发准则2.1 根本准则开发 SDK 中,最重要的一条根本准则是要尽可能的稳固,不能影响集成方的性能(例如:不能呈现 crash、不能呈现性能问题等)。 随着越来越多的客户应用 SDK,对于 SDK 的要求越来越高。一旦 SDK 引起了解体等问题,会对许多 App 造成灾难性的影响。因而,对于 Android SDK 的开发来说,要留神 try...catch 的应用、对象的查看等。 2.2 设计准则在保障根本准则的前提下,开发 SDK 还存在一些通用的设计准则,上面咱们来具体介绍下。 首先,须要明确 SDK 的作用是为集成方提供一些性能。因而,要致力升高用户的上手难度,并且要易于了解。其次,要使 SDK 代码易于保护。 具体而言,次要概括为上面几点: 2.2.1. 接口易用性 ...

April 6, 2021 · 1 min · jiezi

关于sdk:SDK介绍及相关功能测试

本文首发于:行者AI对于游戏测试来说,SDK是关上游戏后弹出的登录窗口、是游戏设置中的切换帐号、是进行充值时调起的领取窗口、是后盾查看打点数据时的传入接口,本文将联合游戏对SDK及相干功能测试进行介绍。 1. 什么叫SDK?狭义上来说SDK全称Software Development Kit,软件开发工具包。个别都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建设应用软件时的开发工具的汇合,它能够简略的为某个程序设计语言提供利用程序接口API的一些文件,但也能够包含能与某种嵌入式零碎通信的简单硬件。个别包含用于调试和其余用处的实用工具。SDK还常常包含示例代码、支持性的技术注解或者其余为根本参考资料廓清疑点的反对文档。 2. 游戏测试与渠道SDK2.1 游戏内的SDK那么游戏测试该如何了解SDK,以及在测试过程中该如何对渠道SDK进行测试呢?上面我会进行一个具体的阐明。 首先在点击图标进入游戏后,在登录帐号阶段,咱们就会利用到SDK,游戏在上架时依据下载商城不同会有不同的渠道,例如小米、B站、华为等,对于各个不同的渠道,他们的SDK也是不同的,八仙过海,各显神通,最终在登录、领取、显示等各个方面都会有所区别。 帐号登录,在不同的游戏上有不同的显示,例如腾讯游戏的QQ登录形式、微信登录形式;网易游戏的邮箱登录形式、帐号登录形式;海内游戏的Google登录形式、Facebook登录形式等等,都是通过点击界面上的登录形式,而后调起SDK的登录窗口,才能够进行帐号密码的输出,最终进入游戏,上面是一些不同渠道的SDK登录显示。 那么既然不同渠道的SDK大不相同,不同渠道的SDK在测试时也要别离进行测试,以保障游戏性能内容的完整性,不过各渠道间也是基于同一个母包接入的不同SDK,按理来说除SDK外,其余性能应该没什么差异,所以在进行测试时只进行性能上的冒烟测试,缩小无谓的工作,不用浪费贵重的工夫~ 2.2 SDK测试点SDK的测试,其实对于每家公司来说都是不雷同的,基于本人公司的SDK当然要放在测试的首位,须要将SDK内整合的所有性能进行全量测试,包含登录、登出、切换帐号、遗记明码、游客登录、防沉迷相干、实名相干、未成年相干、注册相干等全副进行测试;对于其余渠道包的渠道SDK而言呢,在首次接入时也须要将上述全副性能进行测试,而在后续的版本升级保护中,渠道SDK的性能变更在渠道方会有对应的人员来进行测试,我方则须要着重对付费及各种登录形式进行关注,其余一些防沉迷、实名等在有需要变更时也须要进行测试来达到二次保障。 2.3 SDK领取付费对于一款游戏来说是重中之重,所以在此我独自将这一块离开来说,一款游戏是否胜利、是否盈利从游戏付费下面就能够体现,那么付费和SDK之间又有什么分割呢?在游戏中进行领取时,点击购买游戏中的商品,依据SDK的不同,调起的领取页面也是不同的。 依据这些不同的页面和领取形式,咱们须要一一进行测试,例如:支付宝领取、微信领取、银联领取、QQ钱包领取、渠道币领取等,付款后查看物品是否到账、扣钱是否正确、商品价格是否正确、商品名称显示是否正确、购买取得的物品是否应用等。 2.4 SDK接口测试性能测试:保障SDK接口满足特定的性能需求,比方资源占用、挪动设施耗电量等。登录时可能收到大量同步数据包和离线音讯包,那么对这些数据包的解析以及本地贮存的性能就要进行保障,否则可能呈现登录响应很慢甚至卡住的问题,所以测试时就须要思考这个场景的性能。 兼容性测试:保障SDK兼容特定的设施平台,并与其他软件兼容。包含横屏游戏、竖屏游戏、各种异形屏的手机及各种安卓、IOS版本号是否失常应用。SDK兼容性测试须要思考下对模拟器的反对,因为很多开发者可能就是先在模拟器上开发。客户端SDK笼罩多平台设施的,还要思考多端音讯数据包的互通。 网络相干测试:保障在各种不同的网络环境下,SDK能够失常的接发音讯,也能够叫做弱网测试,相似在2G、3G、4G、wifi、无网环境下进行SDK的相干性能,保障性能能够失常应用,能够与市面上的竞品游戏进行比照,查看成果。 2.5 数据埋点对于一款游戏来说,有成千上万甚至数百万的玩家,那么怎么来计算他们的充值形式及充值金额呢?这里就须要用到SDK的接口,原本领取就是集成于SDK内的一个性能,那么通过他的接口来进行统计必定是最不便不过的啦~ 在测试上,须要留神的点就是要保证数据的准确性,例如充值的平台、金额、工夫、订单数、是否应用了优惠卷等等,要保障这些数据能够精确的被后盾接管,如果在这方面呈现了问题,那可是很重大的哦,所以肯定要保障认真,不能马虎! 3. 总结总之,手游与SDK的关系是密不可分的,在测试中也是一样,SDK的测试属于重中之重,如果这方面出了问题会影响到用户的登录及付费,所造成的影响是无奈接受的,而且在每次版本更新时,SDK简直都会进行降级迭代,更可能导致呈现各种各样的问题,这个时候最须要测试同学仔细检查,以防呈现问题影响到线上玩家。

March 23, 2021 · 1 min · jiezi

关于sdk:融云-Web-SDK-如何实现只有一个设备登入

背景在集成融云的即时通讯时,产品脑门一拍说:咋们要实现一个性能,不论是 Web 端还是挪动端登入,必须只能一个端登入胜利并且后登入胜利的账号须要踢掉后面登入的账号。 咋的一听感觉还蛮简略的,融云不是有一个服务嘛:叫做多设施音讯同步,我把该服务关掉不就行了~~ O(∩_∩)O哈哈~ 然而....... ┭┮﹏┭┮ 是我想的太简略了,服务关掉之后 Web 端确实能够进行互踢了,然而挪动端和 Web 端还是能够在线呀,原来默认的状况下,融云仅反对 1 个 Web 端、1 个 桌面端、1 个挪动端同时在线 这个是融云多端同时在线详情:https://docs.rongcloud.cn/v4/views/im/noui/guide/group/connection/multiclient/ 话不多说,开始揭开谜底 1、首先将多设施音讯同步 - 敞开,敞开连贯:https://developer.rongcloud.cn/advance/index/YTrydqMSdEsmBtX2zX0Amg 2、这时如果多端登入状态监听会监听到状态码 6 时,执行断开链接 代码示例 im.watch({ conversation: function(event){ var updatedConversationList = event.updatedConversationList; // 更新的会话列表 console.log('更新会话汇总:', updatedConversationList); console.log('最新会话列表:', im.Conversation.merge({ conversationList, updatedConversationList })); }, message: function(event){ var message = event.message; console.log('收到新音讯:', message); }, status: function(event){ console.log('连贯状态码:', status); var status = event.status; if(status == 6){ im.disconnect().then(function() { console.log('断开链接胜利'); }); } }}); ...

March 18, 2021 · 1 min · jiezi

关于sdk:SDK-兼容-JSON

最近在集成融云 SDK,于是看了下融云的 SDK 源码,发现源码中有一段针对 JSON 的适配,因为针对 IE9 以下不反对 JSON 对象的解决形式,在此分享下 1、长处: 除中文外的字符都会转为 Unicode 。 2、毛病:JSON.parse() 应用 eval 进行转换的,这个办法不是很平安,还看到人介绍用 new Function ,然而没有测试,这里临时标记下,有空测试下。 if (!window["JSON"]) {window["JSON"] = (function () { function JSON() { } JSON.parse = function (sJSON) { return eval('(' + sJSON + ')'); }; JSON.stringify = function (value) { return this.str("", { "": value }); }; JSON.str = function (key, holder) { var i, k, v, length, mind = "", partial, value = holder[key], me = this; if (value && typeof value === "object" && typeof value.toJSON === "function") { value = value.toJSON(key); } switch (typeof value) { case "string": return me.quote(value); case "number": return isFinite(value) ? String(value) : "null"; case "boolean": case "null": return String(value); case "object": if (!value) { return "null"; } partial = []; if (Object.prototype.toString.apply(value) === "[object Array]") { length = value.length; for (i = 0; i < length; i += 1) { partial[i] = me.str(i, value) || "null"; } v = partial.length === 0 ? "[]" : "[" + partial.join(",") + "]"; return v; } for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = me.str(k, value); if (v) { partial.push(me.quote(k) + ":" + v); } } } v = partial.length === 0 ? "{}" : "{" + partial.join(",") + "}"; return v; } }; JSON.quote = function (string) { var me = this; me.rx_escapable.lastIndex = 0; return me.rx_escapable.test(string) ? '"' + string.replace(me.rx_escapable, function (a) { var c = me.meta[a]; return typeof c === "string" ? c : "u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; }; JSON.rx_escapable = new RegExp('[""u0000-u001fu007f-u009fu00adu0600-u0604u070fu17b4u17b5u200c-u200fu2028-u202fu2060-u206fufeffufff0-uffff]', "g"); JSON.meta = { "b": "b", "   ": "t", "n": "n", "f": "f", "r": "r", '"': '"', "''": "''", "": "" }; return JSON;})();} ...

March 18, 2021 · 2 min · jiezi

关于sdk:结合融云-WebSDK-了解-WebSocket-基本原理

近期应用融云开发聊天页面, 通过抓包, 发现融云 SDK 应用 WebSocket 实现与服务端通信, 因而简略理解 WebSocket 的实现原理 融云 SDK 文档: https://docs.rongcloud.cn/v4/ WebSocket 与 HTTP1、HTTP 协定没有为了 WebSocket 的呈现扭转 2、WebSocket 属于 HTTP 之后的新协定 3、两者有交加, 也各有不同 4、WebSocket 借用 HTTP 协定实现一部分握手 WebSocket 握手通过抓包融云 WebSocket 申请, 重点关注以下几个字段 以上为发动 WebSocekt 申请抓包, 首先关注比 HTTP 多出的数值: // 告知服务器, 发动的是 WebSocket 协定, 服务需进行 WebSocket 解决Upgrade: websocketConnection: UpgradeSec-WebSocket-Key: aI0TsvW7jltfmNOF+1eSqg== // Base64, 浏览器随机生成. 与前面服务端响应的 Sec-WebSocket-Accept 配套, 提供根本的防护. 比方歹意的连贯, 或者无心的连贯Sec-WebSocket-Version: 13 // 示意 websocket 的版本. 如果服务端不反对该版本, 须要返回一个 Sec-WebSocket-Versionheader, 外面蕴含服务端反对的版本号再查看 Response Headers: ...

March 18, 2021 · 1 min · jiezi

关于sdk:通过融云-WebSDK-简单了解-WebSocket

近期应用融云开发聊天页面, 通过抓包, 发现融云 SDK 应用 WebSocket 实现与服务端通信, 由此简略理解下 WebSocket 的应用 须要 WebSocket 的起因: 一句话总结: HTTP 协定只能由客户端发动, 服务端响应. WebSocket 可服务端被动发动, 也可客户端发动. 能实现的场景更多、更简单 相干材料如下: 融云开发文档: https://docs.rongcloud.cn/v4/ WebSocket Web API: https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket WebSocket Node API: socket.io、ws、uWebSockets (任选其一) 融云抓包测试地址: https://rongcloud.github.io/websdk-demo/api-test/ 通过抓包可知, 融云链接 websocket 时还带了 appkey、token、SDK 版本信息 接下来实现一个简略地 客户端 + 服务端示例 Nodejs 服务端此处示例应用 ws 模块 创立链接: const Port = '2928';const wss = new WebSocket.Server({ port: Port });wss.on('connection', function (ws, event) { const url = event.url; // url 为客户端链接地址, 可拼接参数. 比方融云拼接了 appkey 等信息: ?appid=n19xxxxxx&token=xxxxxxxx /* 监听链接敞开 */ ws.on('close', () => { // 此 ws 链接已断开. do something });});监听客户端音讯: ...

March 18, 2021 · 2 min · jiezi

关于sdk:使用融云-Web-SDK-撤回消息

我的项目依据融云的文档曾经实现了简略的聊天性能,当初须要实现的需要是能对发送胜利的音讯可能撤回 参考文档:https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgrecall/web.html 参考代码: var conversation = im.Conversation.get({ targetId: '接管方的 userId', type: RongIMLib.CONVERSATION_TYPE.PRIVATE});conversation.recall({ messageUId: 'BH5T-JG24-C445-IKQM', sentTime: 1585638211857}).then(function(message){ console.log('撤回音讯胜利', message);}); 依据文档集成,齐全没有问题,音讯可能撤回且原音讯将被删除,然而这里有两个问题: 1、获取历史音讯时,撤回音讯都在最初面,我该如何确认该音讯的原地位? 2、当我撤回该音讯的最初一条时,获取会话列表数据中的最初一条音讯 latestMessage 还是显示之前的撤回音讯,这个该怎么解决? 综上的问题,都到融云开发者后盾提工单查找了解决办法: 如何确认该音讯的原地位:在发送胜利的撤回音讯中有 sentTime 字段,能够在历史音讯中通过比拟 sentTime 来确认撤回音讯的具体位置 会话列表 latestMessage 显示之前的撤回音讯:跟融云的技术人员沟通过后失去的论断是,该问题是融云发现的已知问题,会在下个 SDK 版本修复。我目前应用的 SDK 版本是 3.0.7.1,只能坐等更新啦 总结:心愿能帮到碰到同样问题的童鞋,当然在集成的时候看文档还是很重要的,融云有提工单的服务还是蛮不错的,在碰到切实解决不了的问题能够寻求融云的技术人员帮忙,心愿融云越做越好

March 18, 2021 · 1 min · jiezi

关于sdk:集成融云小程序-SDK-遇到的问题

集成版本最后集成 3.0.5, 最初更新至 3.0.7.1 文档: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/setting/include/mini.html 问题列表1、链接返回 31012 文档解释 31012 为平安域名谬误, 请至开发者后盾查看设置的平安域名 但小程序开发, 不应该波及平安域名问题. 所以只能到融云开发者后盾提工单查找解决问题 征询后果后, 起因为: 融云 3.0.5 SDK 在小程序环境中, 谬误的认为以后环境为 Web, 且我本人的 AppKey 的确在融云开发者后盾设置了平安域名. 导致有此限度 解决办法有两种: 降级 SDK 至以后最新的 3.0.7.1. 最新 SDK 已修复此问题去掉我本人融云开发者后盾的平安域名两者选其一即可 2、在模拟器运行没有问题, 真机运行无奈链接 通过微信开发者工具 + 真机调试, 发现报错微信非法域名限度 依照融云文档配置非法域名后, 此问题解决 文档: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/setting/include/mini.html#domain 3、发送图片音讯, 挪动端无奈显示, 但小程序可失常显示 通过文档, 发现是小程序端发送图片音讯时, content 内不蕴含缩略图字段 融云 IMKit 默认是展现缩略图的, 而本小程序我的项目内的渲染逻辑为显示 remoteUrl, 最终导致了此问题 依照文档增加 content 字段后, 此问题解决 文档: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html?plat=mini#ImgMsg

March 18, 2021 · 1 min · jiezi

关于sdk:融云-Web-SDK-删除历史消息

前提: 已通过融云 SDK 实现单群聊聊天性能 需要: 在现有根底上, 实现删除历史音讯的性能 先依照需要梳理须要实现的步骤: 1、依据融云文档删除历史音讯 2、调用删除历史音讯接口胜利后. 界面同样做删除/跳转的渲染 3、调用获取会话列表界面 4、依据最新会话列表数据从新渲染会话列表 依据融云文档, 可知会话列表和历史音讯的关系如下: https://docs.rongcloud.cn/v4/views/im/ui/faq/glossary.html#conversation-history-msg 删除历史音讯依据融云文档, 发现融云蕴含两种删除音讯办法, 别离为: 按音讯 Id 删除、按工夫戳删除 按音讯 Id 删除: 依据文档可知, 按音讯 Id 删除其实就是传入单个 或 多个音讯 messageUId, 删除传入的音讯 实用场景: 1、右键删除单个音讯 2、批量删除会话内音讯 var conversation = im.Conversation.get({ targetId: '接管方的 userId', type: RongIMLib.CONVERSATION_TYPE.PRIVATE});conversation.deleteMessages([ { messageUId: '2jJ9-KU1j-OLJG-29KL', sentTime: 1580869079801, messageDirection: 1 }, { messageUId: '8UJ9-JU9j-WSJG-92K0', sentTime: 1580869078886, messageDirection: 1 }]).then(function(){ console.log('删除历史音讯胜利');}); 按工夫戳删除: 按工夫戳删除即为传入工夫戳, 将会删除此工夫之前的所有音讯 实用场景: 1、清空某会话所有音讯 2、革除某会话某工夫之前所有音讯 var conversation = im.Conversation.get({ targetId: '接管方的 userId', type: RongIMLib.CONVERSATION_TYPE.PRIVATE});conversation.clearMessages({ timestrap: +new Date()}).then(function(){ console.log('革除历史音讯胜利');}); ...

March 18, 2021 · 1 min · jiezi

关于sdk:融云-RTC-SDK-集成实现直播趟坑之旅

最近理解了下实时音视频,因为之前公司用户融云的额 IM SDK,看文档是看到过,所以这次也从融云开始吧。 整体来来说并不算顺利,遇到了写问题。 遇到的问题 主播在什么机会渲染视频资源。观众没有下麦接口。观众操作稍微迷茫。观众端调用退出房间报错。通过认真找文档和提工单,问题都一一解决。 问题一: 在主播获取资源时既能够渲染。 问题二: 观众临时下麦只能调用 room.leave 退出房间,而后在调用订阅从新订阅主播,这点集体感觉很奇怪,不给过融云也反馈了前期会补全此性能,体感还不错,最起码会思考咱们开发者的意见,点个赞~。 问题三: 观众端也须要执行前置条件进行 IM 和 RTC 的初始化连贯,在就间接调用 stream.subscribe 订阅主播资源即可,看上去还蛮不便的。 问题四: 调用退出房间报错 53004,找了半天没发现哪里有问题,起初发现是本人文档没留神,在初始时没有留神角色,因为 IM 和 RTC 的初始化连贯步骤是统一,导致我就用了一套代码,其实角色是须要离开的,没有留神。好吧~~ 下面四个问题实质来说稍微有点小白,不过的确是卡住了下。好在都完满解决了。 自己就是参照文档中的代码,大家如果有遇到相似的问题也能够看下我看的这个文档。 连贯类:参考的前置条件,须要留神的是初始 RTC 时角色问题。文档:https://docs.rongcloud.cn/v2/views/rtc/livevideo/guide/quick/premise/web.html 主播端:这个容易,除了个别渲染问题,整体很晦涩。文档:https://docs.rongcloud.cn/v2/views/rtc/livevideo/guide/quick/anchor/web.html 观众端:订阅下就好了 https://docs.rongcloud.cn/v2/views/rtc/livevideo/guide/quick/audience/web.html 也参考了融云的 Demo,拿到须要换下新版本的 SDK 间接就能用,指引还是不错的。大家也能够下载下来跑跑看。通过指引教程能够下载。 https://docs.rongcloud.cn/v2/views/rtc/livevideo/guide/demo/web.html 最初配上融云的官网文档,如有趣味大家能够去理解体验下。初期体验还是有点磕磕绊绊,不过都顺利解决了。 最初附上融云官网:https://www.rongcloud.cn/

March 18, 2021 · 1 min · jiezi

关于sdk:使用融云-IM-SDK-实现-H5-直播聊天

当我拿到这个需要,脑子里呈现了淘宝各大直播场景,尤为印象粗浅的李佳琪的 ‘我的妈呀!’,’买它买它买它!‘,‘Oh my god!’。而后默默点开了直播。好吧,有点跑题,其实我就是想去理解下,之前都是作为看直播的人在看直播,当本人接到了这样的需要当然还要再进去看看,果然情绪不一样了。 。。。。此处不赘述心路历程了。。。。第一波体验实现。静静期待公司的具体需要。 需要评估时公司提出来须要用融云的 SDK,让咱们先理解下聊天室场景的相干内容。带着我之前的体验,去看文档目标还是挺明确的。融云的文档会有场景介绍,这点还是不错的,配上需要和之前体验的心得,很容易找到了我想要的货色。 抽离出的性能: 首先我须要一个聊天室其次我须要发送音讯,嗯音讯分的很明确,过后看到的文本和表情都有。我的礼物怎么办?我的点赞怎么办?人员退出退出我要如何显示?尽管带有问题,然而集体感觉还是先上手体验下会又不一样的感触。查看到有 Demo 正好能够参考借鉴下。 参考文档: https://docs.rongcloud.cn/v2/views/im/noui/guide/chatroom/setting/include/web.html 参考 Demo:https://github.com/rongcloud/websdk-demo/tree/master/chatroom-h5 效果图可查看融云 demo 的线上体验地址:https://rongcloud.github.io/websdk-demo/chatroom-h5/demo.html?id=11 这样我的大部分需要都实现了,退出,发消息,点赞等。看 Demo 后发现我的放心解决了很多,比如说人员退出和点赞,看 Demo 中间接应用了自定义音讯,这点还是很不错的。点个赞~ 上一部分外围代码 初始化连贯 RongIMLib.RongIMClient.init(appKey);registerMessageType();RongIMClient.connect(token, { onSuccess: function (userId) { RongIM.ready = true; RongIM.userInfo = { data: { userId: userId }, status: "ok", info: "链接胜利" }; callbacks.onConnected && callbacks.onConnected(RongIM.instance, RongIM.userInfo); }, onError: function (errorCode) { RongIM.ready = false; RongIM.userInfo = { data: {}, status: "fail", info: errorCode }; for (var i = 0, len = onConnectList.length; i < len; i++) { onConnectListi; } }}); function registerMessageType() { var messageName = 'PersonMessage'; var objectName = 's:person'; var isCounted = true; var isPersited = true; var mesasgeTag = new RongIMLib.MessageTag(isCounted, isPersited); var prototypes = ['name', 'portrait', 'id']; RongIMClient.registerMessageType(messageName, objectName, mesasgeTag, prototypes); var messageName = 'LikerMessage'; var objectName = 's:liker'; var isCounted = false; var isPersited = false; var mesasgeTag = new RongIMLib.MessageTag(isCounted, isPersited); var prototypes = ['likerNum']; RongIMClient.registerMessageType(messageName, objectName, mesasgeTag, prototypes);} ...

March 18, 2021 · 2 min · jiezi

关于sdk:Web-端集成融云-SDK-如何发送正确图片消息给移动端展示

前言Web 端应用融云的即时通讯 SDK 在发送图片音讯给挪动端的时候,挪动端个别会收到一个缩略图数据和展现高清图片地址,然而往往 Web 端发送的图片音讯总数不对,所以咋们聊一聊 Web 端如何正确发送图片音讯 总结步骤如下: 1、如何拿到高清图片地址 <imageUri> 2、如何生成缩略图数据 <content>首先要对发送图片音讯的参数要有所理解 上面是融云提供发送图片音讯的代码: var conversation = im.Conversation.get({ targetId: '接管方的 userId', type: RongIMLib.CONVERSATION_TYPE.PRIVATE});conversation.send({ messageType: RongIMLib.MESSAGE_TYPE.IMAGE, // 'RC:ImgMsg' content: { content: '/9j/4AAQSBAAD/2wBDDBAYEBAQEB....', // // 压缩后的 base64 略缩图, 用来疾速展现图片 imageUri: 'https://www.xxx.cn/images/new...' // 上传到服务器的 url. 用来展现高清图片 }}).then(function(message){ console.log('发送图片音讯胜利', message);}); 上面是参数阐明 如何拿到高清图片地址 <imageUri>依据融云上传图片文档的形容来开发即可......这里不多形容了,免得占篇幅,详情能够拜访这个网站:https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html#ImgMsg 如何生成缩略图数据 <content>什么是缩略图? 在融云文档定义的缩略图是 base64 格局,并且 base64 字符串大小不能超过 80kb ,还有一点就是 base64 必须不带前缀所以咱们要做到如下几点 1、进行 base64 格局转换 2、进行压缩 3、去掉 base64 的前缀 进行 base64 格局转换并且压缩 转换 base64 :我应用的是 canvas.toDataURL 办法 压缩:应用 canvas 的 drawImage() 办法 ...

March 18, 2021 · 1 min · jiezi

关于sdk:集成融云-SDK-怎么实现多端同步未读数

最近在集成融云 SDK 的时候,碰到了一个跟未读数无关的问题,景象是这样的: 比方我在其中 Web 端曾经革除了某个会话的未读数而后退出,再换个设施登入,这个时候未读数还有,并没有革除掉,我就纳闷了,我明明曾经革除了会话未读数的呀,怎么换个设施登入就又有了呢? 必定是融云的 BUG ,所以我立马就提了一个工单,暗想:哈哈,给我逮着了一个 BUG (有点了解测试人员的高兴起源了) 可是大失所望,跟融云技术人员沟通后才发现是我这边须要做多端同步未读数同步的操作 先讲讲会话未读数是什么?从字面上就看进去是指某一个会话中未读音讯的数量,在会话数据中 unreadMessageCount 示意以后会话的未读音讯数未读音讯存在 localStorage 中,未读音讯数是针对以后端的未读音讯数,服务器不存未读音讯数量 革除浏览器缓存会导致会话未读数不精确若浏览器不反对或禁用 localStorage,未读音讯数将不会保留,浏览器页面刷新未读音讯数将不会存在 为什么须要多端同步未读数?起因是换端登入,融云这边有音讯弥补机制,即换端从新登录时,获取当天收发的所有音讯,在收音讯的过程中,通过 SDK 外部逻辑解决,会累加会话未读数且存在 localStorage 中 所以,如果不同步的话就会呈现多端未读数不统一的状况怎么多端同步未读数(重点来咯)1、调用 conversation.read() 革除未读数。 2、革除胜利后发送 RC:SRSMsg 类型音讯进行未读数同步。 3、其余端承受到 RC:SRSMsg 类型音讯,掉用 conversation.read() 办法进行本地未读数革除 看代码: 革除端// 革除未读数let conversation = im.Conversation.get({ targetId: '接管方的 userId', type: RongIMLib.CONVERSATION_TYPE.PRIVATE});conversation.read().then(function(count) { console.log('获取指定会话未读数胜利', count); // 发送同步音讯 conversation.send({ messageType: 'RC:SRSMsg', content: { //从音讯里获取服务器端工夫,以最近一条已读 message 为准 lastMessageSendTime: message.sentTime; } }).then(function(message){ console.log('发送同步音讯胜利', message); }); }); 同步端// 其余端在音讯监听中接管到同步音讯后,调用革除未读数做更新解决// 收到同步音讯进行未读数革除操作 调用 conversation.getUnreadCount() 胜利后不须要再在发送 RC:SRSMsg 类型音讯。let conversation = im.Conversation.get({ targetId: '接管方的 userId', type: RongIMLib.CONVERSATION_TYPE.PRIVATE});conversation.read().then(function(count) { console.log('获取指定会话未读数胜利', count);}); ...

March 18, 2021 · 1 min · jiezi

关于sdk:融云-Web-SDK-如何实现语音的收发

依据融云的开发文档, 总结得出, 融云 WebSDK 须要的是一个 aac 格局的音频 url, 不关注 url 如何生成. 生成 url 的步骤由开发者实现 文档: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html#HQVCMsg 所以关注点放在以下几个问题: 1、Web 端是否实现语音录制 2、联合融云 SDK 实现语音的发送 3、联合融云 SDK 实现语音的接管和播放 Web 端是否实现语音录制答案是能够. 不过只有局部浏览器反对, 录制的音频格式有很多限度, 且只有以后站点为 localhost 或 https 时才可应用 录制原理: getUserMedia、MediaRecorder 应用 getUserMedia 获取音频流, 应用 MediaRecorder 录音获取音频数据 以下为录制 5s, 获取 File 对象的代码: // 通过 getUserMedia 获取音频流navigator.mediaDevices.getUserMedia(constraints).then((stream) => { const mediaRecorder = new MediaRecorder(stream); const chunks = []; // 收集音频数据 mediaRecorder.ondataavailable = function (e) { chunks.push(e.data); }; // 监听音频录制进行 mediaRecorder.onstop = e => { const blob = new Blob(chunks); blob.lastModifiedDate = new Date(); const file = new File([blob], 'audio_file.aac', { type: "audio/aac" }); // 获取到 File 对象, 可将此对象上传至服务器, 获取音频 url }; mediaRecorder.start(); // 开始录音. 此处主动开始, 读者可按产品逻辑点击某个按钮触发录音 setTimeout(function () { // 5s 倒计时主动进行录音. 读者可按产品逻辑设置进行机会 mediaRecorder.stop(); }, 5000)}); ...

March 18, 2021 · 2 min · jiezi

关于sdk:微信小程序集成融云-SDK-即时通讯-集成必备条件

前言最近公司须要用微信小程序做一个可能让用户沟通的性能,通过后期筛选和比照,最初还是抉择了应用融云的即时通讯,上面是我用小程序首次集成融云的 SDK 碰到的问题,在此做个记录不便本人查看,同时也给有须要的同学作为参考。 前端小鸟一枚,立誓要成为前端菜鸟,有余中央留言指出,小子谢过。 筹备工作1.官网注册(https://www.rongcloud.cn/) 进入开发者后盾 - 创立利用 - 获取 appkey (很重要!很重要!很重要!) 获取用户 token ,一开始我很费解为什么要获取 token ?token 是什么?怎么获取 token?(暴击三连问 o(╥﹏╥)o)简略来说就是用户的身份标识。 这里就不一一解答了,间接看 官网地址 - token 就行了,外面说的很分明。对于在前端开发阶段,还没有和后端对接时,举荐应用融云开发者后盾中的 API 调用(在调试方面,真的太好用了)传入正确的参数即可 下载 SDK留神:小程序 SDK 须要开明小程序服务后,在开发者后盾中获取 然而在文档中又看到说 3.x 小程序与 Web SDK 雷同,那用 Web 端的 SDK 也是能够的咯,为什么还要开明服务能力获取呢,算了!能用就行开始集成1、首先要需在微信公众平台配置以下非法域名(配置详情请点击这里),微信小程序如何配置非法域名应该不须要说了吧 2、SDK 初始化 开发者在应用融云 SDK 所有性能之前,开发者必须先调用此办法初始化 SDK。 在利用整个生命周期中,开发者只须要将 SDK 初始化一次var im = RongIMLib.init({ appkey: ' '  // 这里就是咋们在开发者后盾取得到的 appkey}); 3、设置监听 监听音讯、状态、会话列表的变动留神:当设置多个 im.watch 的时候, 当收到一条音讯后, 每个 watch 都会监听到此音讯,所以会呈现发一条音讯,然而会反复收到这条音讯解决:在全局设置监听一次即可,不要放在组件生命周期中,避免每次组件重载都设置一次var conversationList = []; // 以后已存在的会话列表im.watch({ conversation: function(event){ var updatedConversationList = event.updatedConversationList; // 更新的会话列表 console.log('更新会话汇总:', updatedConversationList); console.log('最新会话列表:', im.Conversation.merge({ conversationList, updatedConversationList })); }, message: function(event){ var message = event.message; console.log('收到新音讯:', message); }, status: function(event){ var status = event.status; console.log('连贯状态码:', status); }}); ...

March 18, 2021 · 2 min · jiezi

关于sdk:融云-Web-SDK-如何实现表情的收发

公司需要: 要求聊天产品像 QQ、微信一样, 能够接管、发送简略表情 首先查看融云开发文档, 能够看到表情插件的形容, 但与产品需要不完全一致, 还须要联合其余办法实现更丰盛的表情性能 次要与产品不符的中央: 1、融云提供的表情个数无限, 仅 128 个 2、融云提供的表情没有 QQ 表情活泼丰盛 融云表情插件: https://docs.rongcloud.cn/im/imlib/web/plugin/emoji/ 接下来顺次按程序介绍: 1、什么是 Emoji 2、如何实现类 QQ 的表情抉择框 3、联合融云 SDK 实现表情的发送 4、联合融云 SDK 实现表情的接管 什么是 Emoji ?Emoji 日语 绘文字. 是日本在无线通信中所应用的视觉情感符号, 绘指图画, 文字指的则是字符, 用于在音讯中插入表情. 自 2007 年苹果公司公布的 iOS 5 输入法退出 Emoji 后, 这种表情符号开始席卷寰球 最后 Emoji 实现仅为将字符转为图片显示. 比方: :) 在音讯中被替换为 ????. 所以难以标准化 2010 年, Unicode 编码退出 Emoji 字符, 使其标准化. 也就是目前 Emoji 与文字一样, 自身就是字符, 零碎或浏览器会主动将其转化为图形展现 Emoji 列表: http://unicode.org/emoji/charts/full-emoji-list.html ...

March 18, 2021 · 2 min · jiezi

关于sdk:融云IM-SDK-web-端集成-表情采坑篇

公司集成 IM 应用的是融云的 IM SDK,咱们有挪动端,有 web 端,挪动端共事集成表情时还是蛮顺利的貌似挪动端 SDK 里就反对,所有都很牵强附会的样子,web 端就有些辣手了。web 端的表情是须要独自引入插件的,这点还是有点困惑的。 一脸懵的看着文档,踩着优雅的脚步入坑,实现我的表情集成采坑之旅这第一步不用说必定是 SDK 的初始化和连贯了。这些在文档的指引下都是很顺利的还很快慰,还为文档的粗疏点过赞。 这第二步就是细化相干性能了。比如说发消息时能够带表情。 手动划重点专用~依照文档https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html#emoji中的示例发了一条表情音讯,完满胜利了。看到文档中有 Emoji 插件,好奇的点开看看。好吧 ╮(╯▽╰)╭,如果要发表情音讯须要集成插件。 没关系,没关系,一个插件而已。有文档有教程不怕不拍的 (_^▽^_) 开心的看着文档,优雅的写着代码~~按步骤集成,自认为自己是个比拟听话的,文档让咱干嘛就干嘛。决不搞非凡。 so ~ 所有都很完满很太平。开心的集成,拿到了了表,发消息也能够失常携带了,美美的给了挪动端,你看胜利了 ~ 哈哈哈暗自窃喜中 ヾ( ̄ー ̄)X(^▽^)ゞ 奈何挪动端共事也同样会给了我一份大礼给 web 发了个带表情的音讯。点开一看。这什么。。。这什么。。。这一堆黑框是什么鬼 -_-|| 额 ~ 我做错了什么。。。查看了变没问题啊,看了眼数据心里刺激了许多,原来收到的就是那么个黑框,于是名正言顺的去融云提了工单。 工单问答工夫:问:web 端收到的表情展现成方块 答: 1、web 端展现 emoji 时, 不论是通过历史音讯还是音讯监听器监听的音讯, 都须要调用 emojiToHTML 转成 HTML 或者应用 symbolToEmoji 将 unicode(您说的小方块) 转化成原生 emoji 字符 2、不同浏览器, 不同设施, 展现的原生 Emoji 表情都不同 3、如需多端展现 Emoji 统一, 需应用 emojiToHTML 转化为 HTML 后再展现(此办法为以图片模式展现) 依照工单的提醒对音讯内容做了解决,调用了 emojiToHTML 办法。完满解决。 ...

March 18, 2021 · 1 min · jiezi

关于sdk:Web-端使用融云-SDK-集成实现滑动加载历史消息

刚接触即时通讯的我的项目,在应用融云的 SDK 来实现我的项目需要时,磕磕碰碰,死命看文档和提工单问融云的技术人员,真是一段痛并高兴的历程,哈哈哈!明天分享一个滑动加载获取历史音讯的性能 知识点先看获取历史音讯的代码: var conversation = im.Conversation.get({ targetId: '接管方的 userId', type: RongIMLib.CONVERSATION_TYPE.PRIVATE});var option = { timestrap: +new Date(), count: 20};conversation.getMessages(option).then(function(result){ var list = result.list; // 历史音讯列表 var hasMore = result.hasMore; // 是否还有历史音讯能够获取 console.log('获取历史音讯胜利', list, hasMore);}); 参数阐明: 1、因为 Web 端没有本地存储,不提供本地获取办法,只能从远端获取 2、应用获取历史音讯办法须要在开发者后盾开启 IM 商用版 - 单群聊云存储 服务 3、每次最多只能获取 20 条历史音讯 所以问题来了,获取历史音讯的办法最多只能获取 20 条音讯,那我想获取 20 条之前的音讯,怎么办呢? 咱们须要从它的参数来动手,解决思路就是扭转参数 timestrap (工夫戳),在每次调用 conversation.getMessages 胜利取得历史音讯列表 result.list 后,将 result.list 中 sentTime 值最小的赋值给 timestrap 而后滑动持续调用 conversation.getMessages 即可获取不同时间段的历史音讯,也能够通过扭转参数 order 来扭转是获取该时间段之前的音讯还是之后的音讯。 ...

March 18, 2021 · 1 min · jiezi

关于sdk:作为小白接融云-IM-SDK-新路体验

前提阐明应我的项目需要,实现即时通讯性能,业务场景绝对繁多,仅有单聊场景。选用的是融云的 IM SDK。 作为小白的初期心路历程因为自己之前没有理解过即时通讯初期理解还是费了不少工夫的。蓝瘦~ 话不多说,请看操作第一步:注册 首先要在融云的开发者后盾注册拿到相应的信息。 因为初期理解,本人注册了一个开发者账号,没有用公司的,本人搞了个 appkey 和测试的 token,想着先弄个出样子。账号的注册参考的文档的疾速集成中的 前提条件。 参考地址: https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/premise/ios.html 后续这个服务端会给咱们提供连贯用的 token。这里先不做过多介绍。 第二步:看文档 因为之前对即时通讯业务的盲区,其实最开始公司给出的一对一聊天室有些无从下手的。接下来是漫无目的的逛文档。文档目录还是很对我口味的,个人感觉还不错,在不经意间发现了个切换文档布局的小性能集体比拟喜爱。如果场景不分明就用场景的文档,分明了能够切换成平台的,很不便很清晰。~(。≧3≦)ノ⌒☆ 我次要是通过看单聊的文档还有切换成平台模式的 web 端文档实现的集成。 附上文档地址:https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/include/web.html 第三步:先弄个简略的示例 示例我参考了疾速集成。SDK 应用的是 web 3.x 的 SDK <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="http://cdn.ronghub.com/RongIMLib-3.0.5-dev.js"></script></head><body> <input id='messageValue' type="text/"> <button onclick="sendMessage()">发送</button> <button onclick="getMessageList()">获取历史音讯</button></body><script> var appkey = 'XXX'; var token = 'XXXX'; var im; var conversationList = []; function init() { im = RongIMLib.init({ appkey: appkey }); im.watch({ conversation: function (event) { var updatedConversationList = event.updatedConversationList; console.log('更新会话汇总:', updatedConversationList); console.log('最新会话列表:', im.Conversation.merge({ conversationList, updatedConversationList })); }, message: function (event) { var message = event.message; console.log('收到新音讯:', message); }, status: function (event) { var status = event.status; console.log('连贯状态码:', status); } }); } function connect() { var user = { token: token }; im.connect(user).then(function (user) { console.log('链接胜利, 链接用户 id 为: ', user.id); }).catch(function (error) { console.log('链接失败: ', error.code, error.msg); }); } function sendMessage() { var inputText = document.getElementById('messageValue').value; var conversation = im.Conversation.get({ targetId: 'user1', type: RongIMLib.CONVERSATION_TYPE.PRIVATE }); conversation.send({ messageType: RongIMLib.MESSAGE_TYPE.TEXT, content: { content: inputText } }).then(function (message) { console.log('发送文字音讯胜利', message); }); } function getMessageList() { var conversation = im.Conversation.get({ targetId: 'user1', type: RongIMLib.CONVERSATION_TYPE.PRIVATE }); var option = { timestrap: +new Date(), count: 20 }; conversation.getMessages(option).then(function (result) { var list = result.list; var hasMore = result.hasMore; console.log('获取历史音讯胜利', list, hasMore); }); } init(); connect();</script></html> ...

March 18, 2021 · 2 min · jiezi

关于sdk:融云-SDK-如何实现群组操作

背景在集成融云 SDK 后,须要实现群组操作的音讯告诉。包含: 群创立、销毁告诉群布告告诉群人员退出、退出告诉群昵称批改告诉...融云现有的 SDK 仅提供了 RCGroupNotificationMessage,外部封装了几种简略的类型操作,且扩展性不强,无奈实现现有的操作。 解决方案:应用自定义音讯从新来构建群组告诉音讯。 参考 sealtlak 中的 RCDGroupNotificationMessage,也是独自对群组操作内容,从新进行了封装解决。 /*! 群组告诉音讯 */@interface RCDGroupNotificationMessage : RCMessageContent//操作名@property (nonatomic, copy) NSString *operation;//操作人@property (nonatomic, copy) NSString *operatorUserId;//操作对象@property (nonatomic, strong) NSArray<NSString *> *targetUserIds;//内容@property (nonatomic, copy) NSString *message;//获取摘要 (NSString )getDigest:(NSString )groupId;@end 这个类预约义了上面几种操作类型音讯,具体内容可参考名字定义 extern NSString *const RCDGroupCreate;extern NSString *const RCDGroupMemberAdd;extern NSString *const RCDGroupMemberQuit;extern NSString *const RCDGroupMemberKicked;extern NSString *const RCDGroupRename;extern NSString *const RCDGroupBulletin;extern NSString *const RCDGroupOwnerTransfer;extern NSString *const RCDGroupDismiss;extern NSString *const RCDGroupMemberJoin;extern NSString *const RCDGroupMemberManagerSet;extern NSString *const RCDGroupMemberManagerRemove;extern NSString *const RCDGroupMemberProtectionOpen;extern NSString *const RCDGroupMemberProtectionClose; ...

March 17, 2021 · 2 min · jiezi

关于sdk:为融云聊天页面的输入框添加-Placeholder

产品要求给输入框加个Placeh,其实挺简略一性能,寻遍他们的官网https://www.rongcloud.cn/和文档https://docs.rongcloud.cn/v4/都没有找到相干材料,事实很残暴,SDK 木有这个接口,只能本人实现了,思来想去,用了个笨办法,加个 UILabel 一试,还真行,有须要的您请往下看。 其实就是给输入框价格 UILabel,在该显示的时候显示,该暗藏的时候暗藏就完事儿了,代码如下: 在聊天页面增加一个 UILabel 属性@property(nonatomic, strong) UILabel *placeholderLabel; 初始化并增加 placeholderLabel 对象(void)configPlaceholder { //初始化和设置 self.placeholderLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 180, 20)];[self.chatSessionInputBarControl.inputTextView addSubview:self.placeholderLabel];self.placeholderLabel.text = @"测试 Placeholder"; self.placeholderLabel.textColor = [UIColor grayColor]; self.placeholderLabel.userInteractionEnabled = YES; //增加点击手势 UITapGestureRecognizer *tapLabel = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapPlaceholderLabel)]; [self.placeholderLabel addGestureRecognizer:tapLabel];} (void)tapPlaceholderLabel { [self.chatSessionInputBarControl updateStatus:KBottomBarKeyboardStatus animated:YES];} 在内容发生变化和点击发送后,设置 placeholder 成果的显示(void)inputTextView:(UITextView )inputTextView shouldChangeTextInRange:(NSRange)range replacementText:(NSString )text { //在内容发生变化和点击发送后,设置 placeholder 成果的显示 if ((range.location == 0 && [text isEqualToString:@""]) || [text isEqualToString:@""]) { self.placeholderLabel.hidden = NO; } else { self.placeholderLabel.hidden = YES; }} ...

March 16, 2021 · 1 min · jiezi

关于sdk:融云即时通讯SDK集成-定制UI三-兼容Android-Q

背景:最近公司新上的app要加上即时通讯的性能, 本人疾速实现一个当然是不可能的了(我的项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的有余.最初点兵点将,选了融云家的SDK(老板说了算hhhh). 他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4 如何兼容Android QAndroid 10 适配 前言 为了让用户更好地管制本人的文件,并限度文件凌乱的状况,Android 10(Q) 批改了 APP 拜访内部存储中文件的办法。内部存储的新个性被称为 Scoped Storage。 Android 10(Q) 依然应用 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 作为面向用户的存储相干运行时权限,但当初即便获取了这些权限,拜访内部存储也受到了限度。APP 须要这些运行时权限的情景产生了变动,且各种状况下内部存储对 APP 的可见性也产生了变动 在 Scoped Storage 新个性中,内部存储空间被分为两局部: ● 公共目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones 等 公共目录下的文件在 APP 卸载后,不会删除。 APP 能够通过 SAF(System Access Framework)、MediaStore 接口拜访其中的文件。 ● App-specific 目录 APP 卸载后,数据会革除。 APP 的私密目录,APP 拜访本人的 App-specific 目录时无需任何权限。 融云对于 Android 10(Q)适配 之前 SDK 将媒体文件存储于 /sdcard/RongCloud/Media 中,所以在 android 10(Q) 零碎上会有聊天无奈应用的状况,新版本更新后,会将媒体音讯存储于 :sdcard/Android/data/包名/files/ 中,以保障 sdk 性能的失常应用 ...

March 15, 2021 · 1 min · jiezi

关于sdk:融云即时通讯SDK集成-定制UI一-会话界面小改动

背景:最近公司新上的app要加上即时通讯的性能, 本人疾速实现一个当然是不可能的了(我的项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的有余.最初点兵点将,选了融云家的SDK(老板说了算hhhh). 他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4 这个工作当然还是落在我的头上. 我是应用的他们家的带UI的sdk,(他们家有带UI和不带UI的两种sdk, 不带UI的sdk就是只有即时通讯能力, 所有的UI都须要开发者自定实现, 带UI的sdk封装了一些根本的界面,例如会话列表, 和他人聊天的会话界面.)当然这些曾经集成了UI的sdk并不能齐全满足一个产品的需要, 所以这篇文章次要跟大家讲下如何对他们家的UI进行简略的自定义. 融云SDK接入会话列表/会话界面大家集成的话能够间接依照他们家的疾速集成的步骤走, 蕴含了集成会话列表以及会话界面. 这里是链接: 疾速集成SDK (https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/include/android.html) 接入之后, 能够依照适合的逻辑跳转入这两个根本的界面, 如图所示: 会话列表:会话界面 能够看到咱们的app中当初领有了默认会话列表和会话界面UI, 能够应用根本的性能了. 然而这些根本的UI虽说不上难看, 然而也够不上精美. 所以UI这块还是须要咱们自行来做一些定制的. 为了给大家演示, 我这里改的比拟夸大了一点, 非常俊俏, 但直观哈哈哈. 如图我间接更改了两边发送者&接收者的字体色彩,字体大小,字体款式. 也更改了单方的聊天气泡. 批改一般文字音讯类型的音讯, 间接继承了TextMessageItemProvider. 把父类里边所有的代码都复制进来, 而后在bindView()的时候做批改 能够看到我把款式轻易改了一下. 两个方向的气泡都改成了箭头左向的. @Override public void bindView(final View v, int position, TextMessage content, final UIMessage data) { ViewHolder holder = (ViewHolder) v.getTag(); holder.receiverFire.setTag(data.getUId()); if (data.getMessageDirection() == Message.MessageDirection.SEND) { holder.message.setBackgroundResource(R.drawable.rc_ic_bubble_right); } else { holder.message.setBackgroundResource(R.drawable.rc_ic_bubble_left); } if (content.isDestruct()) { bindFireView(v, position, content, data); } else { holder.sendFire.setVisibility(View.GONE); holder.receiverFire.setVisibility(View.GONE); holder.unRead.setVisibility(View.GONE); holder.message.setVisibility(View.VISIBLE); final AutoLinkTextView textView = holder.message; processTextView(v, position, content, data, textView); } } ...

March 15, 2021 · 1 min · jiezi

关于sdk:融云即时通讯SDK集成-华为推送的点击跳转处理

1.背景:最近公司新上的app要加上即时通讯的性能, 本人疾速实现一个当然是不可能的了(我的项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的有余.最初点兵点将,选了融云家的SDK(老板说了算hhhh). 他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4 这个工作当然还是落在我的头上. 根底的IM聊天, 群组聊天等性能集成在另一篇博客中曾经讲过, 这里就先不说了. 之前的一篇文章曾经讲过, 这篇文章重点讲下华为推送过去的告诉栏点击事件, 这小小的一件事, 可消耗了不少的精力. 融云家SDK接入厂商推送指南这个他家讲的挺分明了, 都近似手把手的教了, 那我也就不在这节约键盘寿命了(偷个懒hhhhh).给他家官网文档往这儿一贴好了: https://docs.rongcloud.cn/v4/views/im/ui/guide/private/notify/push/mi.html. 大家留神一下他家华为厂商推送的文档分2.x和4.x哈, 对应的是他家旧版/新版SDK中接入的厂商的新/旧版本推送包.我这里之前是踩过坑的, 举荐大家还是用他家的4.x的sdk包集成, 里边集成的是华为新版本的推送包. 因为华为曾经在逐步弃用旧版本的推送包了, 所以不想当前麻烦再迭代的话, 还是间接上新版本比拟好, 因为当初曾经有接入旧版本包的app在某些低版本华为Rom上收不到推送了, 还是审慎一点比拟好. 华为推送告诉点击跳转自定义这里咱们所指的跳转是, 点击告诉栏达到的华为推送告诉后, 调起咱们的app, 跳到相应的Activity的. 因为咱们做的是即时通讯App, 所以点击他人发来的音讯推送告诉后, 当然是跳到和该用户聊天的会话页面, 但就是这样一个小业务, 实现起来还真有点麻烦. 所以这里也算是给大家踩踩坑啦. 首先是点击跳转的逻辑, 通过和融云技术支持分割以及查看他们sdk的代码, 得悉他们的推送都是走了一个叫PushMessageReceiver的类, 开发者能够注册并继承该类, 重写onNotificationMessageClicked()办法, 不言而喻这就是对告诉音讯的监听. 可这也是第一个坑, 华为因为平台的限度, 推送告诉的点击事件基本不走这里. 精确的说是华为和Oppo都因为各自平台的限度, 不走这里. 所以当我兴高采烈重写了这个办法筹备一次通过的时候, 点击后间接走到了会话列表界面, 而非会话界面. 这是因为华为平台点击跳转是须要配一个intent, 在融云的后盾, 如图所示: 这里的intent即为告诉栏点击跳转后的隐式启动相应activity的那个intent. 获取某Activity相应intent的代码, 可把intent给打到log中: Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("wonderfullpush://com.wonderfull.android.push/notification?action=your parameter")); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); String intnetUri = intent.toUri(Intent.URI_INTENT_SCHEME); Log.d("hwpush", "intnetUri=" + intnetUri); ...

March 15, 2021 · 1 min · jiezi

关于sdk:融云即时通讯SDK集成-FCM推送集成指南Android平台

背景:最近公司新上的app要加上即时通讯的性能, 本人疾速实现一个当然是不可能的了(我的项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的有余.最初点兵点将,选了融云家的SDK(老板说了算hhhh). 这是他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4 因为咱们有些客户是海内的, 海内用户根本都是在用含有google原生Rom原生推送的手机, 所以得接入FCM推送来保障音讯达到率. 为什么要再接入FCM推送?集成了即时通讯的SDK, 咱们的app不就能领有像微信一样随时随地收到音讯的即时通讯能力了? 说实话我一开始也是这么认为的. 惋惜做开发也要按基本法来, Android平台回收app的这一关咱都过不了, app都给你杀死得透透的了你拿啥收音讯呢? 咱又不是微信hhhh. 所以一番急赤白脸地浏览他家文档之后, 才发现app如果活着, 他融云能用本人的通道给你把音讯推送到. 如果app被杀死了, 这个音讯就在他家的服务端间接交给三方厂商了(海内用户接入FCM推送, 国内用户接入几大厂商也就是蓝绿大厂华为小米), 让这条音讯走人家厂商的推送通道给送到你手机上. 融云SDK接入FCM推送指南https://docs.rongcloud.cn/v4/views/im/ui/guide/private/notify/push/fcm.html 这个链接是融云的官网文档, 大家按这个文档接入FCM就行, 接入步骤还是十分具体的. FCM集成中的须要留神的点3.1 对于网络环境融云的SDK会在注册推送的时候检测手机以后的IP是否是一个海内的IP, 如果不是的话就不去注册FCM推送了. 比如说海外版的小米手机, 是带有Google的推送框架的. 然而如果我连贯了一个国内环境的IP, 融云SDK就会判断我在国内环境, 而后依据手机型号, 注册小米推送配置, 如果这台海外版的小米手机没有小米推送框架, 就会注册失败, 从而注册成Rong推送. 这样就失败了. 所以在配置FCM推送做测试的时候, 肯定要保障启动App之前, 手机所在的网络环境是海内的IP(迷信上网). 3.2 没有实现自定义的音讯接管/告诉栏点击监听器(PushMessageReceiver)导致推送失败这个是对于配置FCM推送的融云官网文档链接. https://docs.rongcloud.cn/v4/views/im/ui/guide/private/notify/push/fcm.html#notification 这个页面拉到最下边是一块对于自定义点击跳转的配置 (就是推送音讯达到告诉栏后, 用户手动点击告诉栏音讯后的跳转逻辑). 这个局部我最开始的了解是如果我不继承PushMessageReceiver来自定义点击, 那么SDK会有一套默认的逻辑来实现跳转. 后果却是我不自定义的话, 这个推送就无奈达到了, 相当于没有注册播送接收器, 推送的播送就齐全收不到了. 这个融云他们曾经针对这个问题批改了文档. 强制须要实现自定义点击的接收器了. 除了继承PushMessageReceiver这个类, 不要忘了在AndroidManifest做配置哦. 3.3 奇怪的问题(推送失败和利用打包形式无关)这个也是十分奇怪的问题了, 先来形容下问题: 1.所有都配置实现之后, 开始测试. 第一次启动App, 杀死. 发送测试音讯. 收不到推送. 2.再次启动App, 杀死, 发送测试音讯. 这次能收到推送了. ...

March 12, 2021 · 1 min · jiezi

关于sdk:融云即时通讯SDK集成-国内厂商推送集成踩坑篇Android平台

背景:最近公司新上的app要加上即时通讯的性能, 本人疾速实现一个当然是不可能的了(我的项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的有余.最初点兵点将,选了融云家的SDK(老板说了算hhhh). 他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4 这个工作当然还是落在我的头上. 根底的IM聊天, 群组聊天等性能集成在另一篇博客中曾经讲过, 这里就先不说了. 这篇文章的重点我打算好好讲讲接入三方厂商推送时踩的那些坑, 以便给后续入融云坑的敌人们避避雷. 为什么要再接入厂商推送?集成了即时通讯的SDK, 咱们的app不就能领有像微信一样随时随地收到音讯的即时通讯能力了? 说实话我一开始也是这么认为的. 惋惜做开发也要按基本法来, Android平台回收app的这一关咱都过不了, app都给你杀死得透透的了你拿啥收音讯呢? 咱又不是微信hhhh. 所以一番急赤白脸地浏览他家文档之后, 才发现app如果活着, 他融云能用本人的通道给你把音讯推送到. 如果app被杀死了, 这个音讯就在他家的服务端间接交给三方厂商了(也就是五大厂商蓝绿大厂华为小米FCM), 让这条音讯走人家厂商的推送通道给送到你手机上. 融云家SDK接入厂商推送指南这个他家讲的挺分明了, 都近似手把手的教了, 那我也就不在这节约键盘寿命了(偷个懒hhhhh).给他家官网文档往这儿一贴好了: https://docs.rongcloud.cn/v4/views/im/ui/guide/private/notify/push/mi.html. 大家留神一下他家有些厂商推送的文档分2.x和4.x哈, 对应的是他家旧版/新版SDK中接入的厂商的新/旧版本推送包. 数数我踩过的坑在他家这儿还是踩了不少坑的...淦,感觉他家文档尽管粗疏吧, 然而坑还是不少的. 还好能提工单让他家技术支持老哥解决问题(老哥还是挺热心的, 建个技术支持群太贵了整不起啊老板抠门...), 所以大家要是踩上切实摆不平的坑, 连忙给他提工单就完事了. 以下这些坑如果你还没开始入坑, 就不必看的太认真了,因为有些类/办法你没接入也不晓得, 轻易看看心里有个数就行. 一旦遇上坑连忙来这ctrl+F 一波看看有没有你遇到的, 别浪费时间. 3.1 华为1. 华为旧版本推送的坑 这第一个我要说的坑是真的坑, 是华为的锅hhhhh, 这个折腾了我好两三天. 跟他家的技术支持重复的确认. 老哥也是热心, 陪我折腾到底, (我给他家提工单, 老哥给华为提工单, 哈哈哈). 融云他家的SDK的大版本分为旧版本和新版本的, 一个叫2.x一个叫4.x. (3.x跑哪了我也不晓得hhhh). 他家2.x的SDK接入的是华为的旧推送包. 4.x的SDK更新比拟大, 索性就接入了华为新推送包了. 我一开始用的他家2.x的SDK. 先颁布后果哈: 一堆急赤白脸的集成, 完后发现华为EMUI 10以上推送都好使, 10以下的推送都不好使了. 好嘛, 一堆工单下来, 发现华为的旧推送包华为曾经不保护. 要么, 降级EMUI 10以下手机的HMS core, 要么就降级华为推送包. 这下好, 我又得把融云的SDK给降级到4.x了. 所以接入融云家2.x SDK的敌人们留神了, 这儿是个大坑哈. ...

March 12, 2021 · 1 min · jiezi

关于sdk:融云集成之避坑指南Android推送篇

在集成推送时候,须要先理解融云针对推送的定义: Push 告诉是当接管方的主过程被杀死或者回收,或者您被动调用 disconnect() 的操作, 导致 IM 长连贯通道与服务器断开后。 在这种状况下,会收到Push 服务; 说白了,就是利用过程被杀掉,才会收到push 的,否则的话,是会走融云外部的长链接通道的;若是连利用过程都不理解的话,我要拿起我四十米的大刀了。 好了,前提介绍完结,接下来,咱们正式开始避坑。 融云的推送分为俩大类:RongPush 以及其余厂商推送;至于为什么会有厂商推送 ,次要书因为众说周知的起因,各个手机厂商针对零碎的room 太深,导致融云的push 过程服务无奈自启动以及无奈常存与服务后盾,所以为了满足离线时候,push 的达到率,所以接入了支流的厂商推送服务,至于你说,为什么不接入对立_推送联盟_,预计等推送联盟孵化进去,可能得等到2045年了;哈哈,预计我再不开始介绍接入,大家就要发飙了。 各位客官,稍安勿躁,马上开始。本篇咱们先介绍厂商推送之华为推送过程中遇到的坑; 首先,依照融云官网的形容,融云SDK 目前是有俩个版本,2.x 版本的SDK 以及4.x 版本的SDK ,别离对应的是华为的2.x 的jar 以及4.x 的jar ,能够别离参考 2.x版本 以及4.x版本,依照文档进行集成即可,具体集成过程依照文档集成即可,此处无需多说; 接下来,先介绍我在集成2.x 版本时候遇到的问题: 1.呈现的问题一,没有填写对应的利用标识;(此处是我的锅,没有粗疏的看文档); 依照融云文档的形容, 此处要填写对应的华为的appkey 等数据的,而愚昧的我居然没有填写对应的 AppID、AppSecret,心愿各位 大大在集成过程中不要跟我一样犯傻; 2.呈现的问题二,依照文档配置实现了,后果,还是收不到推送,不会进行排查; 仿佛这个问题,很多小伙伴都遇到了,所以,我在融云知识库中找到了一篇官网提供的排查伎俩,仅供大家参考 https://support.rongcloud.cn/ks/ODg0 ,若是大家还是搞不定,能够间接找融云进行技术支持的; 以上是在集成2.x 版本时候遇到的问题,不算特地艰难,也是比拟轻松的解决了; 然而,事件万万没有想到的那么简略,工夫过来一个月,我的项目要降级4.x 的融云SDK ,于是,华为推送也要进行对应的降级,于是我开开心心筹备认真顾问一下4.x文档,还好,文档比较简单; 于是,对应的问题,也呈现了: 问题1:在降级过程中,并没有找见 agconnect-servics.json 文件的下载地址。 通过与融云技术人员的沟通,在华为提供5.0版本的推送服务之后,agconnect-servics.json 下载地位扭转了,所以我将我晓得的下载门路提供给大家,在华为开发者平台-我的我的项目中-对应的我的项目下载即可。 问题2: 因为我是从2.x 降级到4.x 的,所以,眼瞎的我没有看清楚文档中AndroidMainfest 中的配置是要删除的,所以导致找不到文件了,所以请大家肯定要看清楚题目,是删除配置,不是增加配置; 问题3: 在EMUI 10以上 是能够收到推送的,然而在EMUI 10以下,收不到推送。 这个问题通过与融云技术人员以及华为技术人员的沟通能够确定,因为华为不再持续保护2.0推送服务,改推4.0 以上的服务,然而4.0的推送服务,又对HMSCore 是由要求的,所以只能降级用户的 HMSCore服务,不过融云对外提供了降级监听,具体能够参考融云文档。 ...

March 12, 2021 · 1 min · jiezi

关于sdk:开发者投稿|使用声网的RTM-SDK轻松给angular应用加上实时聊天功能

作者:陈畏民 源起往年暑假的前半段工夫, 在家捣鼓了一个情侣类web利用, 基于aspnetcore和angular搭建的; 暑假中实现了'告白', '相册', '说说', '纪念日'这些性能, 而后前端界面上留一个性能的坑位: 聊天, 点击这个聊天按钮, 能够看到四个字, 那就是敬请期待; 部署上线后, 用户当然只有我和我的"好敌人"应用, "好敌人"先跨了我真棒, 而后问聊天性能马上能够用了吧? 我缄默了, 心想着这个性能前面用signalr试试看吧; 当初曾经2020秋了, 聊天性能的界面上仍旧是那四个字: 敬请期待 ! 这个国庆, 我意识到不能再拖了, 本人埋的坑, 应该趁早把它填了, 否则"好敌人"会感觉你很菜, 一个"简略的"聊天性能都做不进去; 遇见声网(agora)最开始想用signalr本人实现聊天性能的, 然而思考到一方面, 本人的服务器资源无限(1核1G轻量应用服务器); 另一方面, 本身精力能力无限, 写进去兴许不难, 然而要写好确是不简略的; 于是寻思着找找现成的货色用用吧, 机缘巧合, 我据说了声网(agora), 于是去他的官网看了一番, 看到有具体的文档, 足量的收费额度...于是决定先白嫖试用一下 对于agora顺便找了一下agora的相干材料, 看起来是挺靠谱的, 在寰球都有数据中心和服务器; 小米、陌陌、新东方等知名企业都用过他们的云服务; 基于agora的rtm sdk给我的利用加上聊天性能参考官网的文档 我的环境win10零碎npm包治理angular8.xvscode步骤装置依赖npm i agora-rtm-sdk装置完后须要批改下agora-rtm-sdk/index.d.ts的文件的2258行原来的内容为: export type { RtmChannel, RtmClient, RtmEvents, RtmMessage, RtmStatusCode };批改为: export { RtmChannel, RtmClient, RtmEvents, RtmMessage, RtmStatusCode };不批改的话, 编译会报错 ...

February 24, 2021 · 3 min · jiezi

关于sdk:华为SDC-SDK的踩坑记录

事件曾经过来了,大概花了8个小时解决问题。 故障形容:通过python载入SDK的动态链接库报错,刚开始是报错126谬误,找不到模块,起初报错是不是无效的32位程序。 开发环境:64位的python3.7,64位的win10,应用pycharm开发 根本原因:华为官网下载的SDK库 SDC Development Kit 8.0.RC3,外面尽管辨别了64位和32位,还建设了两个文件夹,output32和output64,我就始终认为这个output64外面就是64位动态链接库,实际上这个库也是32位的。所以用64位的python调用32位的dll会报错。至于126找不到模块的谬误,是门路写的不对。 解决办法:1,装置32位的python,我发现曾经到了3.9了,于是装置了3.8的32位版本,链接地址:https://www.python.org/downlo...,我抉择了下图的版本下载:之后是间接失常装置。留神,网上有些说须要装置anaconda,我也没管,我记得以前python2和python3都在我电脑里共存的。装置实现后,找到装置门路,测试一下python.exe是否可用。我的门路:C:\Users\Administrator\AppData\Local\Programs\Python外面应该分成两个版本各自独自的文件夹,进入新装置的(我的是python38-32),shift+右键运行cmd,输出python,回车,看一下版本是不是失常。2,pycharm里配置32位版本大略操作:file->settings->project->project Interpreter点击右上角的齿轮图标,抉择show all,能够看到已有一个python 64位的选项了,再点击加号,抉择new environment(建设一个新的环境),location目录设置你的我的项目目录,留神我的项目目录下如果曾经有venva或者venvb了,你就弄个venvc,相当于一个新文件夹。上面抉择你装置python3.8的目录里的python.exe文件。而后就是一路OK。3,把SDK包里的DLL文件和所有相干文件(我的如下图),复制到你方才建设的我的项目目录下的venvc/Scripts/lib文件夹内4,将你的py格式文件关上,设置一下运行环境:run->editconfigurations,在右侧python interpreter中,抉择你方才装的3.8版本。一路OK。 当初开始测试代码: from ctypes import *pDll = WinDLL('D:\\ai\\venvc\\Scripts\\lib\\HWPuSDK.dll')res = pDll.IVS_PU_Init()print(res)返回后果: 世界终于平静了。。。

February 17, 2021 · 1 min · jiezi

关于sdk:DIY一款能随周围环境变化的智能灯泡求婚必备

加入了此次涂鸦实战训练营(基于App SDK玩转IoT App开发),次要指标是基于涂鸦的SDK开发一个基于IoT的控住智能灯的App。SDK反对iOS和Android开发,我加入此次的实战营次要目标是为了学习物联网的相干开发,本人理解一些Android的开发(并不长于Android UI的开发),所以我的App采纳Android SDK开发,UI的也是比拟简陋,次要以验证性能为主。 此次实战营须要一些Android或iOS的开发根底,新建一个Android的工程,并增加涂鸦的SDK参考Demo即可,上面次要探讨涂鸦的API应用。 Demo如下: 基于涂鸦 App SDK 开发一款 Android App 并管制智能灯 基于涂鸦 App SDK 疾速地开发一款 iOS IoT App 以下内容为涂鸦开发者“@徐阳”创作,经其受权编辑公布: 性能次要分为以下几局部,账户治理,家庭治理,设施配网和设施管制。 账户治理账户治理分为两个局部,用户注册和用户登录 用户登录  在界面上获取用户名和明码,而后赞登录按钮的回调函数中调用涂鸦的api,并且利用Toast输入后果。 1. TuyaHomeSdk.getUserInstance().loginWithPhonePassword("86", uerName, password, new ILoginCallback() { 2.     @Override 3.     public void onSuccess(User user) { 4.         Toast.makeText(MainActivity.this, "登录胜利" , Toast.LENGTH_SHORT).show(); 5.         //Toast.makeText(MainActivity.this, "登录胜利,用户名:" +TuyaHomeSdk.getUserInstance().getUser().getUsername(), Toast.LENGTH_SHORT).show(); 7.         Intent intent = new Intent(MainActivity.this,MenuActivity.class); 8.         startActivity(intent); 10.     } 12.     @Override 13.     public void onError(String code, String error) { 14.         Toast.makeText(MainActivity.this, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show(); 15.     } 16. }); 用户注册 ...

February 1, 2021 · 4 min · jiezi

关于sdk:直男审美不存在的来看看-攻城狮对一款IoT-App的UI改造吧

人们始终会有一种固有思维,认为绝对于男生,女生更适宜做UI设计师,因为她们对色调更加敏感、在理性思维上更有劣势、退职场沟通中能更加晦涩等等等等。更重要的是,绝对于男性,女性的审美观更加趋势饱满。        然而,在咱们 “涂鸦智能IoT App开发实战营”中,一位开发者针对智能家居App 的UI设计革新,让咱们看到了男性对于浪漫和美的谋求。因为作品提交工夫在12月25号前后,所以整个UI界面的设计都是浓浓的圣诞风。        话不多说,先上一张比照图(App启动背景图):        试想,在某个节日前后,将本人设计的UI界面图更改成相应的格调,再向女神/男神表白,迷信预估,在智慧女神雅典娜和恋情女神阿佛洛狄忒的双重加持下,成功率在99.99%以上!        来一起看看具体是怎么实现的? 以下内容为涂鸦开发者“@服役熬夜选手”创作,经其受权编辑公布: 筹备工作:       实战营的开发者们的IoT App制作是基于涂鸦提供的操作指南,先制作了一款根底的智能灯App,而后再加上本人的创意和入手能力,最初实现了一个最初专属于本人的IoT App。        基于涂鸦 App SDK 开发一款 Android App 并管制智能灯        基于涂鸦 App SDK 疾速地开发一款 iOS IoT App 流程阐明:(一)App主题背景设计启动背景:通过更改 ty_pre.png文件,批改整个启动界面,素材的次要元素有灯和圣诞花环,暗示整个APP次要为管制灯而生,与整个APP性能相协调。 APP主题背景通过将xml文件的背景进行替换,将整个背景采纳圣诞元素壁纸。 设施界面设计同主界面背景一样,采纳了同一背景设计,将整体突兀水平升高。 任务栏元素设计任务栏图标进行了从新设计,图标次要起源是iconfont图标库,进行相干转换后插入到默认地位。 滑动栏元素设计通过批改相干xml文件,将整个滑动的原点替换为了圣诞帽,体现了圣诞节限定的特点。 关灯元素设计将关灯后的“灯”元素扭转为“蜡烛元素”。 模式面板元素设计模式面板如图,也应用了圣诞相干配色。 (二)功能设计       在性能上,次要的改变就是增加了模式面板,次要开发过程如下: 首先是新建了模式面板的xml文件,而后在主程序里通过对不同模式按钮的监听,实现了灯模式的切换。 申明面板申明面板类。 @BindView(R.id.fl_lamp_mode_operation)//申明一个模式操作面板@ public View mModeView; 注册按键响应函数次要是按键按下后对应的响应函数。 @OnClick(R.id.ll_lamp_mode_goodnight) public void onClickGoodnight() {//晚安模式@ mLampPresenter.LampGoodnightScene(); } @OnClick(R.id.ll_lamp_mode_work) public void onClickWork() {//晚安模式@ mLampPresenter.LampWorkScene(); } @OnClick(R.id.ll_lamp_mode_read) public void onClickRead() {//晚安模式@ mLampPresenter.LampReadScene(); } @OnClick(R.id.ll_lamp_mode_casual) public void onClickCasual() {//晚安模式@ mLampPresenter.LampCasualScene(); } @OnClick(R.id.ll_lamp_work_white) public void onClickWhite() {//晚安模式@ mLampPresenter.LampWhiteMode(); } @OnClick(R.id.ll_lamp_work_color) public void onClickColor() { mLampPresenter.LampColorMode(); } @OnClick(R.id.ll_lamp_work_scene) public void onClickScene() {//晚安模式@ mLampPresenter.LampSceneMode(); } 按键函数实现次要是将对应按键实现的性能进行实现。 ...

January 13, 2021 · 2 min · jiezi

关于sdk:如何通过一个SDK轻松搞定人脸识别拯救初入职场的程序猿

摘要:看一个SDK如何援救初入职场的程序猿小Hi…【职场初体验】工夫过得真快,间隔上次给小Hi安顿“人脸识别”的开发工作(话接上期:_【疾速玩转华为云开发】小Hi拍了拍你,基于华为云API的开发你Get到了吗?_)曾经过来1个多月了,至今还没有收到一点停顿的消息,老板有些躁动起来。眼看着,离双12也就一两周的工夫了,这是最初的deadline。老板眉头紧锁,点了一根“相约98”的香烟(_小Hi正好是98后,一切都是偶合吧_),长舒了一口气,给小Hi发了楼下咖啡厅见的信息。 程序猿小Hi入职后第二次被老板独自召见,这一次忽然是在高大上的“小样”咖啡厅(_一杯咖啡能够排汇宇宙的力量_)。小Hi感到不妙,十分缓和,毕竟老板交待的第一个工作还没有搞定,遇到了点艰难。 老板在招呼小Hi就座后,微笑着说(_心里可能正憋着火_):小Hi,人脸识别的需要自从前些日子在华为云API Explorer上找到相干API后,停顿得还顺利吗?有没有什么艰难须要我来推动解决的? 小Hi开始冒汗…结巴着说:“老板,咱们要的API尽管找着了,而且也都在API Explorer上调试通过了,但还没有在代码工程里调通,我现有点丧气…(_眼泪都快掉起来了_)”。 老板:小Hi,你先别着急,我了解你当初的情绪,也留神到你最近工作十分卖命。咱们先一起来缕缕,咱们的指标是双12前正式上线人脸识别的性能,能将以后的现状具体形容下吗? 小Hi:在代码中调用这些API须要做很多封装工作,比方这里波及诸多httpsclient公共办法的封装,波及ak/sk的获取以及生成token等操作,须要写上千行代码,我以前对这块不相熟,尽管近几周致力加班赶进度,但进度还不是很现实,危险很高哦; 老板:像华为云这样的Top厂商,除了API必定是有提供SDK。有SDK的话,你只须要像应用函数一样,事倍功半哦!另外,当前工作上有什么危险,要及时反馈,及时求助。 小Hi一头雾水(_什么是SDK?挂到嘴边又不好意思说_),没想到老板除了能跟客户吹水外,技术路子也挺野的。在些许的不确定性中,想起了一句名言“_没有进路,就是胜利之路_”,于是抬头挺胸,大声的答复道:“老板,通过你的领导后,感觉恍然大悟,我这就去找SDK,谢谢老板,那我先回去工作去了,有问题我再及时求助”。说完,跟打了鸡血一样,乐不可支地跑出咖啡厅(_一口咖啡都没顾得上喝,但被老板激励到了,也算是排汇了宇宙的力量_)。 【艰难解决之路】只见小Hi从过道飞驰而过,犹如一匹汗血宝马,让共事们都惊呆了,不晓得哪来的自信。“我是一只小小鸟,有了SDK,我能够飞得更高…”,一边哼着小曲,一边在华为云官网搜寻框输出:SDK。而后一顿操作猛如虎: _关上华为云官网->开发者->_SDK__(https://developer.huaweicloud.com/sdk?all): 搜寻人脸识别FRS服务,找到Java SDK卡片,先进入SDK文档看看如何应用: _SDK 入门领导呈现在眼前,_急不可待地开始操作起来:(https://support.huaweicloud.com/sdkreference-face/face_04_0002.html) One by One,不能再简略,原以为“开明人脸识别服务”的操作须要半天呢,没想到1分钟就实现了。 下面的环境筹备工作大略只花了10来分钟,就轻松的搞定了。小Hi信念爆棚,接下就看“接口示例”代码了:结构服务客户端代码:String ak = "***"; String sk = "***"; String projectId = "**"; // Proxy info,当您须要应用代理才能够拜访到服务时,可在此处减少代理信息 ProxyHostInfo proxyHostInfo = new ProxyHostInfo("proxy", 8080, "**", "**" ); // Service info String url = "https://face.cn-north-4.myhuaweicloud.com"; String region = "cn-north-4"; AuthInfo authInfo = new AuthInfo(url, region, ak, sk); FrsClient frsClient = new FrsClient(authInfo, projectId, proxyHostInfo); // 当您须要代理才能够拜访到服务时,在第三个参数减少代理信息即可 调用人脸比照函数(查看类似度)CompareFaceResult compareFaceResult = frsClient.getV2().getCompareService().compareFaceByFile("data小Hi-front.png", "data小Hi-side.png"); 人脸比照图片: ...

December 28, 2020 · 1 min · jiezi

关于sdk:SDK视频渲染测试流程

1.概述 当有些小伙伴看到题目的时候可能会产生一个疑难,就是“什么是视频引擎呢”?随着当初网络的提高,咱们所相熟的app越来越多,比如咱们常常接触到的火山小视频、抖音、微视等等这些很罕用的视频软件,本篇文章以我司SDK视频引擎渲染测试为终点,讲述的是在视频渲染中咱们是通过什么办法去进行渲染视频与测试流程,次要测试的平台有服务端、Android、IOS等三大平台,内容蕴含数据创立、素材替换、音频、文字等四局部。如果解说过程中有不分明的中央,也欢送小伙伴们提出贵重的意见哦。 2.测试功能模块 2.1数据创立 在测试之前会提前依据咱们要测试的内容去筹备咱们的测试数据,在测试过程中咱们依据渲染而后再通过咱们本人创立的数据进行查看与比照,看理论的成果是否与咱们数据当中的统一。 在数据筹备实现之后去增加咱们要进行测试的模板,与咱们创立的数据进行绑定,这样在渲染的时候能力通过咱们的数据去看模板渲染进去的成果。(成果如下图所示,右边为咱们生成的模板,依据创立的数据渲染进去的视频,左边为视频成果比照模板) 2.2素材替换 什么是素材替换呢?有过相干教训的敌人可能晓得,在咱们视频增加咱们的素材时,这个渲染过程中,会碰到各种各样的问题,比方说增加上的图片没显示,或者说增加下来的视频画面播放不残缺等,或再者上传时格局不正确等等这些问题都会产生,那咱们如何测试确保咱们上传的文件能失常显示,所以在测试过程中咱们要通过咱们本人创立的数据去替换咱们的素材,比如图片、视频、动图等等这些,格局蕴含MP4、jpg、png、gif等。那咱们如何编辑与替换咱们的素材的呢? 注:以咱们当初数据举例,在划横线处是增加咱们的素材进行比照查看(右边为咱们的素材链接,左边为链接的内容) 2.3音频 音频测试这一方面相对来说没有素材替换那么简略,咱们首先上传一段咱们的音频,将音频链接放入咱们的数据中,而后去设置音频在视频中播放的地位以及继续的时长,还有音量的调整在视频播放中的截取的时间段,播放的声音是否呈现在设置的工夫点上,还有是否有卡顿或者音视频不同步等问题。 注:这一段是咱们增加的音频,还有已设置播放工夫等 注:这是渲染之后的视频,红框标记的中央就是咱们设置音频工夫后进行去测试它的成果是否和咱们数据设置的统一 2.4文字编辑模板渲染中也蕴含咱们文字这一重要局部,蕴含字体的大小、色彩、内容的批改、还有文字动画的成果,那咱们在测试中依据数据来进行比照查看。 [图片上传失败...(image-3eaaac-1609123797184)] 编辑实现之后咱们进行渲染查看成果: 这是渲染进去之后的视频与咱们数据上编辑的文字一摸一样,成果是正确的。 3.结尾 综上所述,是咱们这四个板块的一个简略的解说,过程中可能比较简单没有那么认真,后续会继续更新,也会进行改良,心愿对小伙伴们能有肯定的帮忙,当然小伙伴也能够提出你们贵重的意见与见解咱们能够进行交换,大家能够一起共同进步。

December 28, 2020 · 1 min · jiezi

关于sdk:CODING-DevOps-线下沙龙回顾二SDK-测试最佳实践

讲师:潘志刚 声网品质效力部门负责人,超过 14 年服务器、挪动终端、音视频编解码以及汽车电子等跨行业从业经验,负责建设测试基础架构和自动化测试计划,主持搭建继续集成测试生态体系。现任声网品质效力部门负责人,负责推动品质和效力继续优化,专一技术创新赋能团队软件保障,通过软件和硬件的高效联合,摸索产品交付的最优解决方案。前言SDK 测试不同于 APP 测试,不仅要站在终端用户角度思考问题,还须要站在 APP 开发者的角度思考问题。面对不同的行业需要,如何保证质量铜墙铁壁,这是一条摸索未知的赛道。本期推送将为大家带来声网研发效力负责人潘志刚的《SDK 测试最佳实际——打造质量保证的一体化利用平台》,分享一体化利用平台的演变以及如何整合根底能力,保障测试和交付的高效执行,晋升品质效力。 1.0 GUI Driven TestSDK(软件开发工具包)是声网对外次要的产品交付,是用于为特定软件包、软件框架、硬件平台以及操作系统等创立应用软件的开发利用的汇合,跟传统意义上的 APP、外围利用或者最终客户感知到的产物是不一样的,对于最终端用户来说是有形的。 晚期为了保障 SDK 测试的品质,测试人员须要依据 SDK 交付的 API 设置 GUI demo。比方在一个实时的互联网通信界面,须要用户退出到对应频道进行相应的音频和视频通信,在这样的界面里会设计对应 Button、下拉列表,或者小的图标,每一个对应的元素体现对应接口实现能力。如下图所示,最上面 4 个 Button 别离是麦克风、摄像头、挂机按纽,对应 API 接口 enableLocalAudio、enableLocalVide、startScreenCapture 和 leaveChannel,右上角看到信号条图标是获取 onNetworkQuality 接口。通过这样简略的 Demo,测试人员设计相应的 test case,确保每一个接口能够失常调用,基于此来保障初期迭代里交付的质量标准。 然而随着交付平台越来越多,交付须要基于桌面端、挪动端、web 端,桌面端包含 Windows,macOS 和 Linux,挪动端包含安卓和 ios,越来越多平台设计相应的 demo 势必须要测试人员投入更多资源,同时 API 在一直增长。因而自动化是必然趋势。 2.0 GUI Demo Test Automation2.0 阶段是 GUI Demo Test Automation,开发人员将平台进行了分层。 如上图,下面的 iOS、OSX、Android 等是对外交付的平台,上面是对应平台用到的第三方开源工具,如 Appium 和 Selenium,两头这一层做相应分装,其目标在于进步测试效力,用一套 case 笼罩到所有交付的平台。实现 70% 的自动化水平曾经可能让团队节约一半的工夫,极大地提高了测试效率。 ...

December 24, 2020 · 1 min · jiezi

关于sdk:关于融云-SDK-在使用-p8-证书的坎坷

新上的我的项目应用了融云的 IM SDK,但在我的项目集成 APNs 推送的时候,尝鲜应用了一下开发者后盾的 p8 证书,此文记录应用 p8 的辛酸史~ P8 简介苹果文档传送门 官网给出了这种更 "快" 的推送通道: Establishing a Token-Based Connection to APNs,并且这个生成的这个 key 能够实用于以后账户的所有 APP,为开发人员省了不少力量。福音啊~ 想想那一堆证书...... 脑阔痛! 辛酸史起因是这样的,在融云开发者后盾上传了 p8 之后,发现 debug 环境,始终无奈收到推送,在通过和融云提供的推送文档进行严格的比对之后,发现没故障啊~ 最初终于在融云开发人员的帮忙下找到了问题~,融云后盾目前阶段只反对生产环境~ OMG,我打你信不~ 区别p8 是能够同时反对生产和测试环境的,那么为什么融云收不到呢~ 让咱们大胆猜想一下: 之前基于证书进行校验的时候,一套证书是基于开发者后盾一个 AppKey 绑定的,那么我用了哪个 AppKey,后端就基于 AppKey 解析对应的证书,这样就能够发送到对应的 push 环境去了,那么问题来了?应用了 p8 之后,他怎么辨别呢? 我也不晓得~ 哈哈哈,但我猜想应该是没有解析都去走了生产环境,因为提醒我环境不匹配~ 苹果 APNs 服务传送门 Development server: api.sandbox.push.apple.com:443 Production server: api.push.apple.com:443 融云文档传送门

November 24, 2020 · 1 min · jiezi

关于sdk:融云-SDK-如何实现群组操作

背景在集成融云 SDK 后,须要实现群组操作的音讯告诉。包含: 群创立、销毁告诉群布告告诉群人员退出、退出告诉群昵称批改告诉...融云现有的 SDK 仅提供了 RCGroupNotificationMessage,外部封装了几种简略的类型操作,且扩展性不强,无奈实现现有的操作。 解决方案:应用自定义音讯从新来构建群组告诉音讯。 参考 sealtlak 中的 RCDGroupNotificationMessage,也是独自对群组操作内容,从新进行了封装解决。 /*! 群组告诉音讯 */@interface RCDGroupNotificationMessage : RCMessageContent//操作名@property (nonatomic, copy) NSString *operation;//操作人@property (nonatomic, copy) NSString *operatorUserId;//操作对象@property (nonatomic, strong) NSArray<NSString *> *targetUserIds;//内容@property (nonatomic, copy) NSString *message;//获取摘要- (NSString *)getDigest:(NSString *)groupId;@end这个类预约义了上面几种操作类型音讯,具体内容可参考名字定义 extern NSString *const RCDGroupCreate;extern NSString *const RCDGroupMemberAdd;extern NSString *const RCDGroupMemberQuit;extern NSString *const RCDGroupMemberKicked;extern NSString *const RCDGroupRename;extern NSString *const RCDGroupBulletin;extern NSString *const RCDGroupOwnerTransfer;extern NSString *const RCDGroupDismiss;extern NSString *const RCDGroupMemberJoin;extern NSString *const RCDGroupMemberManagerSet;extern NSString *const RCDGroupMemberManagerRemove;extern NSString *const RCDGroupMemberProtectionOpen;extern NSString *const RCDGroupMemberProtectionClose;.m 的实现还是依照自定义音讯的实现进行解决。惟一有区别的是在获取摘要的办法,在这个办法中对音讯内容进行了解决,依据操作名的不同,来对显示的内容进行各种适配。此处依据依据本人的业务进行批改。 ...

November 18, 2020 · 2 min · jiezi

关于sdk:融云聊天页面长按消息后翻译功能的实现方法

我的项目要求实现“翻译”的性能,融云 SDK 自身没这个性能,所以只能曲线救国了,通过自定义音讯来实现,上面是性能实现相干内容。 资源链接:官网:https://www.rongcloud.cn/自定义音讯文档:https://docs.rongcloud.cn/v4/... 实现思路创立自定义 cell,与 SDK 内置的文本音讯进行绑定。因为他们内置的文本音讯 cell 不反对扩大显示翻译的内容,所以须要应用自定义 cell。在聊天页面将自定义 cell 与内置的文本音讯进行绑定。重写长按音讯 cell 的办法,判断如果是文本音讯,减少“翻译”按钮。点击“翻译”按钮,对文本内容进行翻译,并将翻译好的内容设置到数据源中。刷新 UI,会触发自定义 cell 中的回调办法,在回调办法中从新设置高度,并增加 UI,对数据源中翻译好的内容进行展现。代码局部创立自定义 cell 继承于 RCTextMessageCell,m 文件中代码如下,具体成果可自行调整 #import "RCDTextMessageCell.h"#define RCDScreenWidth [UIScreen mainScreen].bounds.size.width#define Font_Size 16#define Extra_BackgroupView_CornerRadius 6.f@interface RCDTextMessageCell ()//翻译内容的 Label@property (strong, nonatomic) UILabel *extraLabel;//翻译内容的背景图@property (strong, nonatomic) UIView *extraBackgroundView;@end@implementation RCDTextMessageCell+ (CGSize)sizeForMessageModel:(RCMessageModel *)model withCollectionViewWidth:(CGFloat)collectionViewWidth referenceExtraHeight:(CGFloat)extraHeight { //翻译好的内容 NSString *extra = model.extra; CGSize superSize = [super sizeForMessageModel:model withCollectionViewWidth:collectionViewWidth referenceExtraHeight:extraHeight]; if (extra.length > 0) { CGSize extraSize = [RCDTextMessageCell getTextLabelSize:extra]; CGFloat finalHeight = superSize.height + extraSize.height; return CGSizeMake(superSize.width, finalHeight); }else { return superSize;} ...

November 6, 2020 · 2 min · jiezi

关于sdk:5-分钟带你掌握-Makefile-分析

摘要:Makefile是一个名为GNU-Make软件所须要的脚本文件,该脚本文件能够领导Make软件管制arm-gcc等工具链去编译工程文件最终失去可执行文件,简直所有的Linux发行版都内置了GNU-Make软件,VScode等多种IED也内置了Make程序。什么是Makefile Makefile是一个名为GNU-Make软件所须要的脚本文件,该脚本文件能够领导Make软件管制arm-gcc等工具链去编译工程文件最终失去可执行文件,简直所有的Linux发行版都内置了GNU-Make软件,VScode等多种IED也内置了Make程序。 你见到的xxx.mk文件或者Makefile都统称为Makefile脚本文件。 Makefile脚本文件的语法学习能够参考: https://www.gnu.org/software/make/manual/make.html (GNU make官网文档) https://seisman.github.io/how-to-write-makefile/overview.html (跟我一起写Makefile 陈皓) Makefile的规定 Makefile的规定如下,这里的[TAB]指键盘上的TAB按键,不是空格,如果在命令前输出了空格则会造成谬误,并且在Makefile中TAB键不能随便应用: 指标 : 依赖 [TAB]命令 例如: Hello : @echo “Hello” 这时执行make命令就会输入一条语句”Hello”,Hello是指标,依赖为空,为了生成指标,须要执行echo “Hello”语句,从而导致输入Hello。 例如:假如咱们有一个Hello.c C语言源文件,须要将其编译不链接为Hello.o文件,最初在进行连贯,Makefile内容如下: Hello.out : Hello.o gcc -o Hello.out Hello.o Hello.o : Hello.c gcc -c -o Hello.o Hello.c 这时执行make命令,make解释器发现指标为“Hello.out”,然而生成Hello.out须要Hello.o,发现目录下找不到“Hello.o”,就向下查找是否有生成Hello.o的规定,找到了,发现”Hello.o”依赖于”Hello.c”,在目录下也找到了Hello.c,就执行语句“gcc -c -o Hello.o Hello.c”生成”Hello.o”,只有编译过程不出错,即可失去”Hello.o”,这时能够执行“gcc -o Hello.out Hello.o“生成”Hello.out” 从哪里开始剖析? 这里能够用剖析一个C语言或Java语言程序来类比,个别都是依据程序是执行流来进行剖析,也就是先找到main函数,因为main函数是程序的执行入口,Makefile也有执行入口,在执行make命令时,make解释器默认搜寻当前目录下名为“Makefile”的文件,找到后,执行生成第一个指标的命令及生成其依赖所需的命令。 这里抉择在SDK/Targets目录中STM32L431_BearPi工程中的GCC目录下的Makefile开始剖析。 第1行到第140行都是设置一些变量和导入一些makefile文件(其中也没有任何规定,都是进行一些变量的设置),第143行是第一条规定 当咱们执行make或make all时,就开始生成all指标,其依赖于BUILD_DIR(GCC/build)目录中的TARGET(Huawei_LiteOS).elf文件,BUILD_DIR和TARGET为两个变量,一开始就被赋值,如下图所示,理论应用时$(变量)会被替换为变量的值,例如$(TARGET).elf最终会被替换为Huawei_LiteOS.elf。 可是Huawei_LiteOS.elf还不存在,make只好持续向下查找是否有生成Huawei_LiteOS.elf的规定,好在第147行的指标为Huawei_LiteOS.elf,这就是生成Huawei_LiteOS.elf的规定,该规定依赖为$(OBJ_DIRS) $(C_OBJ) $(S_OBJ)别离对应三个目录,这三个目录都不存在,所以make只好持续向下查找,它发现第152行正好为指标是该目录的规定,就创立了该目录,解决了$(OBJ_DIRS)这个依赖,接着该解决$(C_OBJ)这个依赖 Make向下查找依赖发现位于第156行呈现生成这个以来的规定,这里的$(C_OBJ):$(BUILD_DIR)/%.o:%.c对应makefile中的动态模式,我这里简略的说一下,大家如果想深刻理解能够自行百度。 动态模型的格局如下: 指标列表: 与指标列表相匹配的模型: 与依赖相匹配的模型 [TAB]命令 来看一个例子, ...

September 14, 2020 · 1 min · jiezi

关于sdk:即构SDK8月迭代新增下行网络测速切换房间预览首帧回调等多项功能

即构SDK8月上新,网络探测模块新增上行网络测速、媒体播放器新增缓存到文件结尾的回调、新增切换房间性能、新增预览首帧回调等。本月SDK迭代新上线的性能十分丰盛,具体内容请看下文。 LiveRoom新增1、网络探测模块新增上行网络测速性能 在拉流前可进行上行网络测速,可无效帮忙用户判断和预测上行网络品质是否良好。此前,即构SDK已反对推流前上行网络测速,帮忙用户判断和预测上行网络品质是否良好。 新增 StartDownlinkSpeedTest,StopDownlinkSpeedTest 等接口,用于上行网络测速。 如须要网络测速模块性能,请分割 ZEGO 技术支持解决。 2、媒体播放器新增缓存到文件结尾的回调 通过该回调,便于把握媒体播放器的缓存加载状况。在教育场景中,教学视频缓存达到结尾时可能须要提醒用户行将播放下一教学视频/开始下一章节等。 在event回调中新增onReadEoF回调,当文件缓冲达到文件的完结时抛出。 3、新增切换房间性能 通过“切换房间”性能,能够实现从一个房间疾速切换到另一个房间。 此前切换房间,是通过“调用登出原房间和退出新房间”两个接口来实现;新的切换房间性能,通过调用新增的SwitchRoom 接口,调用后进行上一个房间的推拉流并进入新房间,切换房间胜利会收到新房间登录胜利的回调。与之前的办法相比,更易用也更高效。 4、新增AudioDeviceMode下General2模式 该模式下会放弃对设施的占用,让切换房间耗时更短。在狼人杀和剧本杀等场景下,应用该模式能够让用户切换房间后推流/拉流时疾速发出声音/听到声音。 具体配置可分割 ZEGO 技术支持征询。 5、新增预览首帧回调 启动本地预览(startPreview)时,渲染出第一帧作为回调抛出。便于应用视频内部采集设施时,把握开启本地预览的状况。 每个开启预览(startPreview)/完结预览(stopPreview)周期内只会抛出一次首帧回调。期间调用设置预览(setPreview)和开关摄像头(enableCam)不会触发此回调。 优化1、媒体播放器反对同时播放音视频文件的数量从4个进步到10个 通过优化重构MediaPlayer模块,SDK反对创立最多10个媒体播放器实例,同时播放音视频文件。 在线教育场景下,通过在课前播放多种音效,如鼓掌声、欢呼声等,沉闷课堂气氛,让学生疾速进入课堂状态。 2、优化初始化反初始化的逻辑 原先enableMic和setFrontCam等接口在反初始化后再次初始化SDK时,在主副通道的逻辑不统一,偶现状态未被重置的状况。优化逻辑后,反初始化SDK后再初始化,所有状态会正确重置。 3、混流反对独自调整输出流的音量 在多路混流时,可独自调整某条流的声音音量,解决混流后因为音频起源自身的音量大小差距较大,而导致混流后的音频音量不平衡的问题。由默认的0-100,批改为0-200。 4、优化投屏场景下声音回采问题 通过配置能够实现AirPlay连贯时,声音仍旧从手机设施播放,解决投屏场景下声音回采的问题。可通过SetConfig("air_play_route_to_speaker") 配置设置。 5、减少60Hz高通滤波器的配置开关选项 SDK默认关上该选项,用于解决低于60Hz的低频杂音,可通过SetConfig("prep_high_pass_filter=false")配置敞开。 AudioRoom新增1、网络探测模块新增上行网络测速性能 在拉流前可进行上行网络测速,可无效帮忙用户判断和预测上行网络品质是否良好。此前,即构SDK已反对推流前上行网络测速,帮忙用户判断和预测上行网络品质是否良好。 新增 StartDownlinkSpeedTest,StopDownlinkSpeedTest 等接口,用于上行网络测速。 如须要网络测速模块性能,请分割 ZEGO 技术支持解决。 2、媒体播放器新增缓存到文件结尾的回调 通过该回调,便于把握媒体播放器的缓存加载状况。在教育场景中,教学素材缓存达到结尾时可能须要提醒用户行将播放下一个教学视频/开始下一章节等。 在event回调中新增onReadEoF回调,当文件缓冲达到文件的完结时抛出。 3、新增SetConfig的批改配置接口 LiveRoom SDK已有此批改配置的接口,现AudioRoom凋谢SetConfig接口与LiveRoom SDK对齐。 4、新增切换房间性能 通过“切换房间”性能,能够实现从一个房间疾速切换到另一个房间。 此前切换房间,是通过“调用登出原房间和退出新房间”两个接口来实现;新的切换房间性能,通过调用新增的SwitchRoom 接口,调用后进行上一个房间的推拉流并进入新房间,切换房间胜利会收到新房间登录胜利的回调。与之前的办法相比,更易用也更高效。 5、新增AudioDeviceMode下General2模式 该模式下会放弃对设施的占用,让切换房间耗时更短。在狼人杀和剧本杀等场景下,应用该模式能够让用户切换房间后推流/拉流时疾速发出声音/听到声音。 具体配置可分割 ZEGO 技术支持征询。 优化1、媒体播放器反对同时播放音视频文件的数量从4个进步到10个 通过优化重构MediaPlayer模块,SDK反对创立最多10个媒体播放器实例,同时播放音视频文件。 在线教育场景下,通过在课前播放多种音效,如鼓掌声、欢呼声等,沉闷课堂气氛,让学生疾速进入课堂状态。 2、优化初始化反初始化的逻辑 原先enableMic和setFrontCam等接口在反初始化后再次初始化SDK时,在主副通道的逻辑不统一,偶现状态未被重置的状况。优化逻辑后,反初始化SDK后再初始化,所有状态会正确重置。 3、混流反对独自调整输出流的音量 ...

August 11, 2020 · 1 min · jiezi

关于sdk:知识点梳理聊聊iOS-SDK数据采集那点事儿

导读 随着互联网的倒退,咱们无时无刻不在被动或被动接管着大量的信息,早晚上下班坐公交、挤地铁,行色匆匆、各行各业的精英分子都不忘关上手机浏览新闻动态,追看青睐的电影、电视剧,网上购物,浏览各种订阅号,打打小游戏等等,当然还有些同学浏览纸质书籍或应用kindle浏览。 通过下面的察看能够发现,挪动电子设备占用了咱们大量的工夫,不管购物、吃饭、出行、租赁等等,而挪动设施次要通过App来操作,比方购物会应用淘宝、京东等,出行会应用滴滴、摩拜,美食会应用饿了么、美团等。 那么为了更好为本人的用户提供更优质、更人性化的服务,企业或公司往往都会采集用户的一些信息,以便当前简化用户操作或不便营销等。比方记录登录用户常常购买某个品牌的化妆品,购买价格通常在300-500元区间,那么企业可能会将该品牌在这个区间的化妆品放到App最显著的地位;还比方公司做流动,但因为流动页面比拟深,导致用户很难发现,因而触发次数特地少,没有起到营销成果,那么企业可能就会依据采集回的数据信息进行实时调整,将该模块放到显著地位、或缩小操作门路等等。 SDK数据采集的作用就在于此,既能不便用户操作,又能起到帮忙企业自我调整的作用。 一、SDK 具备的“素质” 上图为一款SDK自身及所采集数据须要具备的一些根本“素质”,上面将对每个模块逐个介绍。 (一)SDK 自身具备的“素质” 1. 稳定性 作为App重要的组成部分,稳定性是SDK的重中之重,因为一款SDK可能会被多个App应用,而每个App又有N个用户在应用,如果某行代码呈现crash,结果将可想而知。 对于可能呈现crash的代码适当增加try catch进行异样捕捉,对于罕用的NSMutableDictionary/NSMutableArray等控件在插入或拜访时经常出现数组越界、nil数据插入等,可应用Category增加自定义平安办法,也能够在Category中应用办法替换,先调用自定义办法进行数据校验,校验无误再执行零碎办法。 2. 安全性 安全性目前次要应用代码混同形式,为避免别人通过class-dump (相干链接,请详见文末!下载后将文件复制到/usr/local/bin目录下) 反编译后,依据源代码中的办法名就能够推断出其性能。 特定标识办法混同对工程中所有办法应用特定标识结尾,将所有带有标识的办法都应用随机生成字符串形式替换。具体应用形式可参考:HSKConfuse_(相干链接,请详见文末!)_ 运行程序后,找到工程Products -> Show in Finder -->显示包内容 找到工程执行文件,应用以下命令反编译文件: class-dump -H 执行文件门路-o 导出的.h文件寄存文件夹门路 可发现反编译后的.h文件的办法名称已被混同。 3. 易用性 易用性次要是指用户在应用时只须要局部代码即可实现相应性能。 易观SDK对外提供了页面主动跟踪性能、页面自定义采集、事件采集、通用属性配置、用户属性、音讯推送跟踪及Hybrid混合页面等模块化的接口,用户可依据须要自行抉择,并且接口均为类办法,能够简便的调用。同时还提供了React Native、Weex、PhoneGap三个跨平台挪动利用开发框架的接口文件,开发者无需再次进行封装。 4. 扩展性 对于程序来讲扩展性无疑十分重要,不能因某个小小需要的扭转而导致代码重构,不仅节约人力、物力,更重要的节约了工夫,而工夫可能导致商机的散失。 在易观SDK初始化办法中应用了配置类,能够不便的扩大未知的配置信息: 为了不便用户对自定义信息的扩大,局部接口也预留了自定义信息,如购买商品时前期可能须要剖析品牌、价格、购买时间段等,那么开发者可通过track:properties:办法将数据放到properties字典中。 (二) 数据应具备的“素质” 1. 准确性 数据采集的准确性是为后续数据的解决提供根底保障。 其中可能须要用户参加,传入明确须要计算或统计的指标以对其进行精准剖析;为保证数据及时上传到服务器,数据上传至多触发一次,若产生网络中断、服务器无响应等非凡状况,SDK须要建设起重试机制,保证数据精确送达;因为数据产生先后顺序会影响前端的展示和剖析,因而在SDK中咱们会应用数据处理串行队列及网络上传队列,确保数据先触发先达到。 2.  安全性 数据安全性次要体现在存储和网络传输过程中。 SDK采集的数据将首先存储到本地数据库中,为了避免用户篡改数据,须要对数据进行爱护;为了减少数据的安全性,在数据上传时须要对数据进行加密解决,罕用的加密形式有:Base64加密、MD5加密、AES加密、RSA加密等。目前易观SDK应用前三种联合的形式对数据进行了加密,每次上传的数据都会依据肯定的算法产生不同的加密key,以保证数据的安全性。 3. 合法性 作为数据采集模块,每天都会有大量数据上传服务端,其中必然有局部数据是不非法的,比方某些页面无网络状态下无奈获取商品信息,因为忽略导致购买按钮可能触发,但数据信息无奈获取,导致调用SDK的数据为有效数据,这些数据能够称为“垃圾数据”,不仅对前期剖析无用,还会减少荡涤数据的工夫,节约了磁盘空间。 因而SDK中独自抽出校验层,对数据进行合法性校验。如:SDK自身预约义一部分保留字段,$platform(iOS/Android/java等)、$lib_version(SDK版本号)、$debug(debug/release)等,为避免用户笼罩,也是为了前期数据分析时更明确、更具备针对性,对传入参数进行校验;罕用的字符串长度校验,避免输出字符串过长;自定义属性多层嵌套校验,档次嵌套过多可能导致剖析效率降落,减少复杂性;属性总个数校验等等。 4.  可控性 作为SDK更新频率可能没有App那么高,所以对SDK须要肯定的策略管制。咱们在SDK中退出了策略管制模块,优先级从高到低顺次为:服务器策略>用户设置策略>默认策略。 对正在应用的SDK次要采取服务器控制策略,比方:服务器端能够控制数据上传累积条数及数据上传间隔时间;提早一段时间后SDK再进行数据上传;更改数据上传服务器地址;数据上传失败后的重试次数以及达到最大次数后下次数据上传的工夫等等,都可进行灵便管制。 二、总结 因为SDK模块很少波及UI局部,所以根本构造如下图所示: class-dump ⬇️ http://stevenygard.com/projec... HSKConfuse ⬇️ ...

July 30, 2020 · 1 min · jiezi

关于sdk:手机-SDK-插件窃取用户隐私快看看你中招了吗

技术编辑:宗恩丨发自 思否编辑部 SegmentFault 思否报道丨公众号:SegmentFault 近日在315晚会上央视曝光了上海氪信信息技术和北京招彩旺旺信息技术这两家公司,它们通过在50多款手机APP中植入SDK插件,在用户不知情的状况下,偷偷窃取用户的隐衷,设施的 IMEI、IMSI、运营商信息、电话号码、短信记录 、通讯录、利用装置列表和传感器信息等都是是被窃取的指标。 在2019 年 4 月,南都个人信息爱护钻研核心委托中国金融认证核心针对使用率高的 SDK 做了隐衷数据分析报告,报告显示,在测评的 60 款罕用应用软件中,共应用了至多 966 个 SDK,均匀每款 App 应用 19.3 个 SDK,也就是说用户不接触SDK 简直是一件不可能的事。 此次315晚会上通过SDK泄露隐衷的APP名单-1 此次315晚会上通过SDK泄露隐衷的APP名单-2 SDK 英文全称 Software Development Kit,也就是「软件开发工具包」,一般来说 SDK 封装了一些罕用、简单的性能,软件开发者通过调用他人的SDK能够大大提高开发效率,缩短开发周期,还能显著的晋升软件性能。但享受这些便当的同时却埋下了危险。 开发者想要让 APP 领有 SDK 中的性能,就必须通过 API 连贯 APP 和 SDK 工具包,在一个 APP 获取了某类权限了后,因为 API 的存在,SDK 提供者进行的代码埋点同样会采集到相应的数据,进而通过 SDK 回传给 SDK 的提供方。SDK 能够通过逾越 Android 零碎接口的形式,执行 linux 命令的来获取信息。从而跳过 APP 获取权限前的询问用户门路,取得用户的隐衷信息。 软件中存在泛滥 SDK 的起因互联网大厂领有强势的位置和深厚的技术,不须要疾速更新迭代,就可能维持住以文档驱动传统瀑布模型(Waterfall Model)的开发流程,但小厂竞争力绝对弱,为了适应客户需要的疾速变动,不得不投身于「麻利开发」。 麻利开发并非某一种特定的开发方法,而是一种应答疾速变动需要的软件开发能力。在麻利开发中,软件我的项目的构建被切分成多个子项目,各个子项目的成绩都通过测试,具备集成和可运行的特色。并且为了满足疾速迭代与小步快跑的要求,引入便捷的第三方 SDK 不仅可能升高开发成本,还能缩小工作量,因而也就显得更为牵强附会了。 ...

July 18, 2020 · 1 min · jiezi

基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP-Gateway-遇到的坑三

前两篇文章我简单介绍了开发WebRTC2SIP的设计架构图和报文逻辑,看着简简单单,做起来还是有很多事情要考虑的。我们在开发的过程中,也是磕磕绊绊,一步一个脚印(坑)走过来的。碰到的很多问题都是兼容的问题。 我们碰到过哪些问题呢?总结下来,开发时遇到了这些问题:1 怎么处理早起媒体?2 怎么处理加密不被过滤?3 怎么防止SIP注册攻击和匿名呼叫攻击?4 怎么支持消息扩展,扩展支持更多服务?5 正在通话呼叫(calling ringing )过程中,主叫或者被叫断线了,怎么探测?怎么recover,自动重连话务?6 通话双方任一方突然杀死SDK进程 怎么通知对方?7 SIP呼入的时候,如果被叫不在线?怎么个处理逻辑?8 客户要求实现同一个账户同振怎么实现?9 客户要求支持新版本的的SDK呼入呼出的同时,让同一套账户体系支持SIP的呼入和呼出;如果有人呼入,要求SIP客户端和声网客户端,都要响铃,即要兼容原来的客户固定资产(SIP话机等)可以继续被使用。 除了这些还有在测试阶段发现很多诡异的问题1、比如电话接通后,说着说着就没声音了(⊙_⊙)2、说话会卡断,有时候接通就会卡有的时候通话几分钟后会卡(⊙_⊙)+13、经常碰到被叫挂机,声网的SDK还在写日志,一天50个电话写日志几十G,G,G,G,G,G (°ー°〃)4、单通,一方听不到声音(╻)5、编码问题,码率不一致…(⊙⊙;)…6、各种莫名崩溃:启动崩溃,接通崩溃,挂机崩溃,神经病似得说崩就崩溃…╥﹏╥… 一路走来,几个同事经常分析代码到半夜。终于在测试4个月后稳定下来。其实现在回头看,就是因为没有吃透声网的API文档,没有好好利用社区的功能。如果你碰到的坑是上述的问题,那么花点时间仔细撸几遍API文档就可以搞定了。 系统运行了几个月没出过问题,公司要求总结下开发中碰到的问题,声网的小伙伴说,要学会回馈社区,完善一下学习交流的氛围。有感于这一段时间的开发工作,于是就写下这几篇文章,希望能对大家有所帮助。我会敲代码,不太会表达,如果大家在实现这个模块的过程中也碰到问题,想了解一些细节。欢迎联系交流。

July 1, 2020 · 1 min · jiezi

Case5-一键安装JS-SDK-网页版WebRTC-网页-SIP客户端-语音通话可以做web坐席

服务器环境要求CentOS 6.9 64bit 下载脚本文件并安装wget http://voip-sdk.oss-cn-beijing.aliyuncs.com/rtc_sip/install_rtc_sip.shwget http://voip-sdk.oss-cn-beijing.aliyuncs.com/rtc_sip/python_install.sh#yum -y install dos2unix#dos2unix ./\*.shchmod a+x ./\*.sh./install\_rtc\_sip.sh修改绑定的域名修改绑定的域名 修改两个地方 /etc/nginx/conf.d/websdk.conf 替换域名证书/data/wwwroot/rtcsip-demo/ssl 重启Webservice nginx restart 呼叫测试

July 1, 2020 · 1 min · jiezi

基于Topic消息路由的M2M设备间通信Node-JS-SDK-示例

概述M2M(即Machine-to-Machine)是一种端对端通信技术。本章节以Node JS SDK为例,使用基于Topic消息路由的M2M设备间通信,主要介绍如何基于物联网平台构建一个M2M设备间通信架构。实验步骤第一部分:配置相关 1、产品、设备、Topic的创建参考链接 消息路由建立 本部分目前不支持门户直接配置,需要基于管理API: CreateTopicRouteTable 来建立消息路由关系。测试可以直接使用OpenAPI来快速实现相关功能,本地集成相关功能直接基于SDK即可。 2、JAVA SDK Demo import com.aliyuncs.DefaultAcsClient;import com.aliyuncs.IAcsClient;import com.aliyuncs.exceptions.ClientException;import com.aliyuncs.exceptions.ServerException;import com.aliyuncs.iot.model.v20170420.CreateTopicRouteTableRequest;import com.aliyuncs.iot.model.v20170420.CreateTopicRouteTableResponse;import com.aliyuncs.profile.DefaultProfile;import com.google.gson.Gson;import java.util.*;public class CreateTopicRouteTable { public static void main(String[] args) { DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "LTAIOZZg********", "v7CjUJCMk7j9aKduMAQLjy********"); IAcsClient client = new DefaultAcsClient(profile); CreateTopicRouteTableRequest request = new CreateTopicRouteTableRequest(); request.setRegionId("cn-shanghai"); List<String> dstTopicList = new ArrayList<String>(); dstTopicList.add("/a12OcQ4****/device2/user/RouteData"); request.setDstTopics(dstTopicList); request.setSrcTopic("/a12OcQ4****/device1/user/RouteData"); try { CreateTopicRouteTableResponse response = client.getAcsResponse(request); System.out.println(new Gson().toJson(response)); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); } }}注意:SDK版本差异按照实际版本调整即可。3、查询路由关系 ...

October 8, 2019 · 2 min · jiezi

记一次技术调研一-iOS-应用实现-gRPC-调用

问题在手机应用的开发中,通常会将复杂的业务逻辑层实现放在服务端,客户端仅负责表现层。但是对于某些手机应用而言,业务逻辑的实现位于服务端反而是不安全的或是不合理的,而是需要将其逻辑直接在手机端实现。 目的 面对不同系统的手机客户端,单独重复实现相同的业务逻辑,并非最佳实践。如何通过第三方语言 Go 语言将业务逻辑封装成库的形式,并以静态打包的方式提供给不同系统的手机客户端使用,是本次调研的目的。 理想目标图: 具体调研内容包括: [x] iOS 应用实现 gRPC 调用[x] Android 应用实现 gRPC 调用[ ] GoMobile SDK 在 iOS & Android 上的集成[ ] GoMobile SDK 在 iOS & Android 上的边界[ ] C/S 架构 or 静态库其中关于 gRPC 在 iOS 与 Android 的实现,本身官方就已经提供了样例。本次调研会用到相关内容,所以将其作为调研的一部分记录下来,方便后来者阅读。调研中所有涉及的项目代码均存放于: liujianping/grpc-apps 仓库中, 需要的朋友可以直接下载测试。 原文发布在我的个人站点: GitDiG.com. 原文链接:iOS 应用实现 gRPC 调用 .1. 环境安装作为一名非专职 iOS 的程序员,经常需要调研陌生的技术或者语言。首先是要克服对于未知的畏惧心理。其实很多东西没那么难,只是需要开始而已。 为了完成目标调研,开始第一部分的调研工作。以文字形式记录下来,方便后来者。 1.1 XCode 安装没什么好说的,直接 AppStore 下载安装。有点慢,一边下载一边准备其它环境。 1.2 Cocoapod 安装类似与其它语言的第三方库管理工具。也没什么好说的,登录官网,按说明安装。 ...

July 4, 2019 · 3 min · jiezi

干货-基于Go-SDK操作京东云对象存储OSS的入门指南

前言本文介绍如何使用Go语言对京东云对象存储OSS进行基本的操作,帮助客户快速通过Go SDK接入京东云对象存储,提高应用开发的效率。 在实际操作之前,我们先看一下京东云OSS的API接口支持范围和能力。从对象存储的API文档可以看到,京东云提供两套接口: 1、兼容S3 API,支持AWS S3接口,兼容大部分重要功能,作为后续重点开发和优化版本。由于并不是完全兼容S3的接口,因此需要重点阅读兼容接口列表,相关介绍见https://docs.jdcloud.com/cn/o... 2、旧版OSS API,京东云前期独立封装的restful接口,支持基本的service、bucket、object等操作。该版本目前仍能使用,但后续不再开发。 很明显,京东云提供兼容S3的接口,一方面可以快速支持原有基于AWS S3开发的应用程序,另一方面帮助客户的数据从AWS S3迁移过来。建议您使用兼容S3的接口,而同时京东云提供了丰富的多种语言版本的SDK,可以根据您项目开发的需要进行不同语言SDK的选择。相关介绍见https://docs.jdcloud.com/cn/o... 这里需要注意查看兼容接口列表,对比京东云OSS和AWS S3接口的兼容情况。譬如Put Bucket接口仅使用通用的请求header,默认创建权限为private的bucket。由于不支持x-amz-acl, x-amz-grant-*等请求头,无法使用标准权限来设置ACL(即Canned ACL)。如果需要创建时指定bucket ACL,需要通过另外的接口实现,这个下文会提及。兼容接口列表:https://docs.jdcloud.com/cn/o... 下面以Go SDK介绍京东云OSS的基本操作,实现对象资源的上传下载等功能。 环境准备1、安装或更新Go 1.5及以上版本(参考1 - Mac下安装Go语言环境配置)。 2、(可选)通过可视化IDE Atom搭建Go编译环境。相比于sublime text或者传统的vim编辑方式,Atom是更为先进的文本代码编辑器,是由Github打造的编程开发工具,除了界面美观,还有各种强大的插件。本文以Atom开发环境作为展示(参考2 – Mac下基于Atom构建Go开发环境) 3、在使用Go SDK发起请求之前,需提前在京东云用户中心账户管理下的AccessKey管理页面申请accesskey和secretKey密钥对(简称AK/SK)。这个秘钥对会在后续程序初始化使用到。 下载和安装1、命令行安装 go get github.com/aws/aws-sdk-go2、Atom安装(可选)菜单【Packages】-> 【Go】-> 【Get Package】,然后输入github.com/aws/aws-sdk-go,稍等片刻便下载和安装完成。代码会被下载到GOPATH环境变量中第一个路径src目录中,效果与命令行安装方法一样。 SDK组成概述在具体编码之前,建议了解AWS SDK的构成,主要包括SDK core和service clients两个部分。SDK core适用于所有AWS的服务,service中的client仅适用于对应的service,作为该服务的客户端进行调用。 SDK core包括一些通用的类,帮助更容易地构造API参数,譬如Config、Logger等。其中,awserr:进程异常的接口,返回进程中遇到的异常和错误,对应错误码和信息。credential:API调用需要身份认证,需要使用京东云的AK/SK进行认证,并且需要修改默认的Config配置项。endpoints:服务的调用入口,有区域属性,需要在Config中配置。session:提供配置的初始化,可以自定义配置中的参数进行初始化,包括region、endpoints、credential等。request:提供API请求和重试,可以自定义请求及其处理方法。 创建s3 client的示例在发起OSS(S3协议)的请求之前,需要初始化s3 client,以下为创建client的例子。 1 ak := "your accesskey" 2 sk := "your secretkey" 3 token := "" //Token留空 4 creds := credentials.NewStaticCredentials(ak, sk, token) 5 _,err := creds.Get() 6 7 config := &aws.Config{ 8 Region: aws.String("cn-north-1"), //Bucket所在Region 9 Endpoint: aws.String("s3.cn-north-1.jcloudcs.com"), //Bucket所在Endpoint10 DisableSSL :aws.Bool(false),11 Credentials :creds,12 }13 client := s3.New(session.New(config))创建完s3 client之后,就可以对bucket、object等oss资源进行请求操作了。下面分别介绍创建bucket、上传文件(PutObject、Upload)、分片上传文件进行demo展示。 ...

July 3, 2019 · 4 min · jiezi

使用微信SDK自定义分享

一、背景介绍在微信中打开自己网站的链接,经常会变成下面这样 不太好看有木有,如果你想在分享出来的东西带上你的logo,带上你想要的描述,怎么办,像下面这样 这就需要用到微信的分享SDK,文档链接:https://developers.weixin.qq.... 二、微信SDK使用说明第一步第一步先要在微信公众平台上注册一个微信公众号,还必须要是认证的企业或组织,流程走下来大概要个两三天的时间吧,只有认证了的公众号才有分享SDK的权限,个人的不行,这个比较麻烦。账号申请成功后会有AppID和AppSecret,这个相当于你公众号的秘钥,第二步需要用到。然后在JS接口安全域名中加入你调微信SDK时的页面的地址,不支持IP地址、端口号及短链域名,只能写域名,不用加http啥的,在设置了安全域名的路径下才能够成功调SDK。 第二步需要一个获取签名的接口,这个可以找RD帮忙操作,请求接口的时候带上URL(必须和你当前的URL一致),然后让RD好好研读下如何通过公众号的AppID和AppSecret获取到token及签名等信息,接下来就可以愉快的调用微信的分享SDK了。 第三步获取到签名之后在HTML中引入 <script typet="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>引入后在代码中调用分享SDK window.wx.config({ appId: res.data.appId, //res.data为请求签名接口返回数据 timestamp: res.data.timestamp, nonceStr: res.data.nonceStr, signature: res.data.signature, jsApiList: [ 'checkJsApi', 'updateAppMessageShareData', 'updateTimelineShareData' ] }); const shareConfig = { 'imgUrl': '你想展现的图标', 'desc': '你想展现的描述', 'title': '你想展现的title', 'link': window.location.href, 'success': function () { console.log('成功了!'); }, 'cancel': function () { console.log('取消'); } }; window.wx.ready(function () { window.wx.updateAppMessageShareData(shareConfig); window.wx.updateTimelineShareData(shareConfig); });OK!大功告成,现在就可以按你的想法分享内容了,但是如何在本地测试是否成功呢?我们刚才也说了只能在安全域名下才能调用成功,所以Charles就派上大用场了。。。把安全域名代理到本地,然后可以在微信开发者工具上面自测一下,没问题了上真机,iOS和安装都要试一下,会有惊喜。 三、坑及总结在自测了没问题之后上线了。。。结果发现iOS的手机获取签名失败,报invalid signature,后来排查发现在iOS的微信里面如果从其他页面跳转到你要分享的页面window.location.href是不会变的。。。也就是说你发请求去获取签名时候传给后端的URL和你当前的URL是不一致的,所以导致签名获取失败。这个解决办法很多,可以把前一个页面的URL拿去获取签名,只要保持一致就是OK的。好了 先写这么多。。。

July 2, 2019 · 1 min · jiezi

呼叫到达率100网易云信信令SDK免费上线

近期,网易云信推出一款稳定可靠、到达率高、扩展性较强的信令通道产品--信令SDK。它能够提供可靠的消息通道,可用于搭建音视频场景下的呼叫邀请机制。信令SDK目前兼容市面上所有主流的音视频SDK,呼叫到达率高达100%,支持离线推送和自定义控制消息,是功能最丰富、稳定性最高的信令SDK之一。信令SDK目前支持以下功能:• 呼叫邀请• 频道管理• 用户管理• 离线消息同步• 多端同步• 自定义控制信令 信令的功能和使用方式信令是终端和终端、终端和网络之间的控制和通知类型的信号传输系统,通信场景中,信令通过传输呼叫、监控、网络管理等信息,保证全网的正常通信。音视频通话场景中,信令一般用来呼叫远端或邀请成员加入房间,同时信令还可以应用于IOT指令控制、白板信息同步等场景。 市面上主流的信令服务一般会作为即时通信或音视频通话的附属功能使用,对于仅需要信令服务的开发者来说,有两方面的问题:• 需要支出一定的使用费用• 接口丰富度不足,易用性不够好 网易云信推出的信令SDK,支持单独免费使用,同时根据音视频通话场景完善了相关接口和功能,也支持和即时通信服务一起使用,满足不同开发者和不同场景的功能诉求。 *信令SDK搭配音视频实现多人场景的邀请机制网易云信信令SDK的优势稳定性高,呼叫到达率100%,接通率95%+网易云信拥有稳定可靠的消息传输机制和架构,保证亿级消息量的并发和到达,在线消息必达,支持离线消息同步,支持苹果、华为、小米、VIVO等主流厂商推送接入,保障多种场景下的呼叫到达率,防止信令丢失。 兼容所有主流音视频服务,1小时快速接入可搭配市面上的所有主流音视频服务,搭建基于呼叫邀请的音视频通话场景,支持音视频多备份策略;提供多种场景下的示例代码,方便快速接入。 功能丰富,灵活度高,适配各种音视频场景支持呼叫邀请、房间管理、用户管理、离线消息同步、多端同步等功能,是目前功能最丰富的音视频信令服务;支持自定义控制信令,便于拓展各种控制信令相关场景。 免费使用,用户账号数量无限制免费接入,不限制用户账号数量,降低使用成本,助力业务快速成长;完善的新老版本迁移方案,便于实现新老版本互通。 如何快速接入和使用信令Step1: 了解信令功能和使用场景,点击查看信令产品介绍https://yunxin.163.com/signal...Step2: 注册云信账号,创建应用并开通服务,点击注册网易云信账号https://id.163yun.com/login?f...Step3:通过开发文档和示例代码快速接入,点击查看开发文档https://dev.yunxin.163.com/do... 立即免费试用信令SDK吧~__网易云信(NeteaseYunXin)是集网易18年IM以及音视频技术打造的PaaS服务产品,来自网易核心技术架构的通信与视频云服务,稳定易用且功能全面,致力于提供全球领先的技术能力和场景化解决方案。开发者通过集成客户端SDK和云端OPEN API,即可快速实现包含IM、音视频通话、直播、点播、互动白板、短信等功能。

June 28, 2019 · 1 min · jiezi

Plain使用同一套代码创建你的-web-地图应用

使用同一套代码创建你的 web 地图应用。 ✨ https://github.com/XingzheFE/... English | 简体中文 特性Layers MarkerPolylinePopupMap Controls zoomfitViewpanToEventedUtils getBoundlocatecoordinate translate如何使用安装使用 npm 安装 plain-js,你也可以在页面中引入构建后的 js 文件。 $ npm install plain-js --save创建地图创建地图的方式很简单,最直接的方式是在 html 文件中引入地图库的脚本文件以及 plain.min.js // 首先初始化一个 plain 对象let plain = new Plain();// 设置需要使用的坐标系,如果不设置的话所有地图使用默认的坐标系,// Google 和 高德地图在大陆使用 GCJ02,百度地图使用 BD09,// 为了方便开发建议设置为 GCJ02plain.setCoordType("GCJ02");// 告诉 plain 你需要使用 Google 地图,// 可选的参数有 Google Map "GMAP", 高德地图 "AMAP", 百度地图 "BMAP"plain.use("GMAP");// 创建一个 Google 地图实例let map = plain.Map({ container: "#map", // DivElement center: [39.908012, 116.399348], zoom: 15});或者使用回调的方式创建 ...

June 21, 2019 · 2 min · jiezi

克服水土不服,融云助攻小象直播杀破出海重围

2016年是直播行业被资本疯狂追逐的一年,可至今却经历着“浪潮”褪去,洗刷的不止是中小型直播平台,就连熊猫TV等有资本加持的大平台都纷纷遭遇倒闭危机。然而,直播行业作为泛娱乐的模式之一,其实本身“未死”,在行业洗牌和整合的围困下,秀场直播抱团取暖,跨界直播异军突起,直播出海也成为各平台生存和扩张的出路之一。由于东南亚、中东等国家和地区的互联网生态比中国晚 2 到 3 年,直播模式尚处于萌芽阶段,各平台将国内直播模式照搬,以寻求在相对空白的市场加快商业变现。当前国内有近 50 家直播企业出海,覆盖亚洲、欧洲、非洲、美洲和大洋洲等 45 个国家和地区。直播扎堆出海首先面对的就是技术考验,众多直播公司就遭遇过自研的直播底层 IM 技术无法支持平台流量的困境。“平台没有经历过高并发考验,导致我们刚在东南亚推广上线一天,就彻底崩了。”业内技术人士说道。相对于技术环境较稳定的国内市场,直播出海企业不仅面临 IM 丢包丢消息的风险,其链路能否支撑企业的海外布局也被严格考验着。克服“水土不服”,小象直播杀破重围近期,一款主打海外直播的 App 小象直播,吸引了人们关注的目光,这款致力打造“最懂华人”品牌的直播平台于 2018 年 5 月正式上线,并成功入围 2019 年 1 月海外收入 Top 20 视频/直播榜单,并在同年 3 月登上 Google Play 马来西亚应用类 App 总榜第 5 名。( 2019 年 1 月海外收入 Top 20 视频/直播榜单)小象直播上线以来,不断更新迭代功能,先后推出直播弹幕、送礼、无限制视频/语音连麦,以及在线抓娃娃等丰富的线上玩法,实现主播与用户连接“无卡顿”、互动“零距离”,为海外用户呈现出超强娱乐性,以及身临其境的直播盛宴。技术驱动平台发展。在小象直播互动功能持续升级的背后,选择的是全球互联网通信云服务商融云强有力的支持,通过其 SDK 的接入,小象直播快速集成直播互动能力,让海外用户轻松获得极致的互动体验。融云直播聊天室构建多种类互动场景,亿级并发稳定可靠融云直播聊天室帮助小象直播构建了稳固的“平台地基”,真正将主播与用户连接起来,稳定、高并发、多种类的直播场景,大大满足了平台用户全面的互动需求。据了解,融云直播聊天室消息库通用性极高,支持弹幕、礼物、点赞、禁言、踢出聊天室、系统通知等多种消息类型,同时支持 iOS 、 Android 、 Web 、桌面端多平台接入使用;小象直播无需进行繁杂的业务梳理、消息的定义及实现,可灵活使用消息库中的消息类型,满足各类直播场景聊天互动需求、节省研发成本,符合其低成本的运营模式。融云经过 2218 亿消息峰值和海量用户的锤炼,帮助小象直播平台实现亿级消息并发即时到达,保证实时互动稳定流畅无卡顿。今年 1 月,小象直播在马来西亚举办了一场颁奖典礼,马来西亚当红明星作为嘉宾自带了超高流量,即便如此,融云依然全面保障了小象直播这场年度派对的直播质量。全球化通信能力支撑小象直播海外用户沟通无障碍小象直播是一款主打“最懂华人的直播平台”,主要用户群体集中在东南亚,多样的海外业务对通信网络的连通率及稳定性要求极其严格。融云直播聊天室帮助小象直播打消了通信云技术应用的后顾之忧。(小象直播官宣图)融云在全球设立了多数据中心,具备 3000 多个加速点,通信网络覆盖全球所有国家及地区,有效保证了海外用户对于链路通畅的超高要求,不仅为小象直播百万用户提供稳定流畅的沟通环境,也对吸引主播加入、提高主播的活跃度及留存率起到很大帮助。融云作为全球互联网通信云的领导者,致力为全球 27 万 App 提供安全可靠的全球通信云服务,开发者只需简单集成 SDK ,就能获得良好的直播聊天互动体验,完美将互动融入自己的直播业务。目前,融云与荔枝 FM、羚萌 Show、得到、汽车之家、吱呀、蜜芽等平台进行深度合作,助其直播业务的顺利开展。未来,融云将更专注于技术的研发与服务的升级,为更多开发者及互联网企业带来方便快捷、个性化、多样化的用户体验,领跑“新直播时代”。

April 17, 2019 · 1 min · jiezi

5 XIN token 悬赏: Mixin Network Java SDK 补完计划

任务目标: 完善现有的Java SDK,使其可以支持Mixin Network所有的API。奖金: 5 XIN (约值 $700) 给最佳方案提供者流程:通过邮件 lilin at mixin.one, 或者 Mixin Messenger ID 31367 联系负责人创建Github开源库,写代码,告诉我库的地址时间安排:请于2019年4月12日之前提交完代码。最终结果将于2019年4月20日之前公布。Mixin Network开发者资源汇总Python 比特币教程PHP 比特币教程Go 比特币教程Java 比特币教程Node.js 比特币教程C# 比特币教程

March 12, 2019 · 1 min · jiezi

Java调用离线人脸识别SDK 虹软arcface 2.0

虹软人脸识别SDK之Java版,支持SDK 1.1+,以及当前最新版本2.0,滴滴,抓紧上车!JDK SDK Win release license status前言由于业务需求,最近跟人脸识别杠上了,本以为虹软提供的SDK是那种面向开发语言的,结果是一堆dll······像我这样的Java猿突然就感觉整个人都不好了;近期赶上了SDK2.0的升级,在官方论坛、Google、百度、QQ等等的帮助下,爬过了一个又一个坑,终于搞定了!噗!回过头来发现不少伙伴们都像我当初一样迷茫,So,我回来拯救世界了后更:刚写了没多久,虹软SDK的Java版Demo就出来了……………..注意本项目需要lombok的支持虹软官方分为“人证SDK”、“活体检测”和“ArcFace”三种,本项目使用的是“ArcFace”Windows 32位、64位指的是JDK,并不是Windows操作系统的位数master分支为最新的SDK 2.0版本,1.x的版本实现请查看1.x分支(1.x实现来自于官方论坛Demo)本项目实现了对SDK的轻度封装,且为单线程模式,多线程情况下尚未测试,放过可怜的孩子吧…功能特点对SDK接口进行了二次封装,所有操作只需要一个简单的工具类就ojbk,用起来爽的一批激活引擎初始化引擎检测人脸提取特征值对比特征值年龄/性别/角度检测预处理获取年龄获取性别获取3D角度获取引擎版本销毁引擎快速开始安装项目git clone https://github.com/jastar-wan…然后将项目导入到Eclipse或IDEA中并进行maven update下载DLL登录虹软官方网站,下载ArcFace 2.0的SDK,并将libarcsoft_face.dll和libarcsoft_face_engine.dll两个文件粘贴到src/test/resources目录下配置KEY将官网获取到的SDK激活码填入到com.arcsoft.face.util.ConfUtil类的对应常量中测试打开com.arcsoft.face.EngineTest类,运行单元测试即可参考资料虹软SDK的常见问题指南虹软官方问答指导集锦常见问题(1)SDK有效期?答:SDK激活码有效期为一年,到期之后需要重新申请激活码,并且重新下载SDK,SDK与激活码应当匹配。(2)SDK 2.0首次使用?答:2.0版本首次使用需要联网激活,激活后会在程序运行目录下生成几个“.dat”文件(asf_install.dat,freesdk_数字.dat),之后则可以离线使用;若更换了机器设备,需要删除这些“.dat”文件,并重新联网激活。(3)SDK 2.0特征值?答:1.x的版本特征值大小为20k左右,2.0版本算法做了大幅优化,缩小到了1k,且长度固定为1023 byte。(4)SDK 2.0对于图片的要求?答:图片的宽度必须是4的整数倍;当图片为BGR模式时,高度需要是2的整数倍。(5)SDK 2.0的阈值?答:由于2.0的算法做了优化,匹配度相对较高,推荐阈值设置为0.8(1.x版本为0.6),具体根据实际场景上下调整。(6)SDK 2.0提取特征值?答:2.0版本对内存做了优化,会反复使用同一个特征值对象的内存,所以提取特征值之后需要对特征值对象重新copy,否则SDK再进行提取时会覆盖了原特征值。(7)关于多线程使用?答:多线程使用场景下,每个线程都需要初始化一个引擎。(8)如何加载图片?答:可以使用“ImageIO.read()方式读取图片,但该方式读取某些类型的图片时,不会正确读取ICC的信息,因此会在写出图片时生成一层红色蒙版(如果不写出图片那就无所谓)。有两种解决方案:(1)参照EngineTest.testAll()方法中的加载方式,这种方式仅限于Windows下使用,因为需要用到图形环境的支持。(2)使用javacv(基于opencv)加载图片,pom依赖中已注释,本人放弃的原因是因为jar包太大且需求不会有Linux环境。”(9)运行EngineTest单元测试提示“…找不到指定模块”?答:这是因为你的系统缺少dll运行的必要组件,别担心,点击 这里 进行下载,根据自身情况选择32位或64位安装即可。许可证本项目遵循 MIT 开源协议,手动比心????

March 8, 2019 · 1 min · jiezi

Nacos系列:Nacos的Java SDK使用

Maven依赖Nacos提供完整的Java SDK,便于配置管理和服务发现及管理,以 Nacos-0.8.0 版本为例添加Maven依赖:<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>0.8.0</version></dependency>仅仅引入nacos-client是不够的,否则启动时会出现如下错误:sun.misc.Launcher$AppClassLoader@18b4aac2 JM.Log:WARN Init JM logger with NopLoggerFactory, pay attention. sun.misc.Launcher$AppClassLoader@18b4aac2java.lang.ClassNotFoundException: org.apache.logging.log4j.core.Logger at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.alibaba.nacos.client.logger.log4j2.Log4j2LoggerFactory.<init>(Log4j2LoggerFactory.java:33) at com.alibaba.nacos.client.logger.LoggerFactory.<clinit>(LoggerFactory.java:59) at com.alibaba.nacos.client.config.utils.LogUtils.<clinit>(LogUtils.java:49) at com.alibaba.nacos.client.config.NacosConfigService.<clinit>(NacosConfigService.java:55) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.alibaba.nacos.api.config.ConfigFactory.createConfigService(ConfigFactory.java:40) at com.alibaba.nacos.api.config.ConfigFactory.createConfigService(ConfigFactory.java:59) at com.alibaba.nacos.api.NacosFactory.createConfigService(NacosFactory.java:52) at com.learn.nacos.config.NacosConfig.main(NacosConfig.java:12)根据错误提示,应该还需要添加log4j相关依赖,官网的文档并没有对此说明,我在pom.xml添加了下面这些依赖才不报错<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.11</version></dependency><dependency> <groupId>org.logback-extensions</groupId> <artifactId>logback-ext-spring</artifactId> <version>0.1.4</version></dependency><dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.25</version></dependency><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version></dependency>配置管理创建ConfigService,可以通过 NacosFactory.createConfigService() 或 ConfigFactory.createConfigService() 来创建,后者是前者的底层实现方式,这两种方式都包含如下两个方法:createConfigService(serverAddr)createConfigService(properties)创建示例:// 方式一String serverAddr = “127.0.0.1:8848”;ConfigService configService = ConfigFactory.createConfigService(serverAddr);// 方式二ConfigService configService = ConfigFactory.createConfigService(properties)Properties properties = new Properties();properties.put(“serverAddr”, serverAddr);查看ConfigService源码,它提供了如下方法:获取 Nacos Server 当前状态:String getServerStatus()底层源码:public String getServerStatus() { if (worker.isHealthServer()) { return “UP”; } else { return “DOWN”; }}根据源码注释,该状态应该是指 Nacos Server 的状态,我把 Nacos Server 关闭之后,再次运行示例,得到的结果仍然是UP,不知道这是不是一个BUG。发布配置:boolean publishConfig(String dataId, String group, String content) throws NacosException支持程序自动发布Nacos配置,创建和修改配置使用同一个方法,配置不存在则创建;配置已存在则更新。底层源码:try { result = agent.httpPost(url, headers, params, encode, POST_TIMEOUT);} catch (IOException ioe) { log.warn(“NACOS-0006”, LoggerHelper.getErrorCodeStr(“NACOS”, “NACOS-0006”, “环境问题”, “[publish-single] exception”)); log.warn(agent.getName(), “[publish-single] exception, dataId={}, group={}, msg={}”, dataId, group, ioe.toString()); return false;}发布配置后,如果马上用getConfig()读取配置,有时候会读不到,设置了足够的等待时长后才可保证每次正常读取,看了源码才知道Nacos的配置管理(发布、读取、移除)都是通过HTTP接口完成的,但发布配置的时延是多少,官网似乎没有说明?几秒钟的时延在一些对实时性要求很高的场景会不会存在影响呢?读取配置:String getConfig(String dataId, String group, long timeoutMs) throws NacosExceptiontimeoutMs指读取配置超时时间,官网推荐设置为3000ms底层源码:// 优先使用本地配置String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);if (content != null) { log.warn(agent.getName(), “[get-config] get failover ok, dataId={}, group={}, tenant={}, config={}”, dataId, group, tenant, ContentUtils.truncateContent(content)); cr.setContent(content); configFilterChainManager.doFilter(null, cr); content = cr.getContent(); return content;}try { content = worker.getServerConfig(dataId, group, tenant, timeoutMs); cr.setContent(content); configFilterChainManager.doFilter(null, cr); content = cr.getContent(); return content;} catch (NacosException ioe) { if (NacosException.NO_RIGHT == ioe.getErrCode()) { throw ioe; } log.warn(“NACOS-0003”, LoggerHelper.getErrorCodeStr(“NACOS”, “NACOS-0003”, “环境问题”, “get from server error”)); log.warn(agent.getName(), “[get-config] get from server error, dataId={}, group={}, tenant={}, msg={}”, dataId, group, tenant, ioe.toString());}从源码上看,配置会先从本地缓存文件读取,如果没读取到,才会去请求Nacos Server的配置,这个缓存文件在哪呢?就在当前用户的nacos目录下生成的缓存文件:nacos/config/fixed-127.0.0.1_8848_nacos/snapshot/DEFAULT_GROUP/nacos-sdk-java-config,配置内容和发布到Nacos Server的配置内容是一致的。移除配置:boolean removeConfig(String dataId, String group) throws NacosException支持程序自动发布Nacos配置,配置不存在时会直接返回成功,移除配置后,本地的缓存文件也会被删除底层源码:try { result = agent.httpDelete(url, null, params, encode, POST_TIMEOUT);} catch (IOException ioe) { log.warn("[remove] error, " + dataId + “, " + group + “, " + tenant + “, msg: " + ioe.toString()); return false;}移除配置同发布配置一样,如果移除后马上查询,有可能还能将刚移除的配置查出来,也存在一定的时延,需要设置等待时间读取。添加配置监听:void addListener(String dataId, String group, Listener listener) throws NacosException支持动态监听配置的变化,运行示例源码,在Nacos控制台把配置内容修改为sdk-java-config:change from nacos console,此时观看IDE控制台,你会看到如下打印信息:当前线程:com.alibaba.nacos.client.Worker.longPollingfixed-127.0.0.1_8848 ,监听到配置内容变化:sdk-java-config:change from nacos console移除配置监听:void removeListener(String dataId, String group, Listener listener)移除监听后,配置的变化不会再监听启动完整示例,运行结果如下,请注意配置监听线程和配置管理线程不是同一个线程当前线程:main ,服务状态:UP添加监听添加监听成功发布配置发布配置成功当前线程:com.alibaba.nacos.client.Worker.longPollingfixed-127.0.0.1_8848 ,监听到配置内容变化:nacos-sdk-java-config:init当前线程:main ,发布配置后获取配置内容:nacos-sdk-java-config:init重新发布配置重新发布配置成功当前线程:main ,重新发布配置后获取配置内容:sdk-java-config:update当前线程:com.alibaba.nacos.client.Worker.longPollingfixed-127.0.0.1_8848 ,监听到配置内容变化:sdk-java-config:update当前线程:com.alibaba.nacos.client.Worker.longPollingfixed-127.0.0.1_8848 ,监听到配置内容变化:sdk-java-config:change from nacos console移除配置移除配置成功当前线程:main ,移除配置后获取配置内容:null取消监听取消监听成功服务管理创建NamingService,可以通过 NacosFactory.createNamingService() 或 NamingFactory.createNamingService() 来创建,后者是前者的底层实现方式,这两种方式都包含如下两个方法:createNamingService(serverAddr)createNamingService(properties)创建示例:// 方式一String serverAddr = “127.0.0.1:8848”;NamingService namingService = NamingFactory.createNamingService(serverAddr);// 方式二NamingService namingService = NamingFactory.createNamingService(properties)Properties properties = new Properties();properties.put(“serverAddr”, serverAddr);查看NamingService类源码,它提供了如下方法:获取 Nacos Server 当前状态:String getServerStatus()注册服务实例:void registerInstance(多个参数)方式一:String serverIp = “127.0.0.1”;int serverPort = 8848;String serverAddr = serverIp + “:” + serverPort;String serviceName = “nacos-sdk-java-discovery”;NamingService namingService = NamingFactory.createNamingService(serverAddr);namingService.registerInstance(serviceName, serverIp, serverPort);方式二:Instance instance = new Instance();instance.setIp(serverIp);//IPinstance.setPort(serverPort);//端口instance.setServiceName(serviceName);//服务名instance.setEnabled(true);//true: 上线 false: 下线instance.setHealthy(healthy);//健康状态instance.setWeight(1.0);//权重instance.addMetadata(“nacos-sdk-java-discovery”, “true”);//元数据NamingService namingService = NamingFactory.createNamingService(serverAddr);namingService.registerInstance(serviceName, instance);注册后,本地会生成缓存文件1、在Nacos安装目录data目录下:data/naming/data/public/com.alibaba.nacos.naming.domains.meta.public##nacos-sdk-java-discovery2、当前用户的nacos目录下:/nacos/naming/public/failover/nacos-sdk-java-discovery3、当前用户的nacos目录下:/nacos/naming/public/nacos-sdk-java-discovery即使删除服务实例,上面三个缓存文件也不会被删除,Nacos控制台服务列表中该服务也还存在着(但服务实例数会变成0);删除Nacos控制台的该服务,安全目录data目录下的缓存文件会被删除,但当前用户的nacos目录下的文件不会被删除,这里面是什么机制,我暂时还没整明白,等后面整明白了再来补充。删除服务实例:void deregisterInstance(多个参数)获取所有服务实例:List<Instance> getAllInstances(多个参数)获取所有健康或不健康的服务实例:List<Instance> selectInstances(多个参数)随机获取一个健康实例(根据负载均衡算法):Instance selectOneHealthyInstance(多个参数)添加服务实例监听:void subscribe(多个参数)添加服务实例监听:void unsubscribe(多个参数)分页获取所有服务实例:ListView<String> getServicesOfServer(多个参数)获取所有监听的服务实例:List<ServiceInfo> getSubscribeServices()启动完整示例,运行结果如下,请注意服务实例监听线程和服务实例管理线程不是同一个线程当前线程:main ,服务状态:UP注册实例注册实例成功添加监听添加监听成功当前线程:main ,注册实例后获取所有实例:[{“clusterName”:“DEFAULT”,“enabled”:true,“instanceId”:“127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery”,“ip”:“127.0.0.1”,“metadata”:{},“port”:8848,“serviceName”:“nacos-sdk-java-discovery”,“valid”:true,“weight”:1.0}]当前线程:main ,注册实例后获取所有健康实例:[{“clusterName”:“DEFAULT”,“enabled”:true,“instanceId”:“127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery”,“ip”:“127.0.0.1”,“metadata”:{},“port”:8848,“serviceName”:“nacos-sdk-java-discovery”,“valid”:true,“weight”:1.0}]当前线程:com.alibaba.nacos.naming.client.listener ,监听到实例名称:nacos-sdk-java-discovery当前线程:com.alibaba.nacos.naming.client.listener ,监听到实例内容:[{“clusterName”:“DEFAULT”,“enabled”:true,“instanceId”:“127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery”,“ip”:“127.0.0.1”,“metadata”:{},“port”:8848,“serviceName”:“nacos-sdk-java-discovery”,“valid”:true,“weight”:1.0}]当前线程:main ,注册实例后获取一个健康实例:{“clusterName”:“DEFAULT”,“enabled”:true,“instanceId”:“127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery”,“ip”:“127.0.0.1”,“metadata”:{},“port”:8848,“serviceName”:“nacos-sdk-java-discovery”,“valid”:true,“weight”:1.0}当前线程:com.alibaba.nacos.naming.client.listener ,监听到实例名称:nacos-sdk-java-discovery当前线程:com.alibaba.nacos.naming.client.listener ,监听到实例内容:[{“clusterName”:“DEFAULT”,“enabled”:true,“instanceId”:“127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery”,“ip”:“127.0.0.1”,“metadata”:{“change”:“true;”},“port”:8848,“serviceName”:“nacos-sdk-java-discovery”,“valid”:true,“weight”:2.0}]取消监听取消监听成功删除实例删除实例成功Exception in thread “main” java.lang.IllegalStateException: no host to srv for serviceInfo: nacos-sdk-java-discovery at com.alibaba.nacos.client.naming.core.Balancer$RandomByWeight.selectAll(Balancer.java:45) at com.alibaba.nacos.client.naming.core.Balancer$RandomByWeight.selectHost(Balancer.java:53) at com.alibaba.nacos.client.naming.NacosNamingService.selectOneHealthyInstance(NacosNamingService.java:270) at com.alibaba.nacos.client.naming.NacosNamingService.selectOneHealthyInstance(NacosNamingService.java:263) at com.alibaba.nacos.client.naming.NacosNamingService.selectOneHealthyInstance(NacosNamingService.java:253) at com.learn.nacos.discovery.NacosDiscovery.main(NacosDiscovery.java:121)当前线程:main ,删除实例后获取所有实例:[]当前线程:main ,删除实例后获取所有健康实例:[]以上就是 Nacos Java SDK 配置管理和服务管理功能的介绍,请参考示例源码学习。示例源码项目:learn-nacos-sdk-java代码已上传至码云和Github上,欢迎下载学习GiteeGithub参考资料Nacos用户指南:Java的SDK推荐阅读Nacos系列:欢迎来到Nacos的世界!Nacos系列:基于Nacos的注册中心Nacos系列:基于Nacos的配置中心 ...

February 22, 2019 · 2 min · jiezi

android: 高德地图

分为地图,定位,搜索(我还没做导航功能)建议采用gradle方式集成添加依赖在project/build.gradle文件下添加jcenter的仓库地址allprojects { repositories { jcenter() // 或者 mavenCentral() } }在app/build.gradle下添加依赖android { defaultConfig { ndk { //设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so) abiFilters “armeabi”, “armeabi-v7a”, “arm64-v8a”, “x86”,“x86_64” } }}dependencies { compile fileTree(dir: ’libs’, include: [’*.jar’]) //3D地图so及jar compile ‘com.amap.api:3dmap:latest.integration’ //定位功能 compile ‘com.amap.api:location:latest.integration’ //搜索功能 compile ‘com.amap.api:search:latest.integration’}navi导航SDK 5.0.0以后版本包含了3D地图SDK,所以请不要同时引入 map3d 和 navi SDK。添加权限在AndroidManifest.xml文件下添加权限 <!–允许程序打开网络套接字–><uses-permission android:name=“android.permission.INTERNET” /><!–允许程序设置内置sd卡的写权限–><uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE” /> <!–允许程序获取网络状态–><uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE” /> <!–允许程序访问WiFi网络信息–><uses-permission android:name=“android.permission.ACCESS_WIFI_STATE” /> <!–允许程序读写手机状态和身份–><uses-permission android:name=“android.permission.READ_PHONE_STATE” /> <!–允许程序访问CellID或WiFi热点来获取粗略的位置–><uses-permission android:name=“android.permission.ACCESS_COARSE_LOCATION” /> 添加高德key如何获取key看这里 -> 点我查看Key注册时必要数据SHA1和包名的获取方法建议同时设置debug和release状态下的key,方便App在debug模式下也能使用高德地图功能.在app/build.gradle下设置两种key android { buildTypes { debug { manifestPlacesholders = [ //左边的键MAP_API_KEY是自定义的名字,右边的debug-key-value是你申请的debug下的key值 “MAP_API_KEY” : “debug-key-value” ] } release{ manifestPlacesholders = [ //左边的键MAP_API_KEY要和debug下的保持一致,右边的release-key-value是你申请的release下的key值 “MAP_API_KEY” : “release-key-value” ] } } }在AndroidManifest.xml中添加key <application> <meta-data android:name=“com.amap.api.v2.apikey” //要和app/build.gradle文件中设置的保持一致 android:value="${MAP_API_KEY}"/> </application>使用地图在布局中引入地图MapView // R.layout.activity_your_activity <com.amap.api.maps.MapView android:id="@+id/map" android:layout_width=“match_parent” android:layout_height=“match_parent”/>管理地图的生命周期(非常重要),以Activity为例 public class YourActivity extends AppcompatActivity{ MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_your_activity); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.map); //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图 mMapView.onCreate(savedInstanceState); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制 mMapView.onPause(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态 mMapView.onSaveInstanceState(outState); } }构造一个AMap对象 if(mAMap == null){ mAMap = mapView.getMap(); }初始化地图的相关属性地图缩放级别mAMap.animateCamera(CameraUpdateFactory.zoomTo(float zoomLevel));显示定位蓝点未完待续 ...

February 20, 2019 · 1 min · jiezi

谈谈接入各种第三方推送平台的技术方案和坑点

在移动互联网时代,为了运营好一个APP,消息推送是一个优质廉价的渠道。消息推送的使用场景简单来说,可以包括运营类的消息推送,如活动推广期间的推送等,还包括通知类的消息推送,如社交场景中的新消息提醒等。对于APP来说,消息推送能够起到内容告知、提高日活,甚至召回用户的作用。那么如何接入第三方推送平台呢?本篇文章中,网易云信资深研发工程师将和大家聊聊接入各种第三方推送平台的技术方案,分享接入推送平台的一些实用经验。如何接入第三方推送推送的一般流程推送是一种服务器主动push消息到设备端的行为,因此依赖于设备端和服务器的长连接。整体的架构和流程如下:具体如下:1) 设备和推送服务器建立长连接2) 设备会根据某些规则生成或从推送服务器获取到一个DeviceToken,推送服务器可以根据DeviceToken定位到具体的设备3) 设备会上报DeviceToken到应用服务器(由应用自己完成)4) 应用服务器根据需要调用推送的服务端接口发起推送5) 推送服务器收到推送请求,根据请求中的DeviceToken定位到具体的设备,下发推送通知6) 设备收到推送消息,可以进行通知栏弹窗或者其他行为iOS苹果官方提供了APNS推送,有很高的推送送达率。早先的APNS推送提供了一套基于TCP协议的接口,但是该接口使用方式比较复杂,稍有不慎就会导致推送失败,但调用方还误以为推送成功。后来苹果又提供了一套新的基于HTTP2协议的接口,新接口的一个好处是可以追踪到每个推送请求是被APNS服务器拒绝了还是成功了,再也不用去猜请求到底是被苹果服务器给丢了还是接受了。安卓谷歌官方最早提供了GCM推送,后来又推出了FCM推送来代替GCM,但由于国内的环境不适合使用,因此各个手机厂商又相继推出了各自的推送,推送的原理都是类似的,都是依赖于设备和推送服务器的长连接,但是厂商推送的优势在于这样的长连接可以和自己的手机系统绑定到一起,从而可以不同应用共享同一条长连接,节省了心跳的流量消耗,并且这样的系统级长连接可以不用担心应用被杀导致的应用内长连接断连导致消息推送不可达。目前已经推出厂商推送的包括小米、华为、魅族、OPPO等,FCM也可以算安装了谷歌服务的设备的系统级推送。不同于IOS,安卓阵营的推送服务器接口都是HTTPS接口,并且通过SecretKey的方式来进行安全校验。一点经验DeviceToken的管理我们知道DeviceToken标识了一台具体的设备,但是推送服务本身是不知道应用本身的账号体系的,因此同一个APP,假设注销了A账号,改用B账号登录,此时DeviceToken一般来说是没有变化的,此时应用服务器需要去标识A账号的该设备属于注销状态,不然一条针对A账号的推送消息就会被B账号收到。应用被卸载的情况应用被卸载的时候(这时候登录的A账号),应用本身感知不到,此时针对A账号的该设备的推送还是会发出去,推送服务器收到推送消息,找不到对应的设备,此时没有问题,只是会消耗一些资源。假设此时设备上的应用又重新安装了,然后登录了另一个账号B,假设DeviceToken没有变化,此时针对A账号的推送将会被B账号收到。上面这种情况出现的前提条件是DeviceToken没有发生变化,测试发现华为推送存在这个问题(经过询问华为推送技术支持,2018年3月之后的设备不存在该问题),其他推送没有。为了解决这个问题,服务器必须自己管理DeviceToken-用户账号的映射关系,并在发现有DeviceToken冲突的情况下去把老的账号设置为注销状态。IM场景下推送时机问题IM场景下,应用服务器有自己长连接服务,此时第三方推送服务的作用是利用第三方厂商推送的系统级长连接来提高消息推送的送达率。首先对于IOS端,应用无法常驻后台,我们会在应用切换前后台的时候通过IM长连接发送一个标记位,服务器会在设备离线或者处于后台的情况下触发APNS推送,从而减少设备在前台情况下APNS推送的流量消耗。而对于安卓端,服务器会在设备处于离线的情况下触发第三方推送,否则会走IM长连接下发通知,当设备处于后台但还活着的时候,会在收到消息之后主动弹窗以便提醒用户有新消息。对于安卓端还有一个场景是这样的,安卓端在后台的某个时刻进程死了,此时过来一条需要推送的消息,服务器发现设备处于离线状态,尝试调用第三方推送(可能有也可能没有)。过了一会进程自己活回来了,重新连接到了IM服务器,拿到了未读消息,此时一般的逻辑下,进程会主动弹窗告知有消息到达,造成设备端的通知栏有两条推送。为了解决这个问题,需要IM服务器在设备重连的时候下发未读消息是否需要弹窗的信息。以上就是网易云信对于第三方推送平台技术方案的介绍和经验分享,更多技术干货和实战经验分享,请关注网易云信博客。

January 21, 2019 · 1 min · jiezi

如何去设计前端框架能力?星巴克消息开放项目从0到1,从点到面的思考

本文由淘宝前端工程师罗嗣分享,主要讲述了作者在星巴克消息开放项目中的总结和思考,希望对大家有帮助,让业务分享更加有价值。摘要从满足星巴克项目需求单点出发,发散到从点到面的思考。从而总结了自己思考的基本流程(方法论)。从如下四个递进方面思考。业务拓展:拓展自有业务的边界,和其他业务合作共建,形成标准的能力透出, 合力共建。业务趋势:业务的特点和趋势是如何。技术可以如何储备来应对未来业务的变化。技术趋势:技术命题,技术趋势。选择适合的技术来解决现在的问题。保持技术对未来的弹性。需求问题:客观存在的事实,现在需求存在哪些问题,我们如何去帮助业务更加稳定,更加高效。本文提纲笔者从0到1构建一个IM前端系统,再从点到面思考整合突破原有的自有业务限制,尽量设计出的可扩展,可交互,甚至小而美的系统能力。本文会从如下几个方面去介绍。点:项目背景及需求难点(支付宝星巴克小程序入驻客服接待),以及现有的能力。面:需求做完反向思考,当前BC/CC遇到的问题及痛点,如何在同一个领域模型下做推动标准化能力。需求介绍项目背景客服接待能力由手淘消息平台和CCO团队合作共建,整体采用AMP+XSPACE的方案落地,AMP承接C端用户聊天界面,XSPACE承接B端聊天界面,同时接待又需要原有BC的聊天能力。星巴克客服接待两纵一横,底部需要对接不同的服务端,上层需要保证同一套UI来提升一致性体验。设计思路总体设计思想:设计分离出数据层和UI层,数据层和UI层以标准化协议对接。这样分层就可以解决当前业务遇到的问题,如下是当时需求的标准SDK事例点到面的思考星巴克客服消息接待开放是一种轻量级(H5形式)的客服接入能力。思考当前业务的问题是什么,如何改进,业务价值的意义等。 笔者会从如下几个方面去思考。原有H5旺旺由于历史原因有稳定性和体验的问题,这套方案能不能提供替换成原来的H5旺旺,同时对聊天接入统一收口(标准化组件)。从而达到更加稳定,更加的体验性。H5旺旺聊天可以投放到阿里系的其他端上(优酷,饿了嘛,拍卖等),甚至现在很多外投的广告业务。把H5聊天能力做强对淘宝的引流及成交都有很大的意义。同时集团里面还有小蜜作为客服聊天能力。能不能站在前端的角度思考整合输出。针对集团二方业务。需要定制个性化消息和UI能力,需要把SDK能力提供给他们去进行上层业务扩展,为保证他们低成本的接入需要提供基础能力,二方去扩展插件。同时工具链路上需要保证提高效率。生成闭环的开发环境,接入业务方只要关系自己的业务需求思考模型基于之前的背景和诉求,整体设计思路: 抽离UI层和数据层(模块),UI层和数据层基于Message实体进行标准化协议对接(桥梁)。工具链路垂直支持提高效能。 有如下几个方面衔接点:开放 UI组件 和 标准化SDK能力,让二方业务快速搭建,UI层 和 数据层之间用 标准化协议做桥梁连接在基础SDK上,会透出Context上下文(内部核心对象message,session,app)让业务去定制修改,业务方只需要去扩展插件。基于DEF脚手架体系提供相应工具链路支持,包括项目模板生成,项目测试,项目构建,完善可持续集成。业务价值在阿里做每件事情,需要明确这件事情的价值,这件事情投入产出比是多少。上文也陆续在提价值。 如图可以说明这件事价值实践方案上面几章介绍了项目背景,设计思路,思考模型和业务价值(PS:类似于论文前两章在介绍背景和理论知识)。这章主要是讲的项目实践。站在前端的角度,从四个方面去实践,并付相应代码地址。标准化协议: 由于消息领域模型是一致的,可以抽象出标准的 会话和 消息 格式。他是SDK和组件能力的桥梁SDK能力开放:提供标准化数据对接的能力,负责插件扩展能力。 业务入驻只需要开发业务相应的中间件(插件)。例如:各自业务的编解码模块,登录模块,消息处理模块组件能力开放:提供标准化的聊天能力组件。例如聊天入口接入标准化组件工具链路支撑:基于DEF脚手架体系,开发了def-kit-tbms套件。支撑项目全链路开发领域模型(标准化协议)为了达到消息标准化能力,需要把基本概念和接口达成一致。梳理两个基础概念: 会话 和 消息。会话conversation: 它是指AB通讯之间维持的一种关系,它是消息存储的载体消息message: 消息是一个对话的基本组成部分, 根据业务分为两大块消息,会话内消息和系统通知消息。会话内消息又可以分为基本消息和自定义消息。会话类型即时通讯 SDK 的核心概念「会话」,即 Conversation。我们将单聊和群聊(包括聊天室)的消息发送和接收都依托于 Conversation 这个统一的概念进行操作。会话属性备注id会话IDscene场景to聊天对象,账号或者群IDupdateTime会话更新时间unread未读数lastMsg此会话的最后一条消息custom扩展Json字符串消息类型IM SDK内的消息可以分为两类:会话内消息和系统通知消息。会话内消息只能出现并展示在聊天界面里,一般是应用内的一个用户发给另一个用户(或群组/聊天室)的消息,例如文本消息、图片消息都属于会话内消息。:会话内消息类型备注文本消息消息内容为普通文本图片消息消息内容为图片URL地址、尺寸、图片大小等信息语音消息消息内容为语音URL地址、时长、大小、格式等信息视频消息消息内容为视频文件的URL地址、时长、大小、格式等信息文件消息消息内容为文件的URL地址、大小、格式等信息,格式不限地理位置消息消息内容为地理位置标题、经度、纬度信息通知消息自定义消息可以用于消息接入扩展。 例如卡片消息,红包消息等。自定义消息**通知消息属于会话内的一种消息,用于会话内通知和提示场景。例如:群名称更新、某某某退出了群聊等。**会话和消息标准化格式标准化协议标准化会话格式标准化消息格式SDK能力开放SDK的设计参考了Koajs的设计原理(底层微创新了下)。Koajs的中间件思路: 中间件对于一次请求来处理,context分别集成了request和response对象, 同理可以映射成对一条收发消息的处理,面向切面的编程方式。。 在context中会集成message(消息),session(会话),app(如用户,初始化sdk信息等其他信息)。整个项目通过lerna进行了包管理,用Typescript写了SDK,并做了充分的单元测试,大家可以放心使用。整个项目分为了如下几个模块:@ali/tbms-compose: 函数组合模块,用于@ali/tbms-middlware服务@ali/tbms-middleware: 中间件模块@ali/tbms-util: 通用函数分装:如promise同步执行队列,mtop请求,event事件系统@ali/tbms-sdk: 消息标准化基础SDK,可以让业务扩展,补充插件测试说明:对底层支持的SDK都做了充分的单元测试,保证稳定性。后续版本更新提供差异性修改的检查使用事例组件能力开放由于需要多端投放,某些二方应用支持weex能力。从而选择了RAX技术方案。再在H5表现下对单聊做性能优化,现阶段完成聊天入口的统一接入组件,上层的组件在陆续完善中(完成度20%)。@ali/rax-tbms-chatwater tbms-components工具链路支撑基于DEF脚手架体系,开发了def-kit-tbms套件。提供项目全链路开发支撑。这个项目后续的项目搭建都采用standard-dev脚手架生成项目目录。例如:tbms-toolkit,tbms-packages总结这是一次完整的一个项目从0到1,从点到面的思考过程,建立模型到付诸于实践。从完成业务需求(需求做什么)到帮助业务成长(我能做什么)的思考过程。虽然只是站在前端角度在思考问题,但是方法论相信可以通用。后续Action改善原来的H5旺旺,使之更加稳定和更好的体验性。同时对聊天接入统一收口(标准化组件和标准化接入SDK)。Flag:利用业余时间,一月中旬前第一版本里程碑发布未完待续有什么IM相关的需求都可以联系我@罗嗣,共建标准化和生态。本文作者:罗嗣阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 19, 2018 · 1 min · jiezi

从QQ音乐开发,探讨如何利用腾讯云SDK在直播中加入视频动画

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由腾讯游戏云发表于云+社区专栏看着精彩的德甲赛事,突然裁判一声口哨,球赛断掉了,屏幕开始自动播放“吃麦趣鸡盒,看德甲比赛”的视频广告那么问题来了,如何在直播流中,无缝的插入点播视频文件呢? 本文介绍了QQ音乐基于腾讯云AVSDK,实现互动直播插播动画的方案以及踩过的坑。01从产品经理给的需求说起“开场动画?插播广告?”不久之前,产品同学说我们要在音视频直播中,加一个开场动画。要播放插播动画,怎么做呢?对于视频直播来说,当前直播画面流怎么处理?对于音频来说,又怎么输入一路流呢?02梳理技术方案互动直播的方式,是把主播的画面推送到观众面前,而主播端的画面,既可以来自摄像头采集的数据,也可以来自其它的输入流。那么如果腾讯云的AVSDK能支持到播放输入流,就能通过在主播端本地解码一个视频文件,然后把这路流的数据推到观众端的方式,让所有的角色都能播放插播动画了。幸运的是,腾讯云AVSDK可以支持到这个特性,具体的方法有下面两种:第一种:替换视频画面/*! @abstract 对本地采集视频进行预处理的回调。 @discussion 主线程回调,方面直接在回调中实现视频渲染。 @param frameData 本地采集的视频帧,对其中data数据的美颜、滤镜、特效等图像处理,会回传给SDK编码、发送,在远端收到的视频中生效。 @see QAVVideoFrame /- (void)OnLocalVideoPreProcess:(QAVVideoFrame )frameData;主播侧本地在采集到摄像头的数据后,在编码上行到服务器之前,会提供一个接口给予业务侧做预处理的回调,所以,对于视频直播,我们可以利用这个接口,把上行输入的视频画面修改为要插播进来动画的视频帧,这样,从观众角度看,被插播了视频动画。第二种:使用外部输入流/! @abstract 开启外部视频采集功能时,向SDK传入外部采集的视频帧。 @return QAV_OK 成功。 QAV_ERR_ROOM_NOT_EXIST 房间不存在,进房后调用才生效。 QAV_ERR_DEVICE_NOT_EXIST 视频设备不存在。 QAV_ERR_FAIL 失败。 @see QAVVideoFrame /- (int)fillExternalCaptureFrame:(QAVVideoFrame )frame;最开始时,我错误的认为,仅仅使用第二种方式就能够满足同时在音视频两种直播中插播动画的需求,但是实际实践的时候发现,如果要播放外部输入流,必须要先关闭摄像头画面。这个操作会引起腾讯云后台的视频位切换,并通过下面这个函数通知到观众端:/! @abstract 房间成员状态变化通知的函数。 @discussion 当房间成员发生状态变化(如是否发音频、是否发视频等)时,会通过该函数通知业务侧。 @param eventID 状态变化id,详见QAVUpdateEvent的定义。 @param endpoints 发生状态变化的成员id列表。 /- (void)OnEndpointsUpdateInfo:(QAVUpdateEvent)eventID endpointlist:(NSArray )endpoints;视频位短时间内的切换,会导致一些时序上的问题,跟SDK侧讨论也认为不建议这样做。最终,QQ音乐采用了两个方案共存的方式。03视频格式选型对于插播动画的视频文件,如果考虑到如果需要支持流式播放,码率低,高画质,可以使用H264裸流+VideoToolBox硬解的方式。如果说只播放本地文件,可以采用H264编码的mp4+AVURLAsset解码的方式。因为目前还没有流式播放的需求,而设计同学直接给到的是一个mp4文件,所以后者则看起来更合理。笔者出于个人兴趣,对两种方案的实现都做了尝试,但是也遇到了下面的一些坑,总结一下,希望能让其它同学少走点弯路:1.分辨率与帧率的配置视频的分辨率需要与腾讯云后台的SPEAR引擎配置中的上行分辨率一致,QQ音乐选择的视频上行配置是960x540,帧率是15帧。但是实际的播放中,发现效果并不理想,所以需要播放更高分辨率的数据,这一步可以通过更换AVSDK的角色RoleName来实现,这里不做延伸。另外一个问题是从摄像头采集上来的数据,是下图的角度为1的图像,在渲染的时候,会默认被旋转90度,在更改视频画面时,需要保持两者的一致性。摄像头采集的数据格式是NV12,而本地填充画面的格式可以是I420。在绘制时,可以根据数据格式来判断是否需要旋转图像展示。2.ffmpeg 转h264裸流解码问题从iOS8开始,苹果开放了VideoToolBox,使得应用程序拥有了硬解码h264格式的能力。具体的实现与分析,可以参考《iOS-H264 硬解码》这篇文章。因为设计同学给到的是一个mp4文件,所以首先需要先把mp4转为H264的裸码流,再做解码。这里我使用ffmpeg来做转换:ffmpeg -i test.mp4 -codec copy -bsf: h264_mp4toannexb -s 960540 -f h264 output.264其中,annexb就是h264裸码流Elementary Stream的格式。对于Elementary Stream,sps跟pps并没有单独的包,而是附加在I帧前面,一般长这样:00 00 00 01 sps 00 00 00 01 pps 00 00 00 01 I 帧VideoToolBox的硬解码一般通过以下几个步骤:1. 读取视频流2. 找出sps,pps的信息,创建CMVideoFormatDescriptionRef,传入下一步作为参数3. VTDecompressionSessionCreate:创建解码会话4. VTDecompressionSessionDecodeFrame:解码一个视频帧5. VTDecompressionSessionInvalidate:释放解码会话但是对上面转换后的裸码流解码,发现总是会遇到解不出来数据的问题。分析转换后的文件发现,转换后的格式并不是纯码流,而被ffmpeg加入了一些无关的信息:但是也不是没有办法,可以使用这个工具H264Naked来找出二进制文件中的这一段数据一并删掉。再尝试,发现依然播放不了,原因是在上面的第3步解码会话创建失败了,错误码OSStatus = -5。很坑的是,这个错误码在OSStatus.com中无法查到对应的错误信息,通过对比好坏两个文件的差异发现,解码失败的文件中,pps 前面的 startcode并不是3个0开头的,而是这样子00 00 00 01 sps 00 00 01 pps 00 00 00 01 I 帧但是实际上,通过查看h264的官方文档,发现两种形式都是正确的而我只考虑了第一种情况,却忽略了第二种,导致解出来的pps数据错了。通过手动插入一个00,或者解码器兼容这种情况,都可以解决这个问题。但是同时也看出,这种方式很不直观。所以也就引入了下面的第二种方法。3. AVAssetReader 解码视频使用AVAssetReader解码出yuv比较简单,下面直接贴出代码: AVURLAsset asset = [AVURLAsset URLAssetWithURL:[[NSURL alloc] initFileURLWithPath:path] options:nil]; NSError error; AVAssetReader reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; NSArray videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; AVAssetTrack videoTrack = [videoTracks objectAtIndex:0]; int m_pixelFormatType = kCVPixelFormatType_420YpCbCr8Planar; NSDictionary options = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt: (int)m_pixelFormatType] forKey:(id)kCVPixelBufferPixelFormatTypeKey]; AVAssetReaderTrackOutput videoReaderOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack outputSettings:options]; [reader addOutput:videoReaderOutput]; [reader startReading]; // 读取视频每一个buffer转换成CGImageRef dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ while ([reader status] == AVAssetReaderStatusReading && videoTrack.nominalFrameRate > 0) { CMSampleBufferRef sampleBuff = [videoReaderOutput copyNextSampleBuffer]; // 对sampleBuff 做点什么 });这里只说遇到的坑,有的mp4视频解码后绘制时会有一个迷之绿条,就像下面这个图这是为什么,代码实现如下所示,我们先取出y分量的数据,再取出uv分量的数据,看起来没有问题,但是这实际上却不是我们的视频格式对应的数据存储方式。// 首先把Samplebuff转成cvBufferRef, cvBufferRef中存储了像素缓冲区的数据CVImageBufferRef cvBufferRef = CMSampleBufferGetImageBuffer(sampleBuff);// 锁定地址,这样才能之后从主存访问到数据CVPixelBufferLockBaseAddress(cvBufferRef, kCVPixelBufferLock_ReadOnly);// 获取y分量的数据unsigned char y_frame = (unsigned char)CVPixelBufferGetBaseAddressOfPlane(cvBufferRef, 0);// 获取uv分量的数据unsigned char uv_frame = (unsigned char)CVPixelBufferGetBaseAddressOfPlane(cvBufferRef, 1);这份代码cvBufferRef中存储数据格式应该是:typedef struct CVPlanarPixelBufferInfo_YCbCrPlanar CVPlanarPixelBufferInfo_YCbCrPlanar;struct CVPlanarPixelBufferInfo_YCbCrBiPlanar { CVPlanarComponentInfo componentInfoY; CVPlanarComponentInfo componentInfoCbCr;};然而第一份代码中,使用的pixelFormatType是kCVPixelFormatType_420YpCbCr8Planar,存储的数据格式却是:typedef struct CVPlanarPixelBufferInfo CVPlanarPixelBufferInfo;struct CVPlanarPixelBufferInfo_YCbCrPlanar { CVPlanarComponentInfo componentInfoY; CVPlanarComponentInfo componentInfoCb; CVPlanarComponentInfo componentInfoCr;};也就是说,这里应该把yuv按照三个分量来解码,而不是两个分量。 实现正确的解码方式,成功消除了绿条。至此,遇到的坑就都踩完了,效果也不错。最后,希望这篇文章能够对你有所帮助,在直播开发上,少走点弯路相关阅读欲练JS,必先攻CSS交互微动效设计指南【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识 ...

October 17, 2018 · 2 min · jiezi