ios voip 推送

作者: 大龄程序员在帝都 | 来源:发表于2016-06-23 18:38 被阅读11773次
  1. 什么是voip推送和普通的ios推送有什么区别呢?
    普通推送分为:远程推送和本地推送,区别网上资料太多了,简单说一下,比如网易新闻,有什么大的新闻会在手机端接收到推送,这个就是远程推送,是把相关信息推送到苹果推送服务器-APNS,太简单了,不说了!

重点说下:voip的重点功能。
就是打视频或者语音电话的时候推送功能,一个典型的应用场景,A用户拨打B用户视频或者语音电话,A拨打,B铃声响起,此时A挂断,B铃声消失,就相当于控制对方手机一样。国外的语音视频电话都是采用voip push,比如whats app,line等语音视频通讯软件。

曾经有人说普通推送可以做到以上功能,我可以明确的给出回复:普通推送是无法做到的,必须用voip push才能做到。

注意事项:
1、证书的制作过程中也需要选中voip认证。

voip_cer.jpg

2、在xcode开发中也需要进行相关的设置,设置如下:

setting_xcode.png

3、引入开发包


push_kit.png

xcode端代码如下:

1、首先注册为voip推送:


-(void)registerVoipNotifications{
    
    PKPushRegistry * voipRegistry = [[PKPushRegistry alloc]initWithQueue:dispatch_get_main_queue()];

    voipRegistry.delegate = self;
    voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

    UIUserNotificationType types = (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert);
    
    UIUserNotificationSettings * notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];

    [[UIApplication sharedApplication]registerUserNotificationSettings:notificationSettings];
}

在应用初始化方法中调用:


 [self registerVoipNotifications];

2、获取token,用于发送到服务器端,服务器端发送推送消息时,会发送这个token到APNS服务器,APNS通过这个token定位到手机和对应的应用,进而推送消息。



- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{
    
    NSString *str = [NSString stringWithFormat:@"%@",credentials.token];
    NSString *_tokenStr = [[[str stringByReplacingOccurrencesOfString:@"<" withString:@""]
                            stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"device_token is %@" , _tokenStr);
}

3、下面是最重要的一步:就是对推送过来的消息进行解析,可以在推送的时候设置标记,下面的代码是获取到标志以后,根据标志命令调用不同的方法进行处理,进而实现功能,注意这里接收到消息定义时,如果传过来的命令是call就创建一个本地推送,提示某人正在呼叫你,如果传过来的命令为cancel,就取消命令



- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type{
    
    UIUserNotificationType theType = [UIApplication sharedApplication].currentUserNotificationSettings.types;
    
    if (theType == UIUserNotificationTypeNone)
    {
        UIUserNotificationSettings *userNotifySetting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:userNotifySetting];
    }
    
    NSDictionary * dic = payload.dictionaryPayload;
    
    NSLog(@"dic  %@",dic);
    
    if ([dic[@"cmd"] isEqualToString:@"call"]) {
        UILocalNotification *backgroudMsg = [[UILocalNotification alloc] init];
        backgroudMsg.alertBody= @"You receive a new call";
        backgroudMsg.soundName = @"ring.caf";
        backgroudMsg.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber] + 1;
        [[UIApplication sharedApplication] presentLocalNotificationNow:backgroudMsg];
    }else if(([dic[@"cmd"] isEqualToString:@"cancel"]){
        
        [[UIApplication sharedApplication] cancelAllLocalNotifications];
        
        UILocalNotification * wei = [[UILocalNotification alloc] init];
        wei.alertBody= [NSString stringWithFormat:@"%ld 个未接来电",[[UIApplication sharedApplication]applicationIconBadgeNumber]];
        wei.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber];
        [[UIApplication sharedApplication] presentLocalNotificationNow:wei];
    }
}

4、注意当进入应用时,角标清除:

- (void)applicationDidBecomeActive:(UIApplication *)application {
    
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

}

以上是IOS端代码

下面是服务器端发送:
服务器端代码如下:
1、获取推送服务这个是用的开源的java推送框架,github有源码


/** * get push service
 * @return
 * @throws FileNotFoundException
 */

public ApnsService  getPushService(Long accountId) throws FileNotFoundException {
    String certPath = getCertPath(accountId);    
logger.debug("cert path: "+certPath);  
  ApnsService service =          
  APNS.newService()               
     .withCert(certPath, "123456")       
             .withProductionDestination()          
          .build();   // service.testConnection();  
  return service;
}

2、推送命令包含在推送字段中

public  void  pushNotificationTest(Long accountId,String cloudpId,String content) throws Exception{ 

   Relation  relation = new Relation();   
 relation.setUserId(cloudpId);    
relation.setAccountId(accountId);   
// String deviceToken = queryDeviceToken(relation);    
//logger.debug("deviceToken:"+deviceToken);   
 String deviceToken = handleDeviceToken("5e11eefc6f8b427b6646bcaf5320a5e714b121859f21b0ee78d88d3f411ac69b6");  
  ApnsService  service = getPushServiceTest(accountId); 
   try{        
String call = APNS.newPayload().customField("cmd","call").build();        String cancel = APNS.newPayload().customField("cmd","cancel").build();   
    service.push(deviceToken, call); 
     //  service.push(deviceToken, cancel);  
  }catch (Exception e){    
    logger.error("push throw Exception: " +e.getMessage());       
 throw new Exception(e);   
 }finally {      
  if (service != null){       
     service.stop();       
 }  
  }
}

