javavoip推送的简单介绍

博主:adminadmin 2022-11-22 14:47:08 64

本篇文章给大家谈谈javavoip推送,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

怎样打开VOIP与SIP

打开SIP功能的方法,适用于JB2,JB3,JB5:

请在alps\mediatek\config\product_nam\ProjectConfig.mk中,将MTK_SIP_SUPPORT置为yes即可

打开SIP功能的方法,适用于JB2之前的版本:

1. 在文件alps\mediatek\config\product_name\android.software.sip.voip.xml中添加如下代码

permissions

feature name="android.software.sip" /

feature name="android.software.sip.voip" /

/permissions

2. 在文件alps\mediatek\config\product_name\android.software.sip.xml

permissions

feature name="android.software.sip" /

/permissions

允许SIP使用GPRS,仅针对GB, GB2,GB3:

在文件alps\frameworks\base\core\res\res\values\Config.xml中将

bool name="config_sip_wifi_only"true/bool

修改为

bool name="config_sip_wifi_only"false/bool

注:JB2,JB3,JB5版本中SIP call功能与OP02互斥,不可以同时开启。

原因是由于运营商的某些原因不允许开启Sip功能。

如希望同时使用,可以修改mk去除互斥条件:

/alps/mediatek/build/addon/core/android_dep_rule.mak中去掉以下内容

############################################################

ifneq ($(filter OP02%, $(OPTR_SPEC_SEG_DEF)),)

ifeq ($(strip $(MTK_SIP_SUPPORT)),yes)

$(call dep-err-common, Please do not set OPTR_SPEC_SEG_DEF as OP02* or set MTK_SIP_SUPPORT as no)

endif

endif

1、VOIP基于SIP协议,SDK2.3包含一个SIP协议栈和框架API

2、VOIP位于android.net.sip包中,最重要的为SipManager类,可开发基于SIP的VOIP应用。使用时要包含android.permission.INTERNET和android.permission.USE_SIP权限

3、如果在market中显示仅支持VOIP API幸好的手机的话,发布时需要在androidManifest.xml中加入uses_feature android:name = "android.software.sip" android:required = "true"和uses_feature android:name = "android.software.sip.voip"

4、要支持SIP API

(1)仅Android2.3或更高版本平台支持

(2)不是所有设备都提供SIP支持,确保你的APP只安装在支持SIP的装置上

5、根据GOOGLE官方DEMO项目来扩展的概念

二、类及方法描述

1、一个基本的VOIP项目至少需要三个类SIPSettings(对SIP的基本设置身份验证)、WalkieTalkieActivity(登录到SIP设备供应商,注册device去处理来电,拨打电话,在通话过程中用户界面管理)、IncomingCallReceiver(监听传入的SIP电话,然后传递这些SIP电话给WalkieTalkieActivity控制)

2、

WalkieTalkieActivity

A、SipManager.newInstance()--此方法中首先判断context是否支持SIP API,若支持则new SipManager。SipManager构造函数中,实例化了一个ISIPService(运用的公式:

IBinder b =ServiceManager.getService(Context.SIP_SERVICE); //获取系统相应的服务

ISipService service = ISipService.Stub.asInterface(bIBinder);)

上面这两句代码其实是使用了AIDL,就以SipService为例,步骤如下

Service端

1、编写aidl文件:ISipService.aidl,并定义使用的接口(就等同于interface一样)

2、使用makefile生成与之同名的JAVA文件,SipService.java,此类继承extends ISipService.Stub并实现接口定义的方法或者在SipService extends Service,并代码中加入

ISipService.stub sipImpl = new ISipService.stub(){

//实现其接口方法,在SipService.java中是实现了一个名为start()的方法,里面有句是ServiceManager.addService("sip",newSipService(context));表示SipService已经交给ServiceManager统一管理了

}

Client端

一(以SIPService为例)

1、而在需要用到SipService时,也就是我们构造SipManager的时候,就通过ServiceManager.getService(Context.SIP_SERVICE)获得SIP的服务(类型为IBinder)

