首页 > 程序开发 > 移动开发 > IOS >

ios8新特性:pushkit实战总结(voip开发者必读)

2015-04-02

Question:pushkit是什么? Answer:ios8苹果新引入了名为pushkit的框架和一种新的push通知类型,被称作voip push 该push方式旨在提供区别于普通apns push的能力,通过这种push方式可以使app执行制定的代码(在

Question:pushkit是什么?

Answer:ios8苹果新引入了名为pushkit的框架和一种新的push通知类型,被称作voip push.该push方式旨在提供区别于普通apns push的能力,通过这种push方式可以使app执行制定的代码(在弹出通知给用户之前);而该通知的默认行为和apns通知有所区别,它的默认行为里面是不会弹出通知的。目前来看push kit的用途还局限于voip push(根据笔者的实战经验来看,其他类型的push暂时不能够起作用,sdk也正处于演进中)。

Question: pushkit能帮我们做什么?

Answer:pushkit中的voippush,可以帮助我们提升voip应用的体验,优化voip应用的开发实现,降低voip应用的电量消耗,它需要我们重新规划和设计我们的voip应用,从而得到更好的体验(voip push可以说是准实时的,实侧延时1秒左右);苹果的目的是提供这样一种能力,可以让我们抛弃后台长连接的方案,也就是说应用程序通常不用维持和voip服务器的连接,在呼叫或者收到呼叫时,完成voip服务器的注册;当程序被杀死或者手机重启动时,都可以收到对方的来电,正常开展voip的业务。也就是说,我们当前可以利用它来优化voip的体验,增加接通率;条件成熟时我们就可以完全放弃后台的长连接,走到苹果为我们规划的道路上。

对于pushkit,除了苹果framework官方文档: 以外,能够找到的帮助理解pushkit的莫过于wwdc的视频:712_sd_writing_energy_efficient_code_part_2。该视频也可以从苹果官网下载。

pushkit的局限:

在当前,pushkit仅支持ios8;且该功能正处于演进中,稳定性和在不同ios8小版本设备上的表现也可能有差异,在苹果开发者论坛上也有不少人反馈问题;根据经验,在下个大版本(也就是ios9)上可以期待该功能可以稳定下来。

如果需要在ios8之前的设备上支持pushkit功能,那么需要开发者付出很多额外的努力,这里不展开,有兴趣的同学可以到苹果论坛的相关板块去了解,有一些开发者在这方面走的比较远:

在简单介绍了pushkit和它能做的事并且了解到它的局限以后,还对pushkit感兴趣的童鞋可以往下继续看了(:)为了避免浪费大家的宝贵时间)。

pushkit的voip功能的实现:

1.跟apns push类似,pushkit的voippush也需要申请证书 ;voip push的证书申请步骤截图如下:

data-cke-saved-src=http://www.2cto.com/uploadfile/Collfiles/20150402/20150402083212239.png

data-cke-saved-src=http://www.2cto.com/uploadfile/Collfiles/20150402/20150402083213241.pngdata-cke-saved-src=http://www.2cto.com/uploadfile/Collfiles/20150402/20150402083213243.pngdata-cke-saved-src=http://www.2cto.com/uploadfile/Collfiles/20150402/20150402083213244.pngdata-cke-saved-src=http://www.2cto.com/uploadfile/Collfiles/20150402/20150402083214245.png

2.使用该证书导出并加载到push服务器上,服务器侧无需做改动,仅替换证书相关的东西即可(具体流程和此前apns证书的加载完全类同);服务器和客户端的交互流程也基本类似。

3.客户端实现:

step1:在工程中添加pushkit;

step2:在工程设置里面的backgroundmode里面添加voip、backgroundfetch、remotenotifications的支持。

step3:保险起见,建议开发者使用最新版本的xcode和最新的sdk;也建议重新申请一个mobile provision文件用于打包。

step4:类似apns通知的客户端实现流程,voip push客户端相关的流程也类似:注册voip push通知,实现pushkit相关的代理。

贴出主要代码:

在应用启动(appdelegate的didfinishlaunchwithoptions)后或根控制器的初始化等方法内调用如下代码:
PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

UIUserNotificationSettings *userNotifySetting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:userNotifySetting];
上面的代码实现了在应用启动时对voip push的注册;

在appdelegate或框架viewcontroller类中实现voip push的代理:

@interface EPTabBarController : UITabBarController

- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type
{
if([credentials.token length] == 0)
{
NSLog(@voip token NULL);
return;
}

ZeroPush * push = [[ZeroPush alloc] init];

// push.apiKey = @iosdev_1Z6JR3PKBWrAWbuHLbLQ;

push.apiKey = @iosprod_HZDimW5ssYsRQgaSaEoE;

// iosprod_HZDimW5ssYsRQgaSaEoE

[push registerDeviceToken:credentials.token channel:@me];

}

我们这里对接的push服务器是zeropush提供的服务;后面我们会大概介绍下该服务;上面的代理方法是设备从苹果服务器获取到了voip token,然后传递给应用程序;我们需要把这个token传递到push服务器(和apns push类似,我们也是要传递apns token到push服务器,但是这两个token的获取方式不同,分别在不同的代理方法中回调给应用,且这两个token的内容也是不同的)。

push server在获取到用户的voip token之后,在一切正常的情况下,另外一个回调会在push server下发消息到对应token的设备时被触发。

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

NSLog(@didReceiveIncomingPushWithPayload);
// 此时进行voip注册

// write your voip related codes here

UIUserNotificationType theType = [UIApplication sharedApplication].currentUserNotificationSettings.types;
if (theType == UIUserNotificationTypeNone)
{
UIUserNotificationSettings *userNotifySetting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:userNotifySetting];
}


UILocalNotification *backgroudMsg = [[UILocalNotification alloc] init];
backgroudMsg.alertBody= NSInternationalString(@You receive a new call,nil);
[[UIApplication sharedApplication] presentLocalNotificationNow:backgroudMsg];

}

上面的回调代码里仅仅打印了日志,触发了一个本地通知;这个代理方法是收到voip push通知时触发的;如果一切正常,该通知在手机重启、应用被系统回收、手动kill程序的情况下,依然能够被触发,且可以有一段时间用来执行自己的代码(比如voip注册等)。

我们这里简单设计一个业务供大家参考,主要是为了让大家直观的认识到pushkit的能力:

1.应用的voip长连接不保持,在收到呼叫或者发起呼叫时再连接;

2.当呼叫发送到voip 服务器时,对端若不在线,通过voip 服务器连接到pushserver向对端发push通知;

3.应用收到voip push通知时,迅速完成注册;

4.呼叫方通过延时操作等逻辑(复杂一点对voip服务器进行改造,被叫连接上来以后通知到主叫侧),再次发起呼叫,通话即成功建立。

笔者曾就一个证书相关的问题尝试给该邮箱发信,很快得到了满意的答复,非常棒!

zero push 提供了一个免费试用的服务,这让我们体验voip push非常方便;

按照它的提示,注册账号,然后创建应用,上传voip 证书,从网页上获取到它的apikey(这个key在上传token之前要用到,在上面的代理方法中)。

需要注意的是,该工程使用swift语言编写,如果你的证书和provision文件等都是之前申请的,只用于oc创建的工程,那么该工程在真机运行时很可能会闪退;解决办法是重新生成你的证书和provision文件,并使用到工程中,然后重新打包,该问题即可得到解决了。

最后,欢迎大家任何形式的关于本课题的探讨~我留意到国内关于本课题的中文资料或者实践总结非常少,绝大部分都是英文的,希望和大家一起多多积累,共同进步~

相关文章
最新文章
热点推荐