【翻译】iOS应用能效指南:VoIP最佳实践

原文
"Energy Efficiency Guide for iOS Apps: Voice Over IP (VoIP) Best Practices"

本文适用于iOS8及以上系统,iOS7及以下系统推荐查看官方文档“App Programming Guide for iOS”,在该文档的“Background Execution”中的“Implementing Long-Running Tasks”下的“Implementing a VoIP App”小节。

VoIP最佳实践

VoIP应用能够使用户通过互联网拨打和接听电话,而不是通过蜂窝移动网。VoIP应用严重依赖网络,打VoIP电话导致高的能耗就不足为奇了。当VoIP应用处于不活跃的状态时,不管怎样应用都应该彻底地空闲已到达省电的目的。

使用VoIP Push Notification来避免长连接

过去(指iOS8之前),VoIP应用不得不和服务器之间维持一个长连接,来接收(可能的)呼入电话和其他数据。这意味着即使不使用应用时也要通过编写复杂的代码来实现在应用和服务器端来回发送消息来保持连接的活跃(alive)。这项技术导致设备频繁地唤醒,浪费了电量。这也意味着如果用户退出了VoIP应用,来自服务器端的电话就再也接收不到了。

开发者应该使用PushKit框架替代长连接,PushKit的API允许应用接收来着远程服务器的推送(当数据可用时)。无论何时一旦收到推送,应用就能被唤醒执行动作。比如,当收到呼入电话时,VoIP应用可以显示一个提醒,并提供选项来用于接听或拒绝来电。

使用PushKit来接收VoIP推送有很多的优点:

  • 省电,只有当使用PushKit并收到VoIP通知时,设备才工作。
  • VoIP推送可以直接触发程序执行,而不同于一般的推送,只有当用户响应了通知之后,应用才能执行动作。
  • VoIP推送被看作高优先级通知,传送过程无延时。
  • 相比一般推送,VoIP推送可以包含更多的数据。这些数据是一般推送不能提供的。
  • 当收到VoIP推送但你的VoIP应用并未运行,应用会自动重新启动(relaunched)。
  • 即使你的应用正处于后台,当收到VoIP推送时,系统也会给你的应用一定的运行时间(runtime)来处理推送。

提示
iOS8及更高版本才支持PushKit。

准备接收 VoIP推送通知

就像所有支持后台运行的应用一样,你的VoIP应用必须将开启后台运行模式。如图所示,点击Xcode Project下的Capabilities pane,选择Voice over IP。


打开VoIP后台模式

你也必须创建一个VoIP证书。每一个VoIP应用都需要一个自己单独的映射到唯一App ID的VoIP服务证书(VoIP Services certificate)。这个证书允许你的通知服务器连接到VoIP服务器。浏览Apple Developer Member Center并创建一个新的VoIP服务证书(VoIP Services Certificate)。如图所示,下载证书并导入钥匙串访问应用。

在Apple Developer Member Center中创建VoIP证书

配置VoIP推送通知

为了收到VoIP通知,你需要配置你的应用,在app delegate中连接PushKit框架。然后创建PKPushRegistry对象,设置它的代理为self,并注册VoIP推送,代码如下。

** 注册VoIP推送通知**

OBJECTIVE-C

// Link to the PushKit framework
#import <PushKit/PushKit.h>

// Trigger VoIP registration on launch
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self voipRegistration];
    return YES;
}

// Register for VoIP notifications
- (void) voipRegistration {
  dispatch_queue_t mainQueue = dispatch_get_main_queue()
  // Create a push registry object
  PKPushRegistry * voipRegistry = [[PKPushRegistry alloc] initWithQueue: mainQueue];
  // Set the registry's delegate to self
  voipRegistry.delegate = self;
  // Set the push type to VoIP
  voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
}
SWIFT

 // Link to the PushKit framework
import PushKit
 
// Trigger VoIP registration on launch
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    self.voipRegistration()
    return true
}
 
// Register for VoIP notifications
func voipRegistration {
    let mainQueue = dispatch_get_main_queue()
    // Create a push registry object
    let voipRegistry: PKPushRegistry = PKPushRegistry(mainQueue)
    // Set the registry's delegate to self
    voipRegistry.delegate = self
    // Set the push type to VoIP
    voipRegistry.desiredPushTypes = [PKPushTypeVoIP]
}

下一步,实现代理的协议方法来处理更新后的推送证书。如果你的应用同时收到了一般通知和VoIP推送,你的应用将收到两个不同的推送token。为了能收到两种通知,必须将两个token发送给对应的服务器,代码如下。

** 处理更新后的推送通知证书 **

OBJECTIVE-C

// Handle updated push credentials
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials: (PKPushCredentials *)credentials forType:(NSString *)type {
  // Register VoIP push token (a property of PKPushCredentials) with server
}
SWIFT

 // Handle updated push credentials
func pushRegistry(registry: PKPushRegistry!, didUpdatePushCredentials credentials: PKPushCredentials!, forType type: String!) {
    // Register VoIP push token (a property of PKPushCredentials) with server
}

最后,设置代理的协议方法来处理推送。如果收到推送时你的应用未运行,你的应用将会自动运行(launched automatically),代码如下。

** 处理推送 **

OBJECTIVE-C

 - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type {
  // Process the received push
}
SWIFT

// Handle incoming pushes
func pushRegistry(registry: PKPushRegistry!, didReceiveIncomingPushWithPayload payload: PKPushPayload!, forType type: String!) {
    // Process the received push
}

提示
更多关于VoIP推送通知的信息,请浏览PushKit Framework Reference

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容