2、并调用 ISipService.Stub.asInterface(IBinder);去获取一个SipService实例(前提是该Service一定是通过ServiceManager.addService的方式添加进去管理的,这样才能找到此Service)

二(以普通Activity为例)

1、利用Intent intent = new Intent(Activity.this,SipService.class);--bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);来绑定SERVICE,在serviceConnection的onServiceConnected方法中,使用IService.stub.asIntentface(IBinder);来获取实例

B、SipManager创建好后,先从SharedPreference中获取username,domain及pwd,如果第一次进来没有设置这些的话则需要先创建账户,这里用EditTextPreference来保存用户信息,好处是当填写信息并返回后,EditTextPreference会自动将值放入SharedPreference中。我们假设username="woody";domain="192.168.12.30";pwd="910913"

C、这时,我们的SipManager以及用户信息已经设定好了,接下来使用了这句SipProfile.Builder builder = new

SipProfile.Builder(username, domain);我们去看看SipProfile.Builder中做了些什么:

SipURI mUri =mAddressFactory.createSipURI(username,serverDomain);

SipProfile mProfile.mDomain=serverDomain; //设置domain

(在mAddressFactory.createSipURl方法中,我选取了一些核心代码)

StringBuffer uriString=new StringBuffer("sip:");

uriString.append(user);

uriString.append("@");

//if host is an IPv6 string we should enclose it in sq brackets

if(host.indexOf(':') !=host.lastIndexOf(':')host.trim().charAt(0) !='[')

host='['+host+']';

uriString.append(host);

StringMsgParser smp=new StringMsgParser();

SipUrl sipUri=smp.parseSIPUrl(uriString.toString());

return sipUri;

从以上代码可以看出其实就是在Format SipURL罢了,里面多加了个if host为IPV6的判断(IPv4为为32位,十进制;IPv6为128位,16进制)。urlString最后为"sip:woody@192.168.12.30",smp.parseSIPUrl()方法中,有关于是如何parse的就不做阐述了,总之最后返回了一个SipUri

D、接下来就是SipProfile sipProfile = SipProfile.Builder.build(); //返回一个SipProfile object

在SipProfile.Builder.build()中,设置了sipProfile的pwd值,删除了之前SipUrl对象里的

password(mUri.setUserPassword(null);)、将sipProfile的address属性设置为AddressImpl类型的对象值、调用AddressFactory.createURI返回一个SipUri,并sipProfile.mProxyAddress=sipUri.getHost();

E、创建PendingIntent对象:(Intent与PendingIntent区别在于Intent是及时启动,而PendingIntent是不立刻反应,在特定的情况或通知下才启动,适用于AlertClock等)

Intent i = new Intent();

i.setAction("android.SipDemo.INCOMING_CALL");

PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);

F、

SipManager.open(sipProfile,PendingIntent,null); //(实际是SIPService在做操作)设置localSIPProfile的callingID--建立SIP连接(算是注册至SIP Server)--打开receiveCall

其中建立SIP连接,最后能追溯到是在SipSessionGroup.java的reset()方法中通过是注册服务器实现的,

注册服务器的步骤为:

(1)设置服务器的属性,例如服务器的地址(IP_ADDRESS_PROP)、栈名(javax.sip.STACK_NAME)、发出去的路径(localProfile中的javax.sip.OUTBOUND_PROXY)、线程池的大小(gov.nist.javax.sip.THREAD_POOL_SIZE)等,并且将这些属性加载到服务器中.

(2)通过SipFactory的静态方法取得一个实例,然后通过SipFactory实例sipfactory

(3)创建一个SipStack实例sipstack(这一步获得IP_ADDRESS_PROP,String address = Properties.getProperty("javax.sip.IP_ADDRESS");)

(4)用sipstack创建一个SipProvider实例sipProvider

(5)注册SipListener

