ios — Codeigniter APN.where для помещения файла .pem в код php

Я работаю над проектом codeigniter, который требует отправки push-уведомлений на устройства ios.
При импорте библиотеки eapn я просто не могу понять, куда поместить файл .pem, который я экспортировал из проекта приложения ios.
а также я не могу понять, как ссылаться на его путь.

Вот библиотека Pushnotification.php

<?php

class APN
{

protected $server;
protected $keyCertFilePath;
protected $passphrase;
protected $pushStream;
protected $feedbackStream;
protected $timeout;
protected $idCounter = 0;
protected $expiry;
protected $allowReconnect = true;
protected $additionalData = array();
protected $apnResonses = array(
0 => 'No errors encountered',
1 => 'Processing error',
2 => 'Missing device token',
3 => 'Missing topic',
4 => 'Missing payload',
5 => 'Invalid token size',
6 => 'Invalid topic size',
7 => 'Invalid payload size',
8 => 'Invalid token',
255 => 'None (unknown)',
);

private $connection_start;

public $error;
public $payloadMethod = 'simple';

/**
* Connects to the server with the certificate and passphrase
*
* @return <void>
*/
protected function connect($server) {

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $this->null);
stream_context_set_option($ctx, 'ssl', 'passphrase', $this->null);

$stream = stream_socket_client($server, $err, $errstr, $this->timeout, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
log_message('debug',"APN: Maybe some errors: $err: $errstr");if (!$stream) {

if ($err)
show_error("APN Failed to connect: $err $errstr");
else
show_error("APN Failed to connect: Something wrong with context");

return false;
}
else {
stream_set_timeout($stream,20);
log_message('debug',"APN: Opening connection to: {$server}");
return $stream;
}
}/**
* Generates the payload
*
* @param <string> $message
* @param <int> $badge
* @param <string> $sound
* @return <string>
*/
protected function generatePayload($message, $badge = NULL, $sound = NULL, $newstand = false) {

$body = array();

// additional data
if (is_array($this->additionalData) && count($this->additionalData))
{
$body = $this->additionalData;
}

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

//badge
if ($badge)
$body['aps']['badge'] = $badge;

if ($badge == 'clear')
$body['aps']['badge'] = 0;

//sound
if ($sound)
$body['aps']['sound'] = $sound;

//newstand content-available
if($newstand)
$body['aps']['content-available'] = 1;$payload = json_encode($body);
log_message('debug',"APN: generatePayload '$payload'");
return $payload;
}/**
* Writes the contents of payload to the file stream
*
* @param <string> $deviceToken
* @param <string> $payload
*/
protected function sendPayloadSimple($deviceToken, $payload){

$this->idCounter++;

log_message('debug',"APN: sendPayloadSimple to '$deviceToken'");

$msg = chr(0)                                   // command
. pack('n',32)                                  // token length
. pack('H*', $deviceToken)                      // device token
. pack('n',strlen($payload))                    // payload length
. $payload;                                     // payload

log_message('debug',"APN: payload: '$msg'");
log_message('debug',"APN: payload length: '".strlen($msg)."'");
$result = fwrite($this->pushStream, $msg, strlen($msg));

if ($result)
return true;
else
return false;
}/**
* Writes the contents of payload to the file stream with enhanced api (expiry, debug)
*
* @param <string> $deviceToken
* @param <string> $payload
*/
protected function sendPayloadEnhance($deviceToken, $payload, $expiry = 86400) {

if (!is_resource($this->pushStream))
$this->reconnectPush();

$this->idCounter++;

log_message('debug',"APN: sendPayloadEnhance to '$deviceToken'");

$payload_length = strlen($payload);

$request = chr(1)                                       // command
. pack("N", time())                     // identifier
. pack("N", time() + $expiry) // expiry
. pack('n', 32)                             // token length
. pack('H*', $deviceToken)      // device token
. pack('n', $payload_length)    // payload length
. $payload;

$request_unpacked = @unpack('Ccommand/Nidentifier/Nexpiry/ntoken_length/H64device_token/npayload_length/A*payload', $request); // payload

log_message('debug', "APN: request: '$request'");
log_message('debug', "APN: unpacked request: '" . print_r($request_unpacked, true) . "'");
log_message('debug', "APN: payload length: '" . $payload_length . "'");
$result = fwrite($this->pushStream, $request, strlen($request));

if ($result)
{
return $this->getPayloadStatuses();
}

return false;
}protected function timeoutSoon($left_seconds = 5)
{
$t = ( (round(microtime(true) - $this->connection_start) >= ($this->timeout - $left_seconds)));
return (bool)$t;
}* Connects to the APNS server with a certificate and a passphrase
*
* @param <string> $server
* @param <string> $keyCertFilePath
* @param <string> $passphrase
*/
function __construct() {

$this->_ci = get_instance();

$this->_ci->config->load('apn',true);if(!file_exists($this->_ci->config->item('PermissionFile','apn')))
{
show_error("APN Failed to connect: APN Permission file not found");
}

$this->pushServer = $this->_ci->config->item('Sandbox','apn') ? $this->_ci->config->item('PushGatewaySandbox','apn') : $this->_ci->config->item('PushGateway','apn');
$this->feedbackServer = $this->_ci->config->item('Sandbox','apn') ? $this->_ci->config->item('FeedbackGatewaySandbox','apn') : $this->_ci->config->item('FeedbackGateway','apn');

$this->keyCertFilePath = $this->_ci->config->item('PermissionFile','apn');
$this->passphrase = $this->_ci->config->item('PassPhrase','apn');
$this->timeout = $this->_ci->config->item('Timeout','apn') ? $this->_ci->config->item('Timeout','apn') : 60;
$this->expiry = $this->_ci->config->item('Expiry','apn') ? $this->_ci->config->item('Expiry','apn') : 86400;
}/**
* Public connector to push service
*/
public function connectToPush()
{
if (!$this->pushStream or !is_resource($this->pushStream))
{
log_message('debug',"APN: connectToPush");

$this->pushStream = $this->connect($this->pushServer);

if ($this->pushStream)
{
$this->connection_start = microtime(true);
//stream_set_blocking($this->pushStream,0);
}
}

return $this->pushStream;
}

/**
* Public connector to feedback service
*/
public function connectToFeedback()
{
log_message('info',"APN: connectToFeedback");
return $this->feedbackStream = $this->connect($this->feedbackServer);
}

/**
* Public diconnector to push service
*/
function disconnectPush()
{
log_message('debug',"APN: disconnectPush");
if ($this->pushStream && is_resource($this->pushStream))
{
$this->connection_start = 0;
return @fclose($this->pushStream);
}
else
return true;
}

/**
* Public disconnector to feedback service
*/
function disconnectFeedback()
{
log_message('info',"APN: disconnectFeedback");
if ($this->feedbackStream && is_resource($this->feedbackStream))
return @fclose($this->feedbackStream);
else
return true;
}

function reconnectPush()
{
$this->disconnectPush();

if ($this->connectToPush())
{
log_message('debug',"APN: reconnect");
return true;
}
else
{
log_message('debug',"APN: cannot reconnect");
return false;
}
}

function tryReconnectPush()
{
if ($this->allowReconnect)
{
if($this->timeoutSoon())
{
return $this->reconnectPush();
}
}

return false;
}/**
* Sends a message to device
*
* @param <string> $deviceToken
* @param <string> $message
* @param <int> $badge
* @param <string> $sound
*/
public function sendMessage($deviceToken, $message, $badge = NULL, $sound = NULL, $expiry = '', $newstand = false)
{
$this->error = '';

if (!ctype_xdigit($deviceToken))
{
log_message('debug',"APN: Error - '$deviceToken' token is invalid. Provided device token contains not hexadecimal chars");
$this->error = 'Invalid device token. Provided device token contains not hexadecimal chars';
return false;
}

// restart the connection
$this->tryReconnectPush();

log_message('info',"APN: sendMessage '$message' to $deviceToken");

//generate the payload
$payload = $this->generatePayload($message, $badge, $sound, $newstand);

$deviceToken = str_replace(' ', '', $deviceToken);

//send payload to the device.
if ($this->payloadMethod == 'simple')
$this->sendPayloadSimple($deviceToken, $payload);
else
{
if (!$expiry)
$expiry = $this->expiry;

return $this->sendPayloadEnhance($deviceToken, $payload, $expiry);
}
}/**
* Writes the contents of payload to the file stream
*
* @param <string> $deviceToken
* @param <string> $payload
* @return <bool>
*/
function getPayloadStatuses()
{

$read = array($this->pushStream);
$null = null;
$changedStreams = stream_select($read, $null, $null, 0, 2000000);

if ($changedStreams === false)
{
log_message('error',"APN Error: Unabled to wait for a stream availability");
}
elseif ($changedStreams > 0)
{

$responseBinary = fread($this->pushStream, 6);
if ($responseBinary !== false || strlen($responseBinary) == 6) {

if (!$responseBinary)
return true;

$response = @unpack('Ccommand/Cstatus_code/Nidentifier', $responseBinary);

log_message('debug','APN: debugPayload response - '.print_r($response,true));

if ($response && $response['status_code'] > 0)
{
log_message('error','APN: debugPayload response - status_code:'.$response['status_code'].' => '.$this->apnResonses[$response['status_code']]);
$this->error = $this->apnResonses[$response['status_code']];
return false;
}
else
{
if (isset($response['status_code']))
log_message('debug','APN: debugPayload response - '.print_r($response['status_code'],true));
}

}
else
{
log_message('debug',"APN: responseBinary = $responseBinary");
return false;
}
}
else
log_message('debug',"APN: No streams to change, $changedStreams");

return true;
}/**
* Gets an array of feedback tokens
*
* @return <array>
*/
public function getFeedbackTokens() {

log_message('debug',"APN: getFeedbackTokens {$this->feedbackStream}");
$this->connectToFeedback();

$feedback_tokens = array();
//and read the data on the connection:
while(!feof($this->feedbackStream)) {
$data = fread($this->feedbackStream, 38);
if(strlen($data)) {
//echo $data;
$feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
}
}

$this->disconnectFeedback();

return $feedback_tokens;
}/**
* Sets additional data which will be send with main apn message
*
* @param <array> $data
* @return <array>
*/
public function setData($data)
{
if (!is_array($data))
{
log_message('error',"APN: cannot add additional data - not an array");
return false;
}

if (isset($data['apn']))
{
log_message('error',"APN: cannot add additional data - key 'apn' is reserved");
return false;
}

return $this->additionalData = $data;
}/**
* Closes the stream
*/
function __destruct(){
$this->disconnectPush();
$this->disconnectFeedback();
}

}//end of class

1

Решение

Вы можете поместить этот ключевой файл (.pem) в любом месте проекта. Но лучший способ поместить этот файл внутрь /library папка, создать одну новую папку говорит keys

Теперь в вашем файле библиотеки вы должны добавить real path,

function __construct() {
$this->keyCertFilePath = APPPATH.'library/keys/'.$this->_ci->config->item('PermissionFile','apn');

Это лучший способ, дайте мне знать, если это не работает.

0

Другие решения

создать файл конфигурации в папке application / config
скажем, «ios.php»

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

/* Development */

$config['host'] = 'gateway.sandbox.push.apple.com';
$config['port'] = '2195';
$config['cert'] = 'complete_path/application/libraries/cert.pem';
$config['passphrase'] = 'private_key_password';

В папке библиотеки приложение / библиотеки поместите файл pem и в файл Pushnotification.php:

public function __construct() {

$ci = & get_instance();
$ci->load->config('ios', true);

$this->cert = $ci->config->item('cert', 'ios');
$this->host = $ci->config->item('host', 'ios');
$this->port = $ci->config->item('port', 'ios');
$this->passphrase = $ci->config->item('passphrase', 'ios');
}

Надеюсь, это поможет

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector