Apple push-уведомления — PHP: не удалось открыть поток: нет такого файла или каталога

Я работаю над внедрением службы push-уведомлений Safari для моего сайта. Я следую учебному пособию Apple, которое можно найти Вот. И мы должны создать пакет для обслуживания push-уведомлений, и Apple предоставляет сопутствующий php-файл, который помогает создать пакет.

Теперь я скачал php-файл и попытался запустить его, но он всегда выдает предупреждение «Не удалось открыть поток: нет такого файла или каталога».

Полный журнал:

D:\...\Downloads\php-7.0.4-nts-Win32-VC14-x86>php D:\..\Downloads\Safari-Push-Notifications-master\createPushPackage.php
Warning: copy(pushPackage.raw/icon.iconset/icon_16x16.png): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/[email protected]): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/icon_32x32.png): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/[email protected]): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/icon_128x128.png): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30
Warning: copy(pushPackage.raw/icon.iconset/[email protected]): failed to openstream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line30
Warning: copy(pushPackage.raw/website.json): failed to open stream: No such fileor directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 30

Warning: file_get_contents(D:/../Desktop/dntest1457346433/icon.iconset/[email protected]): failed to open stream: No such file or directory in D:\...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 39
.
.
.
Warning: file_get_contents(D:/../Desktop/dntest1457346433/icon.iconset/icon_16x16.png): failed to open stream: No such file or directory in D:\...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 39
Warning: file_get_contents(D:/../Desktop/dntest1457346433/website.json): failed to open stream: No such file or directory in ...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 39
Warning: file_get_contents(Desktop): failed to open stream: No such file or directory in D:\...\Downloads\Safari-Push-Notifications-master\createPushPackage.php on line 47

PS: у меня есть каталог с именем pushPackage.raw, который содержит папку с именем icon.iconset, которая имеет набор из 6 изображений PNG. Поэтому я понятия не имею, почему он говорит: «Нет такого файла нет».

PHP Companion file

<?php

// This script creates a valid push package.
// This script assumes that the website.json file and iconset already exist.
// This script creates a manifest and signature, zips the folder, and returns the push package.

// Use this script as an example to generate a push package dynamically.$certificate_path = "Desktop";     // Change this to the path where your certificate is located
$certificate_password = "pwd1"; // Change this to the certificate's import password

// Convenience function that returns an array of raw files needed to construct the package.
function raw_files() {
return array(
'icon.iconset/icon_16x16.png',
'icon.iconset/[email protected]',
'icon.iconset/icon_32x32.png',
'icon.iconset/[email protected]',
'icon.iconset/icon_128x128.png',
'icon.iconset/[email protected]',
'website.json'
);
}

// Copies the raw push package files to $package_dir.
function copy_raw_push_package_files($package_dir) {
mkdir($package_dir . '/icon.iconset');
foreach (raw_files() as $raw_file) {
copy("pushPackage.raw/$raw_file", "$package_dir/$raw_file");
}
}

// Creates the manifest by calculating the SHA1 hashes for all of the raw files in the package.
function create_manifest($package_dir) {
// Obtain SHA1 hashes of all the files in the push package
$manifest_data = array();
foreach (raw_files() as $raw_file) {
$manifest_data[$raw_file] = sha1(file_get_contents("$package_dir/$raw_file"));
}
file_put_contents("$package_dir/manifest.json", json_encode((object)$manifest_data));
}

// Creates a signature of the manifest using the push notification certificate.
function create_signature($package_dir, $cert_path, $cert_password) {
// Load the push notification certificate
$pkcs12 = file_get_contents($cert_path);
$certs = array();
if(!openssl_pkcs12_read($pkcs12, $certs, $cert_password)) {
return;
}

$signature_path = "$package_dir/signature";

// Sign the manifest.json file with the private key from the certificate
$cert_data = openssl_x509_read($certs['cert']);
$private_key = openssl_pkey_get_private($certs['pkey'], $cert_password);
openssl_pkcs7_sign("$package_dir/manifest.json", $signature_path, $cert_data, $private_key, array(), PKCS7_BINARY | PKCS7_DETACHED);

// Convert the signature from PEM to DER
$signature_pem = file_get_contents($signature_path);
$matches = array();
if (!preg_match('~Content-Disposition:[^\n]+\s*?([A-Za-z0-9+=/\r\n]+)\s*?-----~', $signature_pem, $matches)) {
return;
}
$signature_der = base64_decode($matches[1]);
file_put_contents($signature_path, $signature_der);
}

// Zips the directory structure into a push package, and returns the path to the archive.
function package_raw_data($package_dir) {
$zip_path = "$package_dir.zip";

// Package files as a zip file
$zip = new ZipArchive();
if (!$zip->open("$package_dir.zip", ZIPARCHIVE::CREATE)) {
error_log('Could not create ' . $zip_path);
return;
}

$raw_files = raw_files();
$raw_files[] = 'manifest.json';
$raw_files[] = 'signature';
foreach ($raw_files as $raw_file) {
$zip->addFile("$package_dir/$raw_file", $raw_file);
}

$zip->close();
return $zip_path;
}

// Creates the push package, and returns the path to the archive.
function create_push_package() {
global $certificate_path, $certificate_password;

// Create a temporary directory in which to assemble the push package
$package_dir = 'D:/Users/Mike/Desktop/dntest' . time();
if (!mkdir($package_dir)) {
unlink($package_dir);
die;
}

copy_raw_push_package_files($package_dir);
create_manifest($package_dir);
create_signature($package_dir, $certificate_path, $certificate_password);
$package_path = package_raw_data($package_dir);

return $package_path;
}// MAIN
$package_path = create_push_package();
if (empty($package_path)) {
http_response_code(500);
die;
}

header("Content-type: application/zip");
echo file_get_contents($package_path);
die;

Другое дело, что этот скрипт php создает пакет в указанном месте (D: / Users / Mike / Desktop), но без содержимого в каталоге pushPackage.raw.

Пожалуйста, помогите мне решить эту проблему. Спасибо вам большое!

0

Решение

Вам нужно запустить createPushPackage.php из папки с пакетом Safari-Push-Notifications (в вашем случае D:\..\Downloads\Safari-Push-Notifications-master\) потому что код copy("pushPackage.raw/$raw_file", "$package_dir/$raw_file"); использовать относительный путь к файлам активов.

Добавьте некоторые объяснения относительных путей:

bash$ pwd
/var/www/test # we inside /var/www/
bash$ ls -la # there are 2 files
-rw-r--r--   1 alexanderpolomodov  wheel   48 Mar  7 15:07 test.php
-rw-r--r--   1 alexanderpolomodov  wheel   15 Mar  7 15:08 test.txt
# test.php consist from one string
# var_dump(file_get_contents('test.txt'));
bash$ php test.php # run this script
string(15) "test filepaths"bash$ cd ..
# when we run this command from another folder we get error
bash$ php test/test.php
Warning: file_get_contents(test.txt): failed to open stream: No such file or directory in /private/var/www/test/test.php on line 3
bool(false)
1

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

Других решений пока нет …

По вопросам рекламы [email protected]