G、A~F步骤都是在做准备工作,大致的步骤如下:new SIPService--new SIPManager--设定用户信息--new SIPURI--new SIPProfile--new PendingIntent--set sipProfile callingID--(if profile.getAutoRegistation)open toReceiveCalls--register SipService

现在是call someone~呼叫的工作是SipAudioCall类来完成(可用sipManager.makeAudioCall或takeAudioCall来实例化,SipAudioCall.startAudio时需要 RECORD_AUDIO, ACCESS_WIFI_STATE, and WAKE_LOCK permissions,

化,SipAudioCall.startAudio时需要 RECORD_AUDIO, ACCESS_WIFI_STATE, and WAKE_LOCK permissions,setSpeakerMode() 时需要MODIFY_AUDIO_SETTINGS permission)

【1】当需要呼叫时,使用sipManager.makeAudioCall(String localProfileURI, String peerProfileURI, SipAudioCall.listener,int timeout);来创建一个SipAudioCall,其中timeout以seconds为单位,过了timeout表示打电话超时。需要打给别人时使用makeAudioCall创建,接听电话用takeAudioCall来创建sipAudioCall

【2】SipAudioCall中有一个嵌套的class:SipAudioCall.Listener(此类主要用于监听SIP CALL,when[呼叫电话 or 接听电话])

SipAudioCall.Listener listener = new SipAudioCall.Listener() {

@Override

public void onCallEstablished(SipAudioCall call) { //呼叫建立

call.startAudio(); //启动音频

call.setSpeakerMode(true); //调整为可讲话模式

call.toggleMute(); //触发无声

updateStatus(call);

}

};

SipAudioCall call = manager.makeAudioCall(me.getUriString(), sipAddress, listener, 30);

(以上例子为makeAudioCall)

【3】我们看看makeAudioCall()方法(makeAudioCall requires 2 sipProfile):

SipAudioCall call =new SipAudioCall(mContext, localProfile);

call.setListener(listener); //这两句很简单就是创建一个local的sipAudioCall

SipSession s = createSipSession(localProfile, null); --mSipService.createSession(localProfile, null);// sipService来创建session,并保存在SipSessionGroupExt中

call.makeCall(peerProfile,s,null); //这句就是呼叫,最后追溯到实际是SipSession.makecall

总结:在发起通话中

首先是创建SipAudioCall.listener,以便监听对话建立和对话结束,然后做相应的操作

然后是SipManager.makeAudioCall(localAdd,llistener,XXXX),在makeAudioCall方法中

A、创建一个sipAudioCall(localProfile)

B、创建SipSession以建立起会话

C、SipSession.makeCall(peerProfile,XXXX); //SipSession呼叫远程profile

【4】关于接电话道理都差不多,takeAudioCall

通过之前设置的callingID来查找mSipService.getPendingSession(callId);来获得SipSession。并创建SipAudioCall,然后attachCall就算接受电话了

VOIP 实现微信长震动+铃声

实现微信长震动只能在Xcode10版本中实现. 在新版本Xcode11上至于后台或杀死报错,

报错reason: 'PushKit apps that use VoIP push must link either CallKit or IncomingCallNotifications frameworks.'

需要实现callkit , 苹果官方提供的语音通话库. 但是在大陆审核好像不通过.

如果需要 Xcode 11降为 Xcode 10 , 可以看我的另一篇文章.

//导入pushkit库

#import PushKit/PushKit.h

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {

    //注册VOIP

    PKPushRegistry *voipRegistry = [[PKPushRegistry alloc] initWithQueue:nil];

    voipRegistry.delegate=self;

    voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

}

//实现 PKPushRegistryDelegate 协议

//绑定 VoIP Token

