Benachrichtigungen mit IPS V4
- Installation meines Moduls von GitHub (siehe Cortana)
- Danach eine Instanz „ips4WinDeviceRegistration" anlegen
- in der App unter Interaktionen den Regler für Pushbenachrichtigungen aktivieren und die Einstellungen verlassen
- in IPS sollte jetzt unter dem Modul das Gerät mit Adresse und Schlüssel erscheinen
Im Moment wird der Schlüssel nicht automatisch im Hintergrund erneuert, nach den vier Wochen müsste man einmal in die App gehen (kommt aber sobald ich die Mobile Variante fertig habe, weil ich dort den Task dafür sowieso baue).
Um Nachrichten zu verschicken, legt man sich jetzt einfach ein Script an und fügt folgendes hinzu:
include(IPS_GetKernelDirEx()."scripts/__ipsmodule.inc.php");
include("../modules/ips4Windows/ips4WinNotifications/module.php");
$ips4WNS = new ips4WinNotifications("");
$ips4WNS->EnableDebug(true);
$result = $ips4WNS->sendToastNotification(null,"text1","text2");
$result = $ips4WNS->sendBagdeNotification(null,"12");
$ips4WNS->SetWNSTileTag("Block1");
$result = $ips4WNS->sendTileNotification(null,"text1","text2","text3","text4");
print_r ($result);
$ips4WNS->SetWNSTileTag("Block2");
$result = $ips4WNS->sendTileNotification(null,"text2","text22","text32","text42");
Ein ausführen des Scripts würde an alle Geräte jetzt eine Nachricht sowie eine TileBenachrichtigung verschicken. Möchte man nur an ein Gerät eine Nachricht senden, so muss man den deviceName aus dem DeviceRegistrationModul als ersten Parameter verwenden (anstelle null).
Es gibt drei Arten von Nachrichten:
- Toast (bekannt von WhatsApp und Co)
- Bagge (das ist die Zahl auf dem LiveTile wie z.B. ungelesene Mails)
- Tile (das ist die Kachel, je nach Größe gibt es mehr oder weniger Content)
Für die LiveTiles gibt es zwei Besonderheiten, mit SetWNSTileTag kann man eine Nachrichten Queue erstellen. Diese läuft dann einfach mit den unterschiedlichen Benachrichtigungen durch.
Mit sendTileNotificationXML($device, $XML) kann man den Tile vollkommen anpassen. Die gigantischen Möglichkeiten sind hierbeschrieben.
Cortana V3
Hier ist die Konfiguration wieder deutlich komplizierter und auch im ipsControl Threadbeschrieben. Dafür gibt es diesmal keine Einschränkungen
Hier die für Windows 10 angepasste Klasse (hat sich zur Version von ipsControl geändert)
class WindowsNotification
{
private $header1 = 'Content-Type: text/xml';
private $header2 = 'X-WNS-Type: ';
private $header3 = 'Authorization: Bearer ';
private $header4 = 'X-WNS-Tag: ';
private $deviceURI;
private $authToken;
private $Debug = false;
private $WNSMsgToken = "abc";
function __construct($ObjID)
{
$deviceToken = GetValueString($ObjID);
$data = explode("###",$deviceToken);
if (count($data) > 1)
{
$this->deviceURI = $data[0];
$this->authToken = $data[1];
}
}
public function EnableDebug($Debug)
{
$this->Debug = $Debug;
}
public function SetWNSMsgToken($Token)
{
$this->WNSMsgToken = "abc".$Token;
}
public function sendBagdeNotification($Value)
{
$headers = array($this->header1,$this->header2.'wns/badge',$this->header3.$this->authToken);
$body = '<?xml version="1.0" encoding="utf-8"?><badge version="1" value="'.$Value.'"/>';
if ($this->Debug)
{
echo "headers
";
print_r($headers);
echo "body
".$body."
";
}
$response = $this->sendNotification($headers,$body);
return $response;
}
public function sendToastNotification($text1,$text2)
{
$headers = array($this->header1,$this->header2.'wns/toast',$this->header3.$this->authToken);
$body = '<?xml version="1.0" encoding="utf-8"?><toast><visual><binding template="ToastText02">'.
'<text id="1">'.$text1.'</text><text id="2">'.$text2.'</text>'.
'</binding></visual></toast>';
if ($this->Debug)
{
echo "headers
";
print_r($headers);
echo "body
".$body."
";
}
$response = $this->sendNotification($headers,$body);
return $response;
}
public function sendTileNotification($text1,$text2,$text3, $text4)
{
$text1 = utf8_encode($text1);
$text2 = utf8_encode($text2);
$text3 = utf8_encode($text3);
$text4 = utf8_encode($text4);
$bodystart = "<tile><visual>";
$bodysmall =
'<binding template="TileSmall">'.
'<text hint-style="base">'.$text1.'</text>'.
'<text hint-style="caption">'.$text2.'</text>'.
'</binding>';
$bodymedium =
'<binding template="TileMedium">'.
'<text hint-style="base">'.$text1.'</text>'.
'<text hint-style="caption">'.$text2.'</text>'.
'<text hint-style="caption">'.$text3.'</text>'.
'<text hint-style="caption">'.$text4.'</text>'.
'</binding>';
$bodywide =
'<binding template="TileWide">'.
'<text hint-style="base">'.$text1.'</text>'.
'<text hint-style="caption">'.$text2.'</text>'.
'<text hint-style="caption">'.$text3.'</text>'.
'<text hint-style="caption">'.$text4.'</text>'.
'</binding>';
$bodyend = "</visual></tile>";
$body = $bodystart.$bodysmall.$bodymedium.$bodywide.$bodyend;
$headers = array($this->header1,$this->header2.'wns/tile',$this->header4.$this->WNSMsgToken,$this->header3.$this->authToken );
if ($this->Debug)
{
echo "headers
";
print_r($headers);
echo "body
".$body."
";
}
$response = $this->sendNotification($headers,$body);
return $response;
}
private function sendNotification($headers,$body)
{
if ($this->Debug)
{
echo "URL:
".$this->deviceURI."
";
}
if ($this->deviceURI != "")
{
// use Client URL Library
$ch = curl_init();
// set an options for a cURL transfer
// look options here: http://www.php.net/manual/en/function.curl-setopt.php
// and what are needed here: http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202970(v=vs.92).aspx
curl_setopt($ch, CURLOPT_URL, $this->deviceURI);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// perform a cURL session
$response = curl_exec($ch);
// Check for errors
if($response === FALSE)
{
echo "Error in WindowsNotifications->sendNotifications: ".curl_error($ch);
}
// close a cURL session
curl_close($ch);
if($response === FALSE)
return "Error in WindowsNotifications->sendNotifications: ".curl_error($ch);
else
return true;
}
else
return "Error in WindowsNotifications->sendNotifications: DeviceURI is null! Will skip message";
}
}