我正在尝试将通知添加到我的Azure移动应用程序(Azure应用服务移动应用程序)中,并且很难让他们使用iOS。我已成功让他们为Android工作。
我已按照在线说明设置Apple证书和配置文件:
https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter5/ios/
iOS应用程序正在注册APNS并收到设备令牌。然后我删除了'<'和'>'字符和空格,并将注册发送到通知中心。
var templates = new JObject
{
["genericMessage"] = new JObject
{
{"body", "{\"aps\":{\"alert\":\"$(message)\"}}"}
}
};
var push = m_MobileServiceClient.GetPush();
await push.RegisterAsync(token, templates);
当我发送推送通知的第一个请求时......
var notification = new Dictionary<string, string> { { "message", "Test notification message" } };
await m_Hub.SendTemplateNotificationAsync(notification);
...注册已从通知中心删除。
我已将Azure Notification Hub上的定价层提升至标准版,并使用它来查找存储在存储帐户中的跟踪,并显示&#34; InvalidToken&#34;作为APNS的错误。
我做过/检查的事情:
我在Info.plist中添加了以下内容(并非所有说明都包括在内,但其他文章建议这是必需的)
<key>aps-environment</key>
<string>development</string>
我试图解决的问题
我仍然继续得到&#34; InvalidToken&#34;。
有没有人有任何想法我可能做错了什么?
修改
APNS的DeviceToken(删除空格和&#39;&#39;&#39;&#39;字符后)长度为64个字符。我已经检查过,这是我在客户端获得并发送到通知中心的内容。但是当我查看通知中心时,我得到一个长度为128个字符的DeviceToken。
这似乎是问题的原因。这些是我在移动端的日志(我输出到输出窗口)
RegisteredForRemoteNotifications解雇&lt; 7012d5d7 66e3d765 de017f65 a58e0dfb 461a6b77 9c57b6c6 60040f64 95ea20ab&gt;
Reg with NH:7012D5D766E3D765DE017F65A58E0DFB461A6B779C57B6C660040F6495EA20AB
但这是设备注册中显示的内容(调用https:// {my_namespace} .servicebus.windows.net / {my_hub} / installations / {installationid}?api-version = 2015-01
{
"installationId": "{installationId}",
"pushChannel": "37303132443544373636453344373635444530313746363541353845304446423436314136423737394335374236433636303034304636343935454132304142",
"pushChannelExpired": false,
"platform": "apns",
"expirationTime": "9999-12-31T23:59:59.9999999Z",
"tags": [
...
],
"templates": {
"genericMessage": {
"body": "{\"aps\":{\"alert\":\"$(message)\"}}",
"tags": [
"genericMessage"
]
}
}
}
通过使用REST API将安装设置为客户端日志中列出的DeviceToken,我成功地使Notification成功运行。
如果我重新启动应用程序,当我向Notification Hub重新注册时,值会更改,因此在调用NotificationHubClient之后的某个地方,值正在被更改!
编辑2
我已将httpclient流量写入输出窗口,看来这是一个客户端问题,因为在调用服务器时DeviceToken不正确:
Method: PUT,
RequestUri: 'https://{my_namespace}/push/installations/5ed26cac-2735-4d58-91f4-2220569a3f0c',
Version: 1.1,
Content: System.Net.Http.StringContent,
Headers:
{
X-ZUMO-INSTALLATION-ID: 5ed26cac-2735-4d58-91f4-2220569a3f0c
X-ZUMO-AUTH: ...
Accept: application/json
User-Agent: ZUMO/3.1 (lang=Managed; os=iOS; os_version=10.3.2; arch=MacOSX; version=3.1.50105.0)
X-ZUMO-VERSION: ZUMO/3.1 (lang=Managed; os=iOS; os_version=10.3.2; arch=MacOSX; version=3.1.50105.0)
ZUMO-API-VERSION: 2.0.0
Content-Type: application/json; charset=utf-8
}
{
"pushChannel": "37303132443544373636453344373635444530313746363541353845304446423436314136423737394335374236433636303034304636343935454132304142",
"platform": "apns",
"templates": {
"genericMessage": {
"body": "{\"aps\":{\"alert\":\"$(message)\"}}"
}
}
}
答案 0 :(得分:2)
这个问题变得非常简单:
我正在调用注册码:
var token = DeviceToken.Description.Trim('<', '>').Replace(" ", "").ToUpperInvariant();
var templates = new JObject
{
["genericMessage"] = new JObject
{
{"body", "{\"aps\":{\"alert\":\"$(message)\"}}"}
}
};
var push = m_MobileServiceClient.GetPush();
await push.RegisterAsync(token, templates);
DeviceToken
的类型为NSData
这意味着我将string
传递给RegisterAsync
的第一个参数,但它需要NSData
类型。必须有从string
到NSData
的隐式强制转换,因此它仍然编译并运行,但是给出了错误的值。
修复方法是删除字符串处理并将其保留为NSData
类型。我发现RegisterAsync
method already does this processing for you!