<?php
namespace common\extensions\push;
use \CComponent; /**
* @desc iphone推送的接口程序
*/
class ApnsPush extends CComponent{ //证书地址
public $cert; //ipad证书地址
public $ipadCert; //密钥
public $passphrase; public $applePushUrl = 'ssl://gateway.push.apple.com:2195'; //ssl://gateway.sandbox.push.apple.com:2195测试地址
public $defaultConf = array(
'badge' => 0,
'sound' => 'default',
'ispad' => 0,
'alert' => '',
'token' => ''
);
public $failedSend = array();
public $resendTime = 0;
public $maxResendTime = 10; function init()
{ } /**
* 获取证书
* @param boolean $ispad
*/
function getCert($ispad = false)
{
return $ispad ? (empty($this->ipadCert) ? $this->cert : $this->ipadCert) : $this->cert;
} function getPayload($data = array())
{
$body = array();
strlen($data['alert']) > 87 && $data['alert'] = mb_convert_encoding(substr($data['alert'], 0, 87), 'UTF-8', 'UTF-8') . '...';
$body['aps']['alert'] = $data['alert'];
$body['aps']['badge'] = (int) $data['badge'];
$body['aps']['sound'] = $data['sound'];
$body = array_merge($body, array_diff_assoc(array_merge($data, $this->defaultConf), $this->defaultConf));
return $body;
} /**
* 推送
* @param array $sendInfo
* @return boolean
*/
function send($sendInfo = array())
{
$ctx = stream_context_create();
$sendInfo = array_merge($this->defaultConf, $sendInfo);
stream_context_set_option($ctx, 'ssl', 'local_cert', $this->getCert($sendInfo['ispad']));
stream_context_set_option($ctx, 'ssl', 'passphrase', $this->passphrase); //如果设置了密码,这里就不能注释了
$fp = stream_socket_client($this->applePushUrl, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp)
{
return false;
}
$payload = json_encode($this->getPayload($sendInfo));
//echo strlen($payload); //这里可以精心测试,最大不能超过256个字节即strlen超过256后苹果直接不予处理。
$msg = chr(0) . pack("n", 32) . pack('H*', str_replace(' ', '', $sendInfo['token'])) . pack("n", strlen($payload)) . $payload;
fwrite($fp, $msg);
fclose($fp);
return true;
} /**
* 批量推送
* @param array $batchSendInfo
*/
function batchSend($batchSendInfo = array())
{
$this->failedSend = array();
if( ! empty($batchSendInfo))
{
foreach ($batchSendInfo as $val)
{
if( ! $this->send($val))
{
$this->failedSend[] = $val;
}
}
if( ! empty($this->failedSend) && $this->resendTime < $this->maxResendTime )
{
$this->resendTime++;
$this->batchSend($this->failedSend);
}
}
}
}

ios推送基于YII第三方组件的类库的更多相关文章

  1. 友盟iOS推送配置(从真机调试到推送)

    下面我来讲解一下友盟iOS的推送配置,其实友盟只是一个示例,换做其余的第三方推送服务也会适用,只是第三方的后面服务变了而已. iOS推送(包括真机调试)所需要的步骤和文件如下: 备注:这里我将省略掉一 ...

  2. iOS 推送全解析

    本文旨在对 iOS 推送(以下简称 推送)进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacod ...

  3. 利用pyapns进行ios推送

    ios客户端的同事提供了2个证书,分别是aps_development.cer  和 pushdevelopment.p12, 我最终目的就是把这2个证书合并成1个pem证书,然后通过pyapns进行 ...

  4. iOS推送介绍

    iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...

  5. iOS 推送问题全解答《十万个为啥吖?》

    Q 1:为啥收不到推送(1)? 如果收到推送时,App 在前台运行,那么: iOS 10 before 顶部横幅不会弹出.没有任何展示,你以为「没有收到推送」. iOS 10 after 如果没有实现 ...

  6. iOS 推送全解析,你不可不知的所有 Tips!

    本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacode 使用 iOS ...

  7. iOS推送证书转pem文件

    iOS推送证书转 .pem文件. 推送证书转pem文件openssl x509 -in apns_miaobozhibo.cer -inform der -out apns_miaobozhibo.p ...

  8. IOS 推送-客户端处理推送消息

    IOS 推送-客户端处理推送消息 1.推送调用顺序 APN push的消息到达后,UIApplicationDelegate有两个方法和处理消息有关: 1)application:didReceive ...

  9. IOS 推送-配置与代码编写

    IOS 推送配置与代码编写 这里介绍IOS的推送,本文章已经在IOS6/7/8上都能运行OK,按照道理IOS9应该没问题. 大纲: 1.文章前提 2.推送介绍 3.推送文件账号设置 4.推送证书介绍 ...

随机推荐

  1. [二]JQueryMobile常用的组件介绍

    1.页头.主要部门.页尾构成一个基本的页面 2.按钮组件(input.a) 3.列表组件(ul) 4.表格组件(table)

  2. ulua学习笔记(二):官方资料及问题解决方案

    uLua&SimpleFramework入门视频教程网盘地址 视频教程地址 http://pan.baidu.com/s/1gd8fG4N游戏框架地址 https://github.com/j ...

  3. C++学习笔记(十五):异常

    C++之父Bjarne Stroustrup在<The C++ Programming Language>中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和 ...

  4. Oracle- 日期格式和数字类型处理

    更新数据库时间格式的显示格式的语句:(alter session set nls_date_format='YYYY-MM-dd'); to_date("要转换的字符串",&quo ...

  5. st_MES_InsertIntoSalaryManage

    USE [ChiefmesNew]GO/****** Object: StoredProcedure [dbo].[st_MES_InsertIntoSalaryManage] Script Date ...

  6. 在Win8 Mertro 中使用SQLite

    在Win8 Mertro 中使用SQLite 分类:             .net 开发              2012-09-19 18:17     1229人阅读     评论(3)   ...

  7. 我的第一篇博客 ——【ToDoList】小程序开发

    我是一只即将大四的大三狗,这是我的第一篇博客,说来惭愧.今年1月份,学校放寒假的时候开始自学的IOS,放假的时候比较起劲,看了一堆Object-C的视频,然后照着中英文对照的IOS基础开发教程,做了两 ...

  8. 作为平台的Windows PowerShell(一)

    除了作为一种脚本语言外,Windows PowerShell被多种应用程序使用.这是因为Windows PowerShell引擎可以被托管在一个应用程序内部.这篇博文和下一篇博文将会处理在C#应用程序 ...

  9. httpclient4.3 工具类

    httpclient4.3  java工具类. .. .因项目须要开发了一个工具类.正经常常使用的httpclient 请求操作应该都够用了 工具类下载地址:http://download.csdn. ...

  10. java大数总结【转】

    java大数(2013长春网络赛)--hdu4762总结一下:1.java提交类要写Main.2.读取大数. Scanner read=new Scanner(System.in); BigInteg ...