Можно получить эту информацию от SERVER_SOFTWARE
переменная. Это возвратит следующее:
Microsoft-IIS/5.0 (Windows 2000)
Microsoft-IIS/5.1 (Windows XP)
Microsoft-IIS/6.0 (Windows 2003 Server)
и т.д.
при использовании ASP.NET можно получить эту строку через [1 111]
Request.ServerVariables["SERVER_SOFTWARE"];
РЕДАКТИРОВАНИЕ: кажется, что необходимо будет запросить реестр для получения этой информации. Смотрите на эта страница , чтобы видеть как.
Я получил решение на форуме Apple, и оно предназначено для разработки. Попробуйте это и для производства.
"Ну, как бы глупо это ни звучало, я нашел решение:
Создайте фиктивный идентификатор приложения на программном портале, включите для него push-уведомления разработки Создайте и загрузите связанный профиль обеспечения Создайте новый проект xcode и вызовите метод registerForRemoteNotificationTypes при запуске. Установите фиктивное приложение на свое устройство. На этом этапе у вас должны быть запущены два приложения РАЗРАБОТКА на вашем устройстве: исходное приложение и фиктивное приложение. Оба должны быть зарегистрированы для получения push-уведомлений. Удалите исходное приложение и попробуйте отправить ему push-уведомление. Вызовите службу обратной связи, и вы получите данные обратно ».
Этот код выглядит правильно, однако вам нужно выполнить цикл и проверить конец потока, чтобы прочитать все коды устройств.
while (!feof($apns)) {
$devcon = fread($apns, 38);
}
Однако моя проблема заключается в фактической распаковке данных. Кто-нибудь знает, как распаковать двоичные данные, которые вы только что прочитали, чтобы получить фактический идентификатор устройства (в виде строки) вместе с отметкой времени и т. Д.?
Это, наконец, сработало для меня.
$arr = unpack("H*", $devconts);
$rawhex = trim(implode("", $arr));
$feedbackTime = hexdec(substr($rawhex, 0, 8));
$feedbackDate = date('Y-m-d H:i', $feedbackTime);
$feedbackLen = hexdec(substr($rawhex, 8, 4));
$feedbackDeviceToken = substr($rawhex, 12, 64);
А затем вы просто проверяете токен устройства по метке времени!
Вот большая загвоздка, которая смутила меня, когда я впервые попробовал подключиться: серверы обратной связи APNS возвращают только те токены устройств, которые "истекли" с момента вашего последнего запроса обратной связи. Это означает, что в большинстве случаев вы получите ответ NULL, если только вы не имеете дело с большим количеством пользователей вашего приложения.
Поэтому убедитесь, что вы сохранили токены устройств с истекшим сроком действия на диск или в базу данных, потому что после запроса обратной связи они пропадают навсегда. Это делает тестирование, мягко говоря, неприятным!
Вот полная функция для получения маркеров устройств с серверов обратной связи APNS (большое спасибо авторам ответов выше за то, что помогли мне собрать все вместе):
function send_feedback_request() {
//connect to the APNS feedback servers
//make sure you're using the right dev/production server & cert combo!
$stream_context = stream_context_create();
stream_context_set_option($stream_context, 'ssl', 'local_cert', '/path/to/my/cert.pem');
$apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context);
if(!$apns) {
echo "ERROR $errcode: $errstr\n";
return;
}
$feedback_tokens = array();
//and read the data on the connection:
while(!feof($apns)) {
$data = fread($apns, 38);
if(strlen($data)) {
$feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
}
}
fclose($apns);
return $feedback_tokens;
}
Если все в порядке, возвращаемые значения из этой функции будут выглядеть примерно так (через print_r()):
Array
(
Array
(
[timestamp] => 1266604759
[length] => 32
[devtoken] => abc1234..............etcetc
),
Array
(
[timestamp] => 1266604922
[length] => 32
[devtoken] => def56789..............etcetc
),
)