- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Pushsharp 发送通知以更新钱包/存折中的数字卡。我已经仔细检查了所有这些:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using PushSharp.Apple;
namespace NotificationPushsharp01
{
class Program
{
static void Main(string[] args)
{
string certificatePath = @"PATH_OF_CERTIFICATE.p12";
X509Certificate2 clientCertificate = new X509Certificate2(System.IO.File.ReadAllBytes(certificatePath), "12345");
// Configuration (NOTE: .pfx can also be used here)
var config = new ApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Production, clientCertificate, validateIsApnsCertificate: false);
// Create a new broker
var apnsBroker = new ApnsServiceBroker(config);
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
// Wire up events
apnsBroker.OnNotificationFailed += (notification, aggregateEx) =>
{
aggregateEx.Handle(ex =>
{
// See what kind of exception it was to further diagnose
if (ex is ApnsNotificationException notificationException)
{
// Deal with the failed notification
var apnsNotification = notificationException.Notification;
var statusCode = notificationException.ErrorStatusCode;
Console.WriteLine($"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}");
}
else
{
// Inner exception might hold more useful information like an ApnsConnectionException
Console.WriteLine($"Apple Notification Failed for some unknown reason : {ex.InnerException}");
}
// Mark it as handled
return true;
});
};
apnsBroker.OnNotificationSucceeded += (notification) =>
{
Console.WriteLine("Apple Notification Sent!");
};
// Start the broker
apnsBroker.Start();
apnsBroker.QueueNotification(new ApnsNotification
{
DeviceToken = "d30710c34af48d65e02db4c3db60fae04d283efaa105633f7c41b8d1963628fe",
Payload = JObject.Parse("{\"aps\":\"\"}")
});
// Stop the broker, wait for it to finish
// This isn't done after every message, but after you're
// done with the broker
apnsBroker.Stop();
Console.ReadLine();
}
}
}
2019-12-19 08:39:24.AM [DEBUG] Scaled Changed to: 1
2019-12-19 08:39:24.AM [INFO] Stopping: Waiting on Tasks
2019-12-19 08:39:24.AM [INFO] Waiting on all tasks 1
2019-12-19 08:39:25.AM [INFO] APNS-Client[1]: Sending Batch ID=1, Count=1
2019-12-19 08:39:25.AM [INFO] APNS-Client[1]: Connecting (Batch ID=1)
2019-12-19 08:39:25.AM [INFO] APNS-Client[1]: Connected (Batch ID=1)
2019-12-19 08:39:25.AM [INFO] APNS-Client[1]: Sent Batch, waiting for possible response...
2019-12-19 08:39:26.AM [INFO] APNS-Client[1]: Received -1 bytes response...
2019-12-19 08:39:26.AM [INFO] APNS-Client[1]: Batch (ID=1) completed with no error response...
2019-12-19 08:39:26.AM [INFO] APNS-Client[1]: Done Reading for Batch ID=1, reseting batch timer...
Apple Notification Sent!
2019-12-19 08:39:26.AM [INFO] All Tasks Finished
2019-12-19 08:39:26.AM [INFO] Passed WhenAll
2019-12-19 08:39:26.AM [INFO] Broker IsCompleted
2019-12-19 08:39:26.AM [DEBUG] Broker Task Ended
2019-12-19 08:39:26.AM [INFO] Stopping: Done Waiting on Tasks
//Sorry for the comments
public class DevicesController : ApiController
{
// GET request to webServiceURL/version/devices/deviceLibraryIdentifier/registrations/passTypeIdentifier
[HttpGet]
public HttpResponseMessage GetSerialNumber(string deviceLibraryIdentifier, string passTypeIdentifier)
{
System.IO.File.AppendAllText(@"updates.txt", "Device requested serial numbers S");
System.IO.File.AppendAllText(@"updates.txt", System.Environment.NewLine);
// For example...
SerialNumbers lastUpdateToSerialNumDict = new SerialNumbers();
// LastUpdated timestamp set to current datetime
lastUpdateToSerialNumDict.lastUpdated = String.Format("{0:MM/dd/yyyy HH:mm:ss}", DateTime.Now);
// A list of serial numbers got from database
lastUpdateToSerialNumDict.serialNumbers = new List<string>();
lastUpdateToSerialNumDict.serialNumbers.Add("123456789");
string jsonRes = JsonConvert.SerializeObject(lastUpdateToSerialNumDict);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonRes, Encoding.UTF8, "application/json");
return response;
}
// GET request to webServiceURL/version/devices/deviceLibraryIdentifier/registrations/passTypeIdentifier?passesUpdatedSince=tag
[HttpGet]
public HttpResponseMessage GetSerialNumber(string deviceLibraryIdentifier, string passTypeIdentifier, string passesUpdatedSince)
{
System.IO.File.AppendAllText(@"updates.txt", "Device requested serial numbers C");
System.IO.File.AppendAllText(@"updates.txt", System.Environment.NewLine);
// For example...
SerialNumbers lastUpdateToSerialNumDict = new SerialNumbers();
// LastUpdated timestamp set to current datetime
lastUpdateToSerialNumDict.lastUpdated = String.Format("{0:MM/dd/yyyy HH:mm:ss}", DateTime.Now);
// A list of serial numbers got from database
lastUpdateToSerialNumDict.serialNumbers = new List<string>();
lastUpdateToSerialNumDict.serialNumbers.Add("123456789");
string jsonRes = JsonConvert.SerializeObject(lastUpdateToSerialNumDict);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonRes, Encoding.UTF8, "application/json");
return response;
}
// POST request to webServiceURL/version/devices/deviceLibraryIdentifier/registrations/passTypeIdentifier/serialNumber
[HttpPost]
public HttpResponseMessage RegisterDevice(string deviceLibraryIdentifier, string passTypeIdentifier, string serialNumber, [FromBody]HR.CardApi.Api.Models.DevicesPayload payload)
{
//ApiLog
System.IO.File.AppendAllText(@"ApiLog.txt", "devices/register was used");
System.IO.File.AppendAllText(@"D:\FGC-Microservice\HR.CardApi.DDC_31072019\HR.CardApi.Api\bin\ApiLog.txt", System.Environment.NewLine);
//ApiLog
System.IO.File.AppendAllText(@"data.txt", deviceLibraryIdentifier);
System.IO.File.AppendAllText(@"data.txt", System.Environment.NewLine);
System.IO.File.AppendAllText(@"data.txt", passTypeIdentifier);
System.IO.File.AppendAllText(@"data.txt", System.Environment.NewLine);
System.IO.File.AppendAllText(@"data.txt", serialNumber);
System.IO.File.AppendAllText(@"data.txt", System.Environment.NewLine);
System.IO.File.AppendAllText(@"data.txt", payload.pushToken);
System.IO.File.AppendAllText(@"data.txt", System.Environment.NewLine);
System.IO.File.AppendAllText(@"data.txt", System.Environment.NewLine);
System.Net.Http.HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
// DELETE request to webServiceURL/version/devices/deviceLibraryIdentifier/registrations/passTypeIdentifier/serialNumber
[HttpDelete]
public HttpResponseMessage UnRegisterDevice(string deviceLibraryIdentifier, string passTypeIdentifier, string serialNumber)
{
//Udpate Devices and Register table
System.Net.Http.HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
}
{
"passTypeIdentifier": "SAME_AS_IN_KEYCHAIN",
"formatVersion": 1,
"serialNumber": "123456789",
"description": "CONFIDENTIAL",
"organizationName": "CONFIDENTIAL",
"teamIdentifier": "CONFIDENTIAL",
"voided": false,
"barcodes": [
{
"format": "PKBarcodeFormatPDF417",
"message": "1234587568464654",
"messageEncoding": "ISO-8859-1"
}
],
"storeCard": {
"headerFields": [],
"primaryFields": [],
"secondaryFields": [],
"auxiliaryFields": [
{
"key": "offer",
"label": "Initial Pass",
"value": "8979787645464654"
}
],
"backFields": [
{
"key": "CONFIDENTIAL",
"label": "CONFIDENTIAL",
"attributedValue": "CONFIDENTIAL",
"value": "CONFIDENTIAL"
}
]
},
"authenticationToken": "wxyzd7J8AlYYFPS0k0a0FfVFtq0ewzEfd",
"webServiceURL": "https://CONFIDENTIAL.com"
}
最佳答案
我想出了问题所在。有问题的代码是正确的。它没有错误。
当设备请求序列号时,API 返回 HTTP 404。这是因为我的通行证的 passTypeIdentifier 中包含点。就像 pass.acbcd.abcd。
我刚刚将我的 API 配置为允许 url 中的点,一切都开始正常工作。
关于apple-push-notifications - Apple Wallet/Passbook 通知无法发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59411338/
我正在使用 php-pkpass 库来创建通行证。现在一次只能添加 1 个 channel ,我想一次添加多个 channel 。可以这样做吗? 谢谢, 最佳答案 我一直看到“否”的答案,但我一直看到
我创建了一个通行证文件并添加到钱包中。我想知道我错过了什么会在通行证后面显示自动更新选项? 就像这张图片:https://dxjl3qy52c1o9.cloudfront.net/wp-content
我正在尝试使用 relevantDate 来优化何时显示我的应用程序的通行证。 我知道的相关日期选项是:指定一天的开始和结束时间,或者指定一个时间,它似乎在锁定屏幕上显示通行证在任一方向大约四个小时的
可以包含在 pkpass 包中的 pass 图像(例如 background.png、logo.png)的正确尺寸是多少? 最佳答案 图像尺寸在 Passbook Programming Guide:
我已成功集成 passkit,但在通过推送通知更新存折时遇到问题。钱包已成功收到通知,但通行证未更新。 以下是我已经实现的步骤: 使用 XMPP 服务器 (PHP)。 在 php 中使用此库生成通行证
我已成功为某个事件创建了 Apple Passbook,但我有点担心相关日期和位置,因为相关日期是 2017-11-07T22:42:39-05:00在存折上,我关心的是我的事件是 Monday
我正在使用用于在iOS中创建登机牌的存折功能,可以创建单个登机牌,并且运行良好,但是在尝试创建多个登机牌时,遇到以下问题: 我可以获取计数,但是在回顾时所有的通行证都被最后一张替换了 选择“全部保存”
我按照文章 here 创建了我的第一个 Passbook 通行证。 { "formatVersion" : 1, "passTypeIdentifier" : "pass.com.mypass
根据 Passbook 编程指南,我需要一台服务器来为 Passbook 创建 Pass。有没有办法在 iOS 设备本地生成 Passbook 的 .pkpass 而无需涉及服务器?如果有办法做到这一
我正在尝试通过调用 -replacePassWithPass: 并传递与 PKPassLibrary 中已存在的完全相同的通行证来更新 Passbook 中的通行证。方法返回 NO(替换失败) - 为
当用户使用 PassKit 扫描我的应用程序生成的通行证时,是否可以在 Safari 中打开预定义的链接?我在 official documentation 中找不到这个.有什么提示吗? 这里似乎没有
我正在为 Passbook 制作通行证,我们有一部分数据作为电话号码链接,但实际上是成员(member)号码。有没有办法表明传球中的后场不应链接为电话号码?我很想禁用它,以便我们可以正确地格式化我们的
Apple在Passkit中提供了一个专门的方法来判断PassLibrary是否可用: [PKPassLibrary isPassLibraryAvailable] 这在 iPhone 和 iPad
我必须将 Passbook 与一个提供 PDF417 条形码的网站集成,该条形码的数据以二进制(而不是文本)编码,例如: 有什么方法可以在 pass.json 中对这个二进制 block 进行编码,以
我刚刚开始实现我的存折 Web 服务。 在文档中我看到有一个可选的日志端点,但不明白什么使用/使用这个端点? 据我所知,它仅供希望检查日志的人使用。 为了清楚起见,Apple 的文档说应该可以通过 访
我正在编写一个 shell 脚本,以使用 p12 证书从 manifest.json 自动生成 Apple Passbook 签名文件。这是我所做的: openssl pkcs12 -passin p
我正在尝试使用 Passbook API 发送一些推送通知。我创建了以下发送到 APNS 服务器的 JSON 对象: $payload = json_encode(array('aps' => arr
我正在使用 passkit(java)。我创建了通行证并尝试从 safari 安装。 当我从 mac mini safari 下载通行证时,它会下载并显示通行证。但是当从 iphone6 和 ipho
我试图通过互联网上的大量资源(包括 Passbook 文档)找到解决方案,但没有成功。 我知道可以在 Passbook 背面添加超链接,但我无法使用。 我正在尝试创建一个存折,顶部有 Logo 、日期
我所有的 Passbook 环境都工作正常(基于 PHP/MySQL 的服务器用于生成和签名,以及下载通行证 - 基于 webview 的下载,通过电子邮件发送通行证或使用 PassKit 在我的应用
我是一名优秀的程序员,十分优秀!