使用Xamarin和Azure App Services移动应用程序

时间:2017-07-12 09:06:38

标签: push-notification xamarin.ios apple-push-notifications azure-mobile-services azure-notificationhub

我正在尝试将通知添加到我的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的错误。

我做过/检查的事情:

  • 通知中心作为APNS凭证设置,包含开发证书(从Apple Developer Portal创建并导出已启用推送通知的非通配符应用程序ID)和Sandbox环境。
  • iOS App Project设置为使用开发者身份和App ID链接到的配置文件:

iOS Project Bundle Signing settings

  • 我在Info.plist中添加了以下内容(并非所有说明都包括在内,但其他文章建议这是必需的)

    <key>aps-environment</key>
    <string>development</string>

我试图解决的问题

  • 尝试大写上传DeviceToken
  • 尝试删除空格和/或&#39;&lt;&#39; &#39;&GT;&#39;字符(这样做会产生&#34; InvalidTokenSize&#34;错误导致我认为删除字符 是必需的)
  • 尝试更改通知中心以使用生产推送通知证书(更改证书之间删除的中心)

我仍然继续得到&#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)\"}}"
    }
  }
}

1 个答案:

答案 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类型。必须有从stringNSData的隐式强制转换,因此它仍然编译并运行,但是给出了错误的值。

修复方法是删除字符串处理并将其保留为NSData类型。我发现RegisterAsync method already does this processing for you