来自 IOS Xcode 的 Azure 推送通知错误

Posted

技术标签:

【中文标题】来自 IOS Xcode 的 Azure 推送通知错误【英文标题】:Azure Push Notification Error from IOS Xcode 【发布时间】:2016-05-11 22:27:22 【问题描述】:

我觉得我是世界上第一个尝试让 ios swift 与 Azure 一起工作的人,但没有太多帮助。 我关注了这个Create an iOS app 然后Add Push Notifications to your iOS App。我应该能够从 iPhone 成功推送通知,但我收到此错误。顺便说一句:我可以让我的 C# 代码在我的电脑的 Visual Studio 中触发(使用这个tutorial),所以请求似乎有效,但响应很糟糕。任何人都知道如何解决它!

Error registering for notifications:  Optional("Error Domain=com.Microsoft.MicrosoftAzureMobile.ErrorDomain Code=-1302 \"\"message\":\"An error has occurred.\"\" UserInfo=com.Microsoft.MicrosoftAzureMobile.ErrorRequestKey=<NSMutableURLRequest: 0x14cebf780>  URL: http://<mysite>.azurewebsites.net/push/installations/1E32E9B5-E976-4CCD-BD61-D026D3F4FF1C , com.Microsoft.MicrosoftAzureMobile.ErrorResponseKey=<NSHTTPURLResponse: 0x14cec54b0>  URL: http://<mysite>.azurewebsites.net/push/installations/1E32E9B5-E976-4CCD-BD61-D026D3F4FF1C   status code: 500, headers \n    \"Content-Length\" = 36;\n    \"Content-Type\" = \"application/json; charset=utf-8\";\n    Date = \"Wed, 11 May 2016 21:39:39 GMT\";\n    Server = \"Microsoft-IIS/8.0\";\n    \"Set-Cookie\" = \"ARRAffinity=8d79cd782ff16b44f7f280b76e2bc5564d86e0d1b228227b8e0033f4bb1c4582;Path=/;Domain=<mysite>.azurewebsites.net\";\n    \"X-Powered-By\" = \"ASP.NET\";\n , NSLocalizedDescription=\"message\":\"An error has occurred.\"")

更新 #1 我拥有的唯一网址是每个教程中的网址。其余代码与我在链接中提到的代码相同(我一个字符一个字符地复制了它):

class ClientManager 
    static let sharedClient = MSClient(applicationURLString: "http://<mysite>.azurewebsites.net")

更新 #2 @Pau Senabre 根据我的问题,我正在使用 swift 而不是 Objective-C(请参阅我有问题的标签),所以我在您的步骤 1 中没有 .m 文件。我也没有你提到的 logErrorIfNotNil。我的方法(由 Azure 修改前生成)如下所示:

@IBAction func addItem(sender : AnyObject) 
    self.performSegueWithIdentifier("addItem", sender: self)


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!)

    if segue.identifier == "addItem" 
        let todoController = segue.destinationViewController as! ToDoItemViewController
        todoController.delegate = self
    

更新 #3 @Pau Senabre 我的目标是做移动应用程序/服务,而不是移动参与。查看区别here。顺便说一句:当我开始使用它并为我工作时,我遵循了 azure 参与示例。但我现在需要的是网络/移动应用程序。那么,您的建议是否仍然适用于我的需求?

【问题讨论】:

类似问题:***.com/questions/35398851/… 完全不同,怎么相似!? 【参考方案1】:

你能发布一些代码吗?我认为您可能在某个地方使用了错误的 URL。

【讨论】:

嗯,您的 ApplicationKey 条目在哪里?根据 Azure 和 Xamarin Forms 的个人经验,我知道 Microsoft 的文档有时有点不可靠(如果您查看他们提供的屏幕截图,您会发现它仍然在 iOS 6 上,所以它已经过时了),没有应用程序密钥,您不能正确验证,因此您无法访问通知中心。尝试将 sharedClient 初始化程序更改为 MSClient(applicationURLString: "[url]", applicationKey: "[key]") 随着对 azure 门户的所有更改,许多事情都被遗漏了。我找不到应用程序 ID。 尝试查看您的移动应用程序的应用程序设置或转到 https://[mysite].scm.azure-mobile.net/Env 并检查环境变量部分 我刚刚在 Azure 中创建了一个全新的移动应用程序,发现它不再有 ApplicationKey,我正在为工作做的项目现在大约一年了,当时他们仍在使用应用程序密钥登录 与移动服务不同,您不再需要移动应用的应用程序密钥(除非您将该功能明确添加到后端),因此这不会是问题。【参考方案2】:

更新 #2 检查以下链接: https://github.com/Azure/azure-content/blob/master/articles/mobile-engagement/mobile-engagement-ios-swift-get-started.md

Modify your Application Delegate 部分中,确保您创建了一个覆盖模块,并且您现有的 Engagement 初始化具有所有 init 值。

EngagementAgent.init("Endpoint=YOUR_APP_COLLECTION.DOMAIN;SdkKey=YOUR_SDK_KEY;AppId=YOUR_APPID", modulesArray:[reach])

Error Domain=com.Microsoft.MicrosoftAzureMobile.ErrorDomain Code=-1302 提供的错误代码与错误请求匹配。如果要输入一些数据,请事先进行数据输入验证:

