来自 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 > App Services > your Mobile App backend > Settings > Mobile > Push > Apple Push Notification Services > 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 错误
在 Cordova/Phonegap 上使用 iOS 徽章的 Azure 推送通知
如何在 iOS 的 Azure 移动应用通知中心注册目标推送通知