- (void)pushRegistry:(PKPushRegistry*)registry didUpdatePushCredentials:(PKPushCredentials*)credentials forType:(NSString*)type {

    //向服务器注册 VoipToken 为了方便开发者,建议使用新方法

    NSString *voipToken = [[[[credentials.token description] stringByReplacingOccurrencesOfString: @"" withString: @""]

                            stringByReplacingOccurrencesOfString: @"" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @""];

}

    //接收 VoIP 推送处理具体业务逻辑

- (void)pushRegistry:(PKPushRegistry*)registry didReceiveIncomingPushWithPayload:(PKPushPayload*)payload forType:(NSString*)type {

    // TODO:接收 VoIP 推送中的 Payload 信息进行业务处理。

    NSLog(@"[VoIP Payload]:%@,%@", payload, payload.dictionaryPayload);

    NSDictionary*apnsDic = payload.dictionaryPayload[@"aps"];

// 长震动+铃声 (手机静音状态下不能实现,建议使用下面方法)

//    SystemSoundID sound;

//    NSString *path = [[NSBundle mainBundle] pathForResource:@"pushSoundCall" ofType:@"caf"];

//    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], sound);

//    AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, vibrationCallback, NULL);

//    AudioServicesAddSystemSoundCompletion(sound, NULL, NULL, soundCallback, NULL);

//    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

//    AudioServicesPlaySystemSound(sound);

//长震动 + 铃声(以本地推送添加铃声文件方法实现, 铃声长度30s内), (手机静音状态下无音,但是震动存在)

    AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, vibrationCallback, NULL);

    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

//本地推送

    [self VOIPCustomUNNotification:apnsDic];

}

- (SystemSoundID)getSystemSoundID {

    SystemSoundID sound;

    NSString *path = [[NSBundle mainBundle] pathForResource:@"pushSoundCall" ofType:@"caf"];

    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], sound);

    returnsound;

}

///开始震动

- (void)startVibrator {

    AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, soundCallback, NULL);

    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

}

///结束震动

- (void)stopVibrator {

    SystemSoundIDsound = [selfgetSystemSoundID];

    AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);

    AudioServicesRemoveSystemSoundCompletion(sound);

    AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate);

    AudioServicesDisposeSystemSoundID(sound);

}

///循环结束震动

voidsoundCallback(SystemSoundIDsound,void* clientData) {

    AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);

    AudioServicesRemoveSystemSoundCompletion(sound);

    AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate);

    AudioServicesDisposeSystemSoundID(sound);

}

//震动完成回调,因为震动一下便会调用一次,这里延迟800ms再继续震动,和微信差不多,时间长短可自己控制。参数sound即为注册回调时传的第一个参数

voidvibrationCallback(SystemSoundIDsound,void* clientData) {

//    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(800 * NSEC_PER_MSEC)), dispatch_get_global_queue(0, 0), ^{

    //        AudioServicesPlaySystemSound(sound);

    //    });

    AudioServicesPlaySystemSound(sound);

}

- (void)VOIPCustomUNNotification:(NSDictionary*)apnsDic {

    [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:UNAuthorizationOptionBadge|UNAuthorizationOptionSound|UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error){

        if(granted) {

            UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc]init];

            content.title= apnsDic[@"alert"];

            content.subtitle= [NSStringstringWithFormat:@"%@", apnsDic];

            content.body=@"body";

            //铃声放在这里.手机静音状态下无音(不可避免).铃声长度30s内

            content.sound=[UNNotificationSound soundNamed:@"pushSoundCall.caf"];

            UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.01 repeats:NO];

            UNNotificationRequest*request = [UNNotificationRequestrequestWithIdentifier:@"messageId"content:contenttrigger:trigger];

            [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {

                if(!error) {

                }

            }];

        }

    }];

}

iOS Voip通知处理

     相信大家常用的都是apns通知,大部分也是集成极光的SDK进行处理,除了软电话以及即时通讯类的APP大家也很少接触Voip通知。在这里就给大家讲一下,一个小白,从了解到完成Voip的过程。

    首先Voip通知会在收到通知的时候后台唤醒我们要接收通知的APP,但APNS不会,在Voip唤醒APP后我们就可以做出相应的操作。比如震动,声音,以及其他等等操作。

    Voip通知需要大家引入PushKit/PushKit.h库,需要在BuildPhase - Link Binary Witn Libraries 中倒入PushKit以及callKit库,如果没有即时通讯功能引入callKit库容易被拒哦。

    证书在这就不给大家多说了,进入开发者后台,点击证书选项很容易就能找到Voip证书。