1 在 TodoService.m 文件中,找到 addItem 方法搜索 [self logErrorIfNotNil:error];行代码。在该代码行下方,将完成块的其余部分替换为以下代码,以检查请求中是否存在错误,以及该错误代码是否为 –1302,指示错误请求:

BOOL badRequest = ((error) && (error.code == -1302));

// detect text validation error from service.

if (!badRequest) // The service responded appropriately



    NSUInteger index = [itemscount];

    [(NSMutableArray *)itemsinsertObject:result atIndex:index];

    // Let the caller know that we finished

    completion(index);


2 构建并运行;您可以在 Xcode 输出窗口中看到来自服务的错误请求错误已得到处理: 2012-10-23 22:01:32.169 快速入门[5932:11303] 错误错误域=com.Microsoft.WindowsAzureMobileServices.ErrorDomain 代码=-1302“文本长度必须小于 10” UserInfo=0x7193850 NSLocalizedDescription=文本长度必须小于 10,com.Microsoft.WindowsAzureMobileServices.ErrorResponseKey=, com.Microsoft.WindowsAzureMobileServices.ErrorRequestKey=https://task.azure-mobile.net/tables/TodoItem>

3 最后,在TodoService.m 文件中,找到logErrorIfNotNil 方法,该方法将错误记录到输出窗口。在 if 代码块中,在 NSLog(@”ERROR %@”, error); 行下方添加以下 if 块:

// added to display description of bad request

if (error.code == -1302)

    UIAlertView *av =

    [[UIAlertView alloc]

      initWithTitle:@”Request Failed”

      message:error.localizedDescription

      delegate:nil

      cancelButtonTitle:@”OK”

      otherButtonTitles:nil

     ];

    [av show];


此外,请查看 Azure 设置中的以下步骤,也许您在某些时候遗漏了某些内容: https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-ios-get-started-push/

1 创建通知中心

这会创建一个新的通知中心并将其连接到您的移动应用。如果您有一个现有的通知中心,您可以选择将其连接到您的移动应用后端,而不是创建一个新的。

2 为推送通知注册应用

为您的应用注册一个应用 ID。创建一个明确的 App ID(不是通配符 App ID),对于 Bundle ID,使用 Xcode 快速入门项目中的确切 Bundle ID。检查推送通知选项也很重要。

接下来,配置推送通知。您可以创建“开发”或“分发”SSL 证书(请记住稍后在 Azure 门户中选择相应的选项。)

3 配置 Azure 以发送推送通知

在 Azure 门户中,单击浏览All &gt; App Services &gt; your Mobile App backend &gt; Settings &gt; Mobile &gt; Push &gt; Apple Push Notification Services &gt; Upload Certificate。上传.p12文件,选择正确的Mode(对应你之前生成的客户端SSL证书是Development还是Distribution。)

4 更新服务器项目以发送推送通知PostTodoItem方法替换为以下代码:

public async Task<IHttpActionResult> PostTodoItem(TodoItem item)

    TodoItem current = await InsertAsync(item);
    // Get the settings for the server project.
    HttpConfiguration config = this.Configuration;

    MobileAppSettingsDictionary settings = 
        this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();

    // Get the Notification Hubs credentials for the Mobile App.
    string notificationHubName = settings.NotificationHubName;
    string notificationHubConnection = settings
        .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;

    // Create a new Notification Hub client.
    NotificationHubClient hub = NotificationHubClient
    .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);

    // iOS payload
    var appleNotificationPayload = "\"aps\":\"alert\":\"" + item.Text + "\"";

    try
    
        // Send the push notification and log the results.
        var result = await hub.SendAppleNativeNotificationAsync(appleNotificationPayload);

        // Write the success result to the logs.
        config.Services.GetTraceWriter().Info(result.State.ToString());
    
    catch (System.Exception ex)
    
        // Write the failure result to the logs.
        config.Services.GetTraceWriter()
            .Error(ex.Message, null, "Push.SendAsync Error");
    
    return CreatedAtRoute("Tables", new  id = current.Id , current);

【讨论】:

你好像能救我。请查看我的更新#2 你看到我的最后一个问题了吗:Update#3?【参考方案3】:

这是我之前提出的另一个问题的正确答案,它同时修复了:注册和接收推送通知。我在here说过这个:

我昨晚终于可以收到通知了。我继续使用本教程重新完成了所有苹果端安装步骤的完整演练:使用 Azure 通知中心向 iOS 发送推送通知,然后使用这个:创建 iOS 应用程序并将推送通知添加到您的iOS 应用程序。这样就成功地注册了设备的应用程序,我可以在这个线程中使用 AdrianHall 的注释进行验证。但这还不够。 Azure 教程未能详细说明 Xcode 中所需的步骤,我在这里找到了这些步骤:[How To] Setup Remote Push Notification in iOS - Swift 2.0 Code 我不必在 Xcode 中设置任何“推送通知”或类似的东西。

我希望这个详细的答案可以为您节省大量时间。

【讨论】:

以上是关于来自 IOS Xcode 的 Azure 推送通知错误的主要内容,如果未能解决你的问题,请参考以下文章

来自 Azure 网站的 Android 推送通知出现 401 错误

来自数据库表的 Azure 移动服务推送通知

在 Cordova/Phonegap 上使用 iOS 徽章的 Azure 推送通知

如何在 iOS 的 Azure 移动应用通知中心注册目标推送通知

如何将原始推送通知从 Azure 通知中心发送到 iOS 设备?

Xamarin.iOS 中的 Azure 推送通知不起作用