精华内容
下载资源
问答
  • 给大家推荐跨平台全开源IM--野火IM

    千次阅读 2019-03-29 09:44:54
    野火IM是连接能力 野火IM不是一个聊天应用,而是一套由后端+客户端SDK组成的通讯组件,是种连接能力,野火IM提供的应用只是一个用来演示SDK能力的Demo。 就像腾讯的Slogan一样,野火IM能够连接一切。只不过腾讯的...

    野火IM是连接能力

    野火IM不是一个聊天应用,而是一套由后端+客户端SDK组成的通讯组件,是种连接能力,野火IM提供的应用只是一个用来演示SDK能力的Demo。

    就像腾讯的Slogan一样,野火IM能够连接一切。只不过腾讯的连接一切是指他可以连接一起,而野火IM的连接一切是指客户可以用野火IM的SDK来连接一起。基于连接就能够做很多事情

    野火IM能做什么

    1. 社交软件 首先通用型社交软件必死,没有人能干得过微信。可以在一些专业细分领域,搭配着专业需求来做。比如在音乐行业,在影视行业,游戏,体育等,尽量避免开BAT。

    2. 应用内社交 首先你已经有个应用了,可能是卖车的,可能搞旅游的,也可能是搞教育的。你肯定不希望你的客户在微信上聊天,而是把他们留在应用内,这时你就可以把SDK集成进您的app,然后就有单聊和群聊的能力。

    3. 客服 客服需求量很大,小一点的公司,可以直接用我们的im做客服,客户直接连到售后那里,大一点的就需要一些客服逻辑了,比如坐席分配流转之类。也希望能有人基于我们IM开发出客服系统,服务与社会。

    4. 监控通话系统 玩一玩的话,可以使用旧手机装上我们的im,然后稍微改一下,视频电话打过来自动接听,这样当你上班时,你就随时拿起手机看看你家里的小猫小狗在干什么。要是做成产业的话也可以,市面上有不少了,比如小鱼在家之类的。

    5. 门禁系统 门禁机是一个安卓系统,业主手机装上软件,就可以开门,看楼下状况

    6. 遥控小车 安卓的小车淘宝上很多,用手机装上IM,给小车发指令。商业话的话就是特种车辆,在危险的地方拍摄情况,运送物质,比如在爆炸现场,在地下坑道,甚至水下,没有4G和无线就拖跟网线。

    7. v2ex网友发明的跟奶奶聊天工具 他受限于微信的封闭(微信可以连接一切,你不能通过微信连接一切),使用我们的sdk问题迎刃而解。可以做成这样,手机后台一直录音,然后奶奶喊一声“乖孙子”,然后给奶奶提示开始录音,等奶奶说完,把语音消息发出去,奶奶收到消息直接播放。商业上对应特殊人群的沟通需求这一细分的领域

    8. 对讲功能 可以做一个弱一点的对讲机,录音后作为语音消息发出去,收到方直接播放。

    9. 物联网 你需要一个网关(目前只有android和java的SDK,C语言版本的后面也会出)来连接你的设备,然后手机和网关通过IM连接,这样你可以远程控制您的物联网设备。

    10. 企业通讯 现在通讯都被微信和钉钉垄断,太多企业不愿意暴露信息给他们,很多企业都在使用私有部署的企业通讯软件,基于我们的通讯组件,可以打造一款企业级通讯软件,避免信息泄漏的可能。

    11. 私密沟通 看这个京东众筹的私信通,已经卖出了4千万。搞个树莓派或者刷了linux的电视盒子,就可以做一个通讯服务器,硬件成本就是个树莓派或者盒子钱,如果有ipv6可以直接连,不然想办法远程中转把。

    野火有什么特点

    野火IM使用了微信Mars连接库,序列化使用protobuf,协议使用MQTT修改的私有协议,借鉴了微软ActiveSync的思路。做到不丢消息,不重复,完美地支持多端。另外针对安全性做了仔细的设计,链路层全程加密,本地数据库加密。提供了UI库,大大减少开发者的工作量。更详细的内容,请参考文档

    野火IM怎么用

    上述应用场景任何一个云通讯都能实现,不仅限与野火IM。但现在云通讯都太贵了,而且代码开源远远不够,灵活性不足,一旦破产跑路,将会造成很大的损失。野火IM在github开源(传送门),你可以依赖野火IM官方的开发,也可以自己进行迭代更新。

    不要专注于我们提供的应用上,使用SDK你将拥有无限的想象空间。开发很辛苦,请点赞支持我们坚持下去。

    另外附加一个野火IM demo应用的gif图

    展开全文
  • 野火IM解决方案 野火IM是一套跨平台,核心功能开源的即时通讯解决方案,主要包含以下内容。 仓库 说明 备注 野火IM Android SDK原始码和应用原始码 可以很方便地进行二次开发,或集成到现有应用当中 野火IM iOS SDK...
  • 野火IM解决方案 升级注意 v0.8.0版本,对代码结构及部分实现机制进行的调整调整,移动如下: 将chat应用模块拆分为两部分: uikit库模块和chat 。应用模块uikit可以库的方式导入项目,里面包含了大量可重用的UI。 可...
  • 跨平台、全开源的野火IM解决方案的iOS部分,是一个完整的IM。.zip,开源的即时通讯(野火IM)系统 高仿微信
  • 野火IM的启动页开始读起,对于疑惑的代码行,通过查阅资料,把相应的重点写成注释放在代码行上。SplashActivity代码如下。 /* * Copyright (c) 2020 WildFireChat. All rights reserved. */ package ...

    从野火IM的启动页开始读起,对于疑惑的代码行,通过查阅资料,把相应的重点写成注释放在代码行上。野火IM项目源码地址。SplashActivity代码如下。

    /*
     * Copyright (c) 2020 WildFireChat. All rights reserved.
     */
    
    package cn.wildfire.chat.app.main;
    
    import android.Manifest;
    import android.annotation.TargetApi;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.pm.PackageManager;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Handler;
    import android.provider.Settings;
    import android.text.TextUtils;
    import android.view.View;
    import android.view.Window;
    import android.widget.Toast;
    
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityOptionsCompat;
    import androidx.core.content.ContextCompat;
    
    import butterknife.ButterKnife;
    import cn.wildfire.chat.app.login.SMSLoginActivity;
    import cn.wildfirechat.chat.R;
    
    import static cn.wildfire.chat.app.BaseApp.getContext;
    
    public class SplashActivity extends AppCompatActivity {
    
        private static String[] permissions = {
            // 获取手机状态(包括手机号码、IMEI、IMSI权限等
            Manifest.permission.READ_PHONE_STATE,
            // SD卡读写权限
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
        };
        private static final int REQUEST_CODE_DRAW_OVERLAY = 101;
    
        private SharedPreferences sharedPreferences;
        private String id;
        private String token;
    
        //为了使高版本API的代码在低版本SDK不报错
        @TargetApi(Build.VERSION_CODES.M)
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //getWindow() 返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄
            //说是实现转场动画,但是注释掉这句也没有影响
            getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
    
            setContentView(R.layout.activity_splash);
    
            //使用下面的语句之后就不用再使用findViewById()了 开源框架
            ButterKnife.bind(this);
    
            // 隐藏系统的导航栏、状态栏,即有个沉浸式体验,这个方法可以复用
            hideSystemUI();
    
            //将状态栏的颜色设置为白色
            setStatusBarColor(R.color.white);
    
            // SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。
            // 下面的getSharedPreferences方式是以Context.MODE_PRIVATE的方法打开config文件
            sharedPreferences = getSharedPreferences("config", Context.MODE_PRIVATE);
    
            // getString方法则是读取s,如果不存在则返回s1
            // 以下面的id读取为例,如果不存在id,则返回null
            id = sharedPreferences.getString("id", null);
            token = sharedPreferences.getString("token", null);
    
            // 没有授权则申请权限,授权了执行延时跳转页面
            if (checkPermission()) {
                // handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。
                new Handler().postDelayed(this::showNextScreen, 1000);
            } else {
                requestPermissions(permissions, 100);
            }
        }
    
        // 检查permissions中的权限是否被授权,如果都授权了则返回true,任何一个没被授权则返回false
        private boolean checkPermission() {
            boolean granted = true;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                for (String permission : permissions) {
                    granted = checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
                    if (!granted) {
                        break;
                    }
                }
            }
            return granted;
        }
    
        // 生命周期在申请权限结束之后
        // 如果得不到相应得权限,则结束应用
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            for (int grantResult : grantResults) {
                if (grantResult != PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "需要相关权限才能正常使用", Toast.LENGTH_LONG).show();
                    finish();
                    return;
                }
            }
            showNextScreen();
        }
    
        //requestCode是用来标识请求的来源
        //resultCode是用来标识返回的数据来自哪一个activity
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == REQUEST_CODE_DRAW_OVERLAY) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (!Settings.canDrawOverlays(this)) {
                        Toast.makeText(this, "授权失败", Toast.LENGTH_LONG).show();
                        finish();
                    } else {
                        showNextScreen();
                    }
                }
            } else {
                super.onActivityResult(requestCode, resultCode, data);
            }
        }
    
        // 如果从sharedPreferences中读取的id和token都不空,则跳转到Main界面
        // 如果其中有一个为空,则跳转到登录界面
        private void showNextScreen() {
            if (!TextUtils.isEmpty(id) && !TextUtils.isEmpty(token)) {
                showMain();
            } else {
                showLogin();
            }
        }
    
        private void showMain() {
            Intent intent = new Intent(this, MainActivity.class);
            // FLAG_ACTIVITY_CLEAR_TASK 任何用来放置该activity的已经存在的task里面的已经存在的activity先清空,然后该activity再在该task中启动
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            // 设置换场动画
            Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
                android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
            startActivity(intent, bundle);
            finish();
        }
    
        private void showLogin() {
            Intent intent;
            intent = new Intent(this, SMSLoginActivity.class);
            Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
                android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
            startActivity(intent, bundle);
            finish();
        }
    
        private void hideSystemUI() {
            // Set the IMMERSIVE flag.
            // Set the content to appear under the system bars so that the content
            // doesn't resize when the system bars hide and show.
            // decorView是window中的最顶层view,可以从window中通过getDecorView获取到decorView。
            // 通过decorView获取到程序显示的区域,包括标题栏,但不包括状态栏。间接可以计算状态栏高度。
            View mDecorView = getWindow().getDecorView();
            mDecorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                    | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                    | View.SYSTEM_UI_FLAG_IMMERSIVE);
        }
    
        protected void setStatusBarColor(int resId) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                getWindow().setStatusBarColor(ContextCompat.getColor(this, resId));
            }
        }
    }
    
    
    展开全文
  • 野火im 登录不上Google Maps shows the location of ongoing wildfires and its movement over time. If you live in an area prone to fires, you can use this feature to track the progress of any dangers that...
    野火im 登录不上

    野火im 登录不上

    google maps wildfires

    Google Maps shows the location of ongoing wildfires and its movement over time. If you live in an area prone to fires, you can use this feature to track the progress of any dangers that might be heading your way. Here’s how the feature works.

    Google Maps可以显示正在进行的野火的位置及其随时间的变化。 如果您居住在容易起火的区域,则可以使用此功能来跟踪可能会遇到的危险情况。 该功能的工作原理如下。

    The ability to view ongoing wildfires in Google Maps became available to users across the U.S. in August 2020. The data is provided by the National Oceanic and Atmospheric Administration’s GOES satellites and processed by Google. This feature can be incredibly useful if there’s a fire near you.

    2020年8月,美国各地的用户都可以使用 Google Maps查看正在进行的野火的功能。 数据由美国国家海洋和大气管理局的GOES卫星提供,并由Google处理。 如果您附近有火,此功能将非常有用。

    The easiest way to find out more about nearby wildfires is by Googling it. To do so, open the “Google” app on your iPhone, iPad, or Android device and search for an ongoing wildfire by name.

    了解附近野火的最简单方法是通过谷歌搜索。 为此,请在iPhoneiPadAndroid设备上打开“ Google”应用,然后按名称搜索正在进行的野火。

    google wildfire search

    You see news stories and other information about the wildfire. Scroll down to the “Affected Area” card with a map preview. Tap “See More on Google Maps.”

    您会看到有关野火的新闻报道和其他信息。 向下滚动到带有地图预览的“受影响区域”卡。 点击“在Google地图上查看更多”。

    google wildfires card

    If you’re using an Android device, you may be asked which app you’d like to open the link with. Select “Maps” and tap “Just Once.”

    如果您使用的是Android设备,则可能会询问您要使用哪个应用程序打开链接。 选择“地图”,然后点击“仅一次”。

    android open maps

    Alternatively, you can jump straight into the Google Maps app on your iPhone, iPad, or Android device. Once open, you can search for a specific fire or a town that has a nearby wildfire.

    或者,您可以直接在iPhoneiPadAndroid设备上跳入Google Maps应用。 打开后,您可以搜索特定的火灾或附近有野火的城镇。

    Google Maps will now open to show highlighted wildfire areas. The wildfires are outlined in red dashed lines. The movement of the wildfires is updated about once every hour. The last update time is shown on the info card. If you happen to be near the fire and want to let someone know where you are, there’s a button to share your location.

    Google地图现在将打开,以显示突出显示的野火区域。 野火以红色虚线概述。 野火的移动大约每小时更新一次。 最后更新时间显示在信息卡上。 如果您恰好在火炉旁并且想让别人知道您的位置,则可以使用一个按钮来分享您的位置。

    Google Maps with fire spots on Android and iPhone
    Left: Android | Right: iPhone
    左:Android | 右:iPhone

    Tap the information card to see news stories and get more information about the wildfire.

    点击信息卡可查看新闻报道,并获取有关野火的更多信息。

    Google Maps with stories pertaining to the fires
    Left: Android | Right: iPhone
    左:Android | 右:iPhone

    翻译自: https://www.howtogeek.com/686506/how-to-track-movement-of-wildfires-on-google-maps/

    野火im 登录不上

    展开全文
  • 野火IM项目源码地址 /* * Copyright (c) 2020 WildFireChat. All rights reserved. */ package cn.wildfire.chat.kit; import android.app.Activity; import android.content.pm.ActivityInfo; import android....

    没有工具栏的Activity基类,登录页继承了这个类。野火IM项目源码地址

    /*
     * Copyright (c) 2020 WildFireChat. All rights reserved.
     */
    
    package cn.wildfire.chat.kit;
    
    import android.app.Activity;
    import android.content.pm.ActivityInfo;
    import android.content.pm.PackageManager;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.View;
    import android.view.inputmethod.InputMethodManager;
    
    import androidx.annotation.LayoutRes;
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.content.ContextCompat;
    
    import butterknife.ButterKnife;
    
    //抽象类,按照类名解读即是没有标题栏的Activity
    public abstract class WfcBaseNoToolbarActivity extends AppCompatActivity {
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            //设置屏幕显示方向
            //SCREEN_ORIENTATION_PORTRAIT 竖直方向
            //SCREEN_ORIENTATION_LANDSCAPE 横屏方向
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    
            //设置的抽象方法,子类要去实现
            beforeViews();
            setContentView(contentLayout());
    
            //正如afterViews()注释所言,使用这句之后,子类中不需要再次绑定
            ButterKnife.bind(this);
    
            //设置的抽象方法,子类要去实现
            afterViews();
        }
    
        protected void hideInputMethod() {
            InputMethodManager imm = (InputMethodManager) this.getSystemService(Activity.INPUT_METHOD_SERVICE);
            //获取当前activity中获得焦点的view
            View view = getCurrentFocus();
    
            if (view != null) {
                // 华为的手机Toast提示是在软件盘的图层后面的,
                // 所以会遮挡各种Toast提示,
                // 而其他的手机Toast提示是在软键盘的Toast上面的
                // 这句就是适应华为手机,如果是在输入状态,则要收起软键盘才能看到Toast
                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            }
        }
    
        /**
         * @return 布局文件
         * 这个抽象方法必须返回一个布局文件
         */
        protected abstract @LayoutRes
        int contentLayout();
    
        /**
         * {@link AppCompatActivity#setContentView(int)}之前调用
         * @link 这种注释方法可以学学啊!!!能够直接跳转到相应的方法中
         */
        protected void beforeViews() {
    
        }
    
        /**
         * {@link AppCompatActivity#setContentView(int)}之后调用
         * <p>
         * 此时已经调用了{@link ButterKnife#bind(Activity)}, 子类里面不需要再次调用
         */
        protected void afterViews() {
    
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            // 至于为什么在onPause()中调用这个收起软键盘的操作就没有看懂了
            hideInputMethod();
        }
    
        public boolean checkPermission(String permission) {
            return checkPermission(new String[]{permission});
        }
    
        public boolean checkPermission(String[] permissions) {
            boolean granted = true;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                for (String permission : permissions) {
                    granted = checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
                    if (!granted) {
                        break;
                    }
                }
            }
            return granted;
        }
    
        /**
         * Changes the System Bar Theme.
         */
        public static void setStatusBarTheme(final Activity pActivity, final boolean pIsDark) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                // Fetch the current flags.
                final int lFlags = pActivity.getWindow().getDecorView().getSystemUiVisibility();
                // Update the SystemUiVisibility dependening on whether we want a Light or Dark theme.
                pActivity.getWindow().getDecorView().setSystemUiVisibility(pIsDark ? (lFlags & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) : (lFlags | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR));
            }
        }
    
        /**
         * 设置状态栏的颜色
         *
         * @param resId 颜色资源id
         */
        protected void setStatusBarColor(int resId) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                getWindow().setStatusBarColor(ContextCompat.getColor(this, resId));
            }
        }
    }
    
    
    展开全文
  • // 观察者模式观察是否连接IM服务器 IMServiceStatusViewModel imServiceStatusViewModel = ViewModelProviders.of(this).get(IMServiceStatusViewModel.class); imServiceStatusViewModel.imServiceStatusLiveData...
  • 野火IM项目源码地址 /* * Copyright (c) 2020 WildFireChat. All rights reserved. */ package cn.wildfire.chat.app.login; import android.content.Context; import android.content.Intent; import android....
  • 野火IM改MYSQL的一些坑

    2019-12-08 12:07:55
    1时区:设置服务器时区就可以了 2报Specified key was too long; max key length is 767 bytes 按此链接修复:... 关键点是最后一句:修改建表语句:文件 V2_create_table.sql 创建`t_user_sessio...
  • 野火IM解决方案 野火IM是一套跨平台、核心功能开源的即时通讯解决方案,主要包含以下内容。 仓库 说明 备注 野火IM Android SDK源码和App源码 可以很方便地进行二次开发,或集成到现有应用当中 野火IM iOS SDK源码和...
  • 野火IM解决方案 野火IM是一套跨平台,核心功能开源的即时通讯解决方案,主要包含以下内容。 仓库 说明 备注 野火IM Android SDK原始码和应用原始码 可以很方便地进行二次开发,或集成到现有应用当中 野火IM iOS SDK...
  • 野火IM解决方案 野火IM是一套跨平台、核心功能开源的即时通讯解决方案,主要包含以下内容。 仓库 说明 备注 野火IM Android SDK源码和App源码 可以很方便地进行二次开发,或集成到现有应用当中 野火IM iOS SDK源码和...
  • 全开源即时通讯(IM)系统 高仿微信

    万次阅读 多人点赞 2019-05-31 17:15:56
    android-chat 项目地址:wildfirechat/android-chat ...野火 IM 是一套跨平台、全开源的即时通讯解决方案,主要包含以下内容。 仓库 说明 备注 android-chat 野火 IM Android SDK 源码和 App 源码 ...
  • 野火IM机器人应用 作为野火IM机器人应用的演示,本工程仅演示机器人应用的接口。其中用到图灵的免费版。 编译 mvn package 图灵 本应用使用了,需要申请到atuling_key,并配置到robot.properties中去。用户也可以...
  • 野火IM是一套开源通用的即时通讯组件,能够更加容易地赋予客户IM能力,使客户可以快速的在自有产品上添加聊天功能。使用野火可以替代云通讯产品或减少自研IM的工作量。降低客户使用IM的成本和难度。 下载地址: ...
  • 野火IM解决方案野火IM是一套跨平台、全开源的即时通讯解决方案,主要包含以下内容。仓库说明备注android-chatAndroid平台的SDK和Demoios-chatiOS平台的SDK和Demopc-chat基于Electron开发的PC平台Demoproto野火IM的...
  • im-app_server-源码

    2021-04-01 23:49:15
    野火IM首次应用 作为野火IM的预设应用的演示,本工程具有如下功能: 短信登陆和注册功能,用于演示登陆应用,获取令牌的场景。 PC端扫码登录的功能。 群公告的获取和更新功能。 客户端上传日志功能。 本工程为Demo...
  • 开源免费的IM,功能和UI符合国内习惯,比XMPP具有更适合移动端的协议,可以作为IM组件代替环信、融云、网易云信等云通讯和XMPP.zip,开源即时通讯(野火IM)系统Android端 高仿微信
  • 野火Minio是基于最流行的开源对象存储服务进行二次开发的,二次开发的内容仅涉及到与野火IM的对接。因此野火Minio可以按照原生Minio的使用和运维。但也有一些细微细节不同。首次部署需要进行配置,以后可以正常启动...
  • 文章来源:...概述 Jabber(XMPP-Extensible Messaging and Presence Protocol)协议,是一个开源的即时消息协议,建立在jabber协议上的IM客户端可以互连。关于XMPP的两个官方网http://www.xmpp.org/和http:/
  • 【原创】史上最全开源IM盘点

    千次阅读 2020-12-05 14:33:12
    后有最近很活跃的WildfireChat(野火IM),发展迅猛,短短时间,star就突破了2K。 国外的如基于js的RocketChat,star达到惊人的29K;没有服务端却格外强调安全和隐私的telegram等。还有其他十多个强调服务端或者仅有...
  • 通过集成第三方IM实现聊天应用

    千次阅读 2020-07-13 20:22:19
    在项目场景中有一个移动门户的APP,除了提供门户功能外,还有用户之间能够聊天交流的需求。...a)野火IM 指标 描述 功能性 单聊,群聊,敏感词检测(需自己增加)和第三方推送集成。 机器...
  • 野火IM Flutter插件。 运行 进入到项目工程目录下,依次执行预定命令: flutter packages get cd example/ios/ && pod install (仅iOS平台需要) flutter run 集成到flutter应用 在项目的pubspec.yaml文件依赖...
  • 野火-源码

    2021-02-18 11:17:11
    野火

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 198
精华内容 79
关键字:

野火im