给大家看一下实现吧

    1、初始化

    2、三个代理方法

        (1)APP启动时通过此代理方法,获取VoipToken以及推送方式Type

  - ( void )pushRegistry:(PKPushRegistry*)registrydidUpdatePushCredentials:(PKPushCredentials*)pushCredentialsforType:(PKPushType)type

           (2) 收到消息后的代理方法 (收到的通知内容都在 payload 参数内,在这个方法里,大家可以做一些收到通知后的内容)

- ( void )pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:( void (^)( void ))completion

          (3)过期token的类型

- ( void )pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(PKPushType)type

如果童鞋们的服务端没有处理过Voip也无从下手的话,可以把下面这篇文章发给他们看哦。

说一下坑,就是处理VoipToken,因为它是data类型,而服务端要的是string类型,所以要进行转换,找了很多方法,最后的方法是这样的,希望大家不要像我一样再次踩坑。

NSMutableString *str = [NSMutableString string];

    const char *bytes = pushCredentials.token.bytes;

    for ( int i =0; i pushCredentials.token.length; i++) {

        [strappendFormat:@"%02x",bytes[i]0x000000FF];

    }

java sip打电话实现,如何判断用户不说话

基于sip的voip网络通话基本过程是:(1),建立sip服务器,关于如何搭建sip服务器,请参考我的博客点击打开链接 (2)需要参与通话的所有客户端注册用户到sip服务器(3)一个客户端发起sip通话到另一个客户端,这个消息首先发到sip服务器,sip服务器收到消息后转发到目的客户端(4)目的客户端接收电话.

uses-permission android:name="android.permission.USE_SIP" /

uses-permission android:name="android.permission.INTERNET" /

uses-permission android:name="android.permission.VIBRATE" /

uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /

uses-permission android:name="android.permission.WAKE_LOCK" /

uses-permission android:name="android.permission.RECORD_AUDIO" /

uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /

uses-feature android:name="android.hardware.sip.voip" android:required="true" /

uses-feature android:name="android.hardware.wifi" android:required="true" /

uses-feature android:name="android.hardware.microphone" android:required="true" /

版权声明:本文为博主原创文章,转载请附上博文链接!

通过Java或者C++程序,实现自动拨打电话和语音提示功能,中间需要什么语音硬件设备。。。

您首先需要PBX服务器,可以是硬件也可以是软件。

硬件可用各种程控电话交换机。

软件pbx可以参考asterisk、freepbx、freeiris、elastix、freeswitch等等……

这些软硬件设备基本都可以实现自动语音提示功能。有的还能够实现树状语音菜单(IVR)、自动来电排队(ACD)和录音。

PBX服务器有了,那么外呼单元可以采用板卡+电话线也可以采用VOIP。

板卡可以使用模拟卡:三汇、东进、维卡等等……电话线需要您自己向电话局申请。

VOIP方式您可以找找运营商,付费以后给您开通一个VOIP帐号(通常是SIP协议),然后会给您一个IP、端口、用户名、密码。这样您就可以用软件pbx服务器注册到VOIP运营商的服务器外呼了。

iOS VOIP实现语音播报、网络电话

。。。。。。。

。。。。。。。

  ios voip 推送---案例  

 

   

 

  java 

  php 

验证.pem

。。。。。。。

注意⚠️ token 在 ahc 打包出来的是不一样的,切记

。1。。。。。。。。。。。。。。

如何生成.pem 证书 ,适用于PHP 。Java是.p12 证书

1、将之前生成的voip.cer SSL证书双击导入钥匙串

2、打开钥匙串访问,在证书中找到对应voip.cer生成的证书,右键导出并选择.p12格式,这里我们命名为voippush.p12,这里导出需要输入密码(随意输入,别忘记了)。