参考一
java 推送
stackoverflow

相关文章

  • 生成终端、服务器证书

    生成APNS或者VOIP证书后 生产环境 ios推送证书更换

  • iOS VOIP 推送

    1. 普通推送与voip推送区别 普通推送: 常规的apns推送,Apple提供了两种不同方式的推送形式,一种是在...

  • ios voip 推送

    什么是voip推送和普通的ios推送有什么区别呢?普通推送分为:远程推送和本地推送,区别网上资料太多了,简单说一下...

  • iOS VOIP推送

    VOIP推送是在iOS8 之后提出来的,依赖PushKit.framework。 1. 应用场景 用于发送 类似微...

  • 关于iOS中VoIP推送(PushKit)的详细实现。

    关于iOS中VoIP推送实现微信音视频呼叫连续响铃效果:https://oopsr.github.io/2016/...

  • iOS本地推送(附Swift与OC代码)

    一、前言 上一篇文章讲述了下关于远程推送用到的两种类型APNS与VoIP。本篇就来教你实现本地推送。 二、iOS本...

  • ios APNS/VOIP 推送测试方法

    本篇文章的功能是在你完成APNS/VOIP的集成后,如果用你公司的服务端推送的消息收不到,不能确定是ios还是服务...

  • IOS APNS和VOIP 实现推送(本质)

    iOS 的推送本质 iOS 在系统级别有一个推送服务程序使用 5223 端口。使用这个端口的协议源于 Jabber...

  • iOS VOIP

    1、IOS允许App的一个Socket在App切换到后台后仍然保持连接. 这样,当有通话请求的时候,App能及时处...

  • 收藏博客

    iOS: iOS VOIP后台处理 python: tornado 翻译 tornado 框架 数据库: 数据库基...

网友评论

  • 西门淋雨:voip 推送能和apns推送一起使用吗?配置证书的时候不是只能选择一种吗?
  • 14a07d8f2018:请问代理方法不执行是为什么?
  • 14a07d8f2018:作者在吗?请问background Modes没有VOIP这个选项怎么办
    Mr_Jee:可以在info.plist中为Required background modes添加一个item,值为App provides Voice over IP services
  • 51ca5e003d9b:handleDeviceToken这个方法对DeviceToken做了什么处理呢?
  • 0271fb6f797c:voip 推送能和apns推送一起使用吗?配置证书的时候不是只能选择一种吗?
    西门淋雨:我也有这样的疑问,目前我们项目中用的是apns,但是要新增voip这种需求,两者如何同时存在?打包的时候到底选哪个证书啊?
  • f2503bba4cfa:six six six
  • 3c27ab553ee9:请问 我iOS端怎么用 服务器端代码 来测试呀
  • 6960c5e09fce:有没有demo啊
  • 7f594f459ceb:麻烦问一下voip push和普通的push在服务器端写法一样吗?
  • LaiYoung_:这个Token何时会变化呢?我卸载之后重装Token都没有变化
  • 18516f36aa1f:请问如果是没有Voip功能的app可以使用pushkit么?审核会被拒么?
  • 一叶菜:你好,我有个问题想请教一下你。voip在测试环境用生成的生产环境的voip证书吗?还是用什么证书提供给后台呢?麻烦有时间回复我一下,谢谢!
    一叶菜:你是直接把voip生成的生产环境证书给后台的嘛?在测试环境中,拿哪个证书测呢?就是coding那里要选证书,不知怎么选。可以麻烦加我扣扣,指导一下吗?扣扣,597167823。
    一叶菜:@topwqp 是的,我是说voip证书哦。在官网上只能生成生产环境的voip证书,没有测试环境的哦。不像apns,在生产和测试分别可以生成
    大龄程序员在帝都:@一叶菜 测试环境有测试环境的证书,生产环境有生产环境的证书,不一样的
  • JosephCheng:还有就是 getCertPath 是自己写的函数 还是调出来的如果是调出来的是在哪个包里 谢谢
    JosephCheng:@topwqp 谢谢大神
    大龄程序员在帝都:@JosephCheng 是我自己的写的,我们的业务需要根据accountId调用不同的证书,所以你直接获取你们的证书位置即可
  • JosephCheng:麻烦问一下 getCertPath(accountId) 获取的是.p12 还是.cer
    西门淋雨:voip 推送能和apns推送一起使用吗?配置证书的时候不是只能选择一种吗?
    40ba4cb2925f:@topwqp 不是说导出来的是.pem文件吗?为什么还是直接使用p12?
    大龄程序员在帝都:@JosephCheng .p12

本文标题:ios voip 推送

本文链接:https://www.haomeiwen.com/subject/ywxodttx.html