Как настроить платформу ios с помощью кода с файлом сертификата Apple Push Notification P12? - PullRequest
1 голос
/ 24 октября 2019

Я хочу создать приложение с установленной платформой ios из файла .p12. Как мне это сделать?

Это метод для создания приложения:

class AppHandler
{
    public $USER_AUTH_KEY = 'Insert your key here';

    public function create($name, $apns_p12 = null, $apns_p12_password = null, $gcm_key = null, $android_gcm_sender_id = null)
    {
        $fields = array(
            'name' => $name,
            'apns_p12' => $apns_p12,
            'apns_p12_password' => $apns_p12_password,
            'gcm_key' => $gcm_key,
            'android_gcm_sender_id' => $android_gcm_sender_id
        );

        $fields = json_encode($fields);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://onesignal.com/api/v1/apps");
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8',
            "Authorization: Basic " . $this->USER_AUTH_KEY));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

        try {
            $response = curl_exec($ch);

            if (!$response) {
                throw new Exception("App wasn't created");
            }
        } catch (Exception $e) {
            echo 'Error: ', $e->getMessage(), "\n";
        } finally {
            curl_close($ch);
        }

        $response = json_decode($response, true);

        $return = array(
            'id' => $response['id'],
            'basic_auth_key' => $response['basic_auth_key']
        );

        return $return;
    }
...

И это метод с двумя способами получить внутреннюю часть файла .p12:

    public function getP12($pkcs12, $password = NULL): string
    {

        /*
        // Way 1:
        $pkcs12 = file_get_contents($pkcs12);
        $encoded = base64_encode($pkcs12);

        return $encoded;
        */

        // Way 2:
        $cert_store = file_get_contents($pkcs12);
        if (!$cert_store) {
            echo "Error: can't read file.\n";
            exit;
        }

        $pkcs12Read = openssl_pkcs12_read($cert_store, $cert_info, $password);
        if ($pkcs12Read) {
            $result = base64_encode($cert_info['cert']);
            return $result;
        } else {
            echo "Error: can't read cert.\n";
            exit;
        }
    }

Согласно документу onesignal Я должен отправить apns_p12 как мой файл сертификата p12 для push-уведомлений Apple, преобразованный в строку и закодированный в Base64 .

ИЯ делаю это так:

$obj = new AppHandler();
$response = $obj->create('TestName', $obj->getP12('cert.p12', 'password'), 'password')

Создает приложение с заданным именем, однако платформа не настроена.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Хорошо, я понял. Мне просто нужно было добавить параметр apns_env:

$fields = array(
            'name' => $name,
            'apns_env' => $apns_env,
            'apns_p12' => $apns_p12,
            'apns_p12_password' => $apns_p12_password,
            'gcm_key' => $gcm_key,
            'android_gcm_sender_id' => $android_gcm_sender_id
        );

И я должен был взять внутренности файла и преобразовать их в строку, а Base64 закодировать так:

public function getP12($pkcs12): string
    {
        $apns_12 = base64_encode(file_get_contents($pkcs12));

        return $apns_12;
    }
0 голосов
/ 25 октября 2019

Что вы подразумеваете под "платформа не настроена"? Какую ошибку вы получаете и где?

Кстати, я, наконец, отказался от попыток написания кода с тонкостями программирования APNS и вместо этого перешел на AWS 'Simple Notification Service: https://aws.amazon.com/sns. Он обрабатывает как Apple, так иУведомления Google с помощью API для настройки тем и подписчиков, плюс вы можете отправлять до 1 миллиона уведомлений в месяц бесплатно.

...