3、目前我们有两个文件,voip.cer SSL证书和voippush.p12私钥,新建文件夹命名为VoIP、并保存两个文件到VoIP文件夹。

4、把.cer的SSL证书转换为.pem文件,打开终端命令行cd到VoIP文件夹、执行以下命令

openssl x509 -in voip.cer  -inform der -out VoiPCert.pem

5、把.p12私钥转换成.pem文件,执行以下命令(这里需要输入之前导出设置的密码)

openssl pkcs12 -nocerts -out VoIPKey.pem -in voippush.p12

6、再把生成的两个.pem整合到一个.pem文件中

cat VoiPCert.pem VoIPKey.pem ck.pem

最终生成的ck.pem文件一般就是服务器用来推送的。

但是我惊奇的发现,不管是对于生产pem,还是测试pem,这两个网址都可以进行验证

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert ck.pem

openssl s_client -connect gateway.push.apple.com:2195 -cert apns-ck.pem

验证结果:

。2。。。。。。。。。。

后台使用的接口

开发接口:gateway.sandbox.push.apple.com:2195

发布接口:gateway.push.apple.com:2195

官网提供的是:

开发接口: api.development.push.apple.com:443

发布接口: api.push.apple.com:443

这两个接口都能使用一个是Socket连接的方式,一个是采用Http的方式

。3。。。。。。。。。。。

用终端命令行cd到我们的VoIP文件夹中(有5个证书),输入: php -f 文件名.php;

?php

$deviceToken = 'token'; //能通

//ck.pem密码

    $pass ='******';

    //消息内容

    $message ='收到金额0.12元,来自支付宝扫码支付';

    //数字

    $badge =1;

    $sound ='default';

    $body =array();

    $body['aps'] =array('alert'= $message);

    //把数组数据转换为json数据

    $payload = json_encode($body);

    echostrlen($payload),"\r\n";

    $ctx = stream_context_create([

                                 'ssl'= [

                                 'verify_peer'      = false,

                                 'verify_peer_name'= false

                                 // 'cafile'          = '/path/to/bundle/entrust_2048_ca.cer',

                                 ]

                                 ]);

    // $pem = dirname(__FILE__) .'/'.'ck.pem';

    stream_context_set_option($ctx,'ssl','local_cert','ck.pem');

    stream_context_set_option($ctx,'ssl','passphrase', $pass);

    // gateway.push.apple.com:2195 -- 正式环境

    // gateway.sandbox.push.apple.com:2195 -- 开发环境

    $fp = stream_socket_client('tls://gateway.push.apple.com:2195',$err,$errstr,60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

    if(!$fp) {

        print "Failed to connect $err $errstr\n";

        return;

    }

    else{

print "Connection OK\n

";

    }

    // send message

    $msg = chr(0).pack("n",32).pack('H*', str_replace(' ','', $deviceToken)).pack("n",strlen($payload)).$payload;

    print "Sending message :" . $payload . "\n";

    fwrite($fp, $msg);

    fclose($fp);

    /*

     35 Connection OK

     Sending message :{"aps":{"alert":"A test message!"}} 

    */

。补充。。。。。。。。。。。。。。

1、当app要上传App Store时,请在iTunes connect上传页面右下角备注中填写你用到VoIP推送的原因,附加上音视频呼叫用到VoIP推送功能的demo演示链接,演示demo必须提供呼出和呼入功能,demo我一般上传到优酷。

2、经过大量测试,VoIP当应用被杀死(双击划掉)并且黑屏大部分情况都能收到推送,很小的情况会收不到推送消息,经测试可能跟手机电量消耗还有信号强弱有关。 再强调一遍,测试稳定性请在生产环境测试。

3、如果不足和错误的地方,欢迎补充和改正,谢谢。

javavoip推送的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、javavoip推送的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-22,除非注明,否则均为首码项目网原创文章,转载请注明出处。