UIAlert 上的用户交互

Posted

技术标签:

【中文标题】UIAlert 上的用户交互【英文标题】:User Interaction on UIAlert 【发布时间】:2016-01-23 17:58:40 【问题描述】:

Facebook Messenger 应用程序在用户与推送通知警报消息交互后自动关闭 UIViewController。 我想知道他们如何检测到用户单击了警报视图上的一项操作。

我尝试过基于推送通知委托方法实现一个具体的解决方案:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError)

不幸的是,这并不可靠,尤其是对于已经注册推送通知的设备。

这是一个 youtube 视频,其工作流程由 Facebook 实现

https://www.youtube.com/embed/sCg3vYx9hlw

更新:

问题在于,当用户之前删除了应用程序并且已经注册了推送通知时,会调用此方法。在这种情况下 isRegisteredForRemoteNotifications 是假的,所以我要求 registerForRemoteNotifications。显示警报时 - 应用程序:didRegisterForRemoteNotificationsWithDeviceToken: 即使用户没有点击警报对话框中的任何选项,也会被调用。

【问题讨论】:

【参考方案1】:

对于 ios8 及更高版本,注册通知如下:

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

并且在用户与推送通知警报消息交互时调用的 AppDelegate didRegisterUserNotificationSettings 方法中,您可以在此处注册通知。在此委托方法中,您可以检查是否允许应用接收推送通知以及通知类型:

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings 
    // here you can check notification settings
    // and do some ui changes

    [application registerForRemoteNotifications];

【讨论】:

我已经用更多细节更新了答案。有时,即使用户没有单击警报对话框中的任何选项,也会调用此方法。 你在谈论registerForRemoteNotificationsisRegisteredForRemoteNotificationsapplication:didRegisterForRemoteNotificationsWithDeviceToken:。我说的是registerUserNotificationSettings。请确保您没有犯错。

以上是关于UIAlert 上的用户交互的主要内容,如果未能解决你的问题,请参考以下文章

禁用 Sprite 上的用户交互

如何在编辑模式下启用 UITableViewCell contentView 上的用户交互?

连接到 Mac 系统时,使用 Xcode UIAutomation 记录 ios 应用程序上的用户交互

UIView - “用户交互启用”父级为假但子级为真?

iOS Metal:启用用户交互

交互式地图上的工具提示