寻求与管理 iBeacon 本地通知相关的最佳实践建议

Posted

技术标签:

【中文标题】寻求与管理 iBeacon 本地通知相关的最佳实践建议【英文标题】:seeking Best practice advice related to managing iBeacon localnotifications 【发布时间】:2014-02-27 15:35:45 【问题描述】:

我有一个带有 (~45) 个 uiviewControllers 负载的故事板应用程序。无论是在后台还是前台,当信标触发 uilocalnotification 并且用户接受它时,我想“推送/继续”到与该信标触发器关联的 UIViewController。很简单。根据信标的不同,我有大约 10 个不同的 VC 可供选择。

我的问题是这样的。当信标触发通知时,用户实际上可能坐在我的 45 个 UIViewCtrlers 中的任何一个,因此我的每个 UIViewControllers 都必须具有类似于下面的内容(以及选择器的代码块),以便采取行动通知并推送/继续到另一个视图控制器。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(showFoodMenuViewNow)
                                             name:@"showfoodmenu" object:nil];

这将使我的故事板充满更多的跨 VC 推送/segue 连接,而你无法动摇。很乱。有没有办法消除所有的视觉故事板转场,或者以某种方式引入一个所有视图转场的单一“矢量视图控制器”。然后,该 VC 将评估 localnotification 并推送到关联的 VC。

管理此问题的推荐最佳做法是什么?

希望我说得通。

更新:

我现在切换了路径,尝试直接从我的 appDelegate 访问 UINavigationController。我正在使用以下代码来执行此操作,虽然我的 nc 不是 nil,但没有推送任何视图...

为什么这段代码不会推送所需的视图控制器?

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
nm_vcFoodMenu *fm = [sb instantiateViewControllerWithIdentifier:@"foodmenu"];
UINavigationController *nc = [sb instantiateViewControllerWithIdentifier:@"myNavController"];
if (nc == nil)
    NSLog(@"nc is nil");
 else 
    NSLog(@"nc is not nil so trying to push to foodmenu");
    [nc pushViewController:(nm_vcFoodMenu *)fm  animated:YES];

这是我的故事板和各种活动部件的描述。希望这能帮助你帮助我!

谢谢。

【问题讨论】:

【参考方案1】:

我并没有声称对此有一个好的解决方案,但以下是我为它的价值所做的事情。我也想知道是否有人有更好的解决方案。

    我在 AppDelegate 中以编程方式管理 iBeacon 转换,而无需在情节提要中进行任何设置。

    我特别注意两个 iBeacon 不会导致两个过渡在时间上彼此过于接近(自上次过渡以来必须至少经过几秒钟,否则我会使用计时器延迟过渡或抑制它。)

    在导航控制器中管理堆栈真的很痛苦。只有在我知道我希望用户能够返回的特定情况下,我才会执行[navigationController pushViewController:newViewController animated:YES]。在某些情况下,我最终会用[self.navigationController setNavigationBarHidden:YES animated:YES]; 抑制ViewControllers 中的后退按钮

诚然,所有这一切都非常混乱。但考虑到基于 iBeacon 的转换可能发生的动态特性,我认为通常很难提前设置所有组合。

【讨论】:

大卫,我也有我的 appdelegate 作为 ibeacon/notification 代表,并尝试做你描述的事情,但我无法在没有在情节提要中涉及相应的 segue 的情况下在代码中进行 segue。你能提供从 appDelegate(uilocalnotification delegate) 到指定 UIViewController 的 segue 的 sn-p 吗?正如我上面提到的,为了支持 SWRevealViewController 机制,我的一些 segue 是自定义类型。 (它是提供侧滑菜单的开源模块)。我所有的 uilocalNotifications 都需要触发对这些类型的 uiviewcontroller 之一的 segue。 是的,上面其实有一个sn-p——超级简单。我只是在我的 AppDelegate 中保留对 NavigationController 的引用,然后调用:[navigationController pushViewController:newViewController animated:YES] 我尝试了上述方法,但由于我使用的是故事板,所以我想要“跳转”的视图控制器都不存在。我正在尝试处理我想要转到的视图控制器... -(void)application:(UIApplication )application didReceiveLocalNotification:(UILocalNotification *)notification nm_vcMenu *fm = [[UIStoryboard storyboardWithName:@"MainStoryboard " bundle:NULL] instantiateViewControllerWithIdentifier:@"foodmenu"]; UINavigationController nc = self.window.rootViewController.navigationController; [nc pushViewController:fm 动画:NO]; // 我没有得到任何结果 - 有什么想法吗? 检查你创建的所有对象都不为零。一个常见的问题,它是 nil UINavigationController,所以没有推送。 试着把你的过渡作为这样的块:[[NSOperationQueue mainQueue] addOperationWithBlock:^ ... ];【参考方案2】:

在我们的项目中,我们创建了作为 iBeacon 委托的专用单例,并将通知界面呈现在顶部视图控制器上,因此所有逻辑都包含在一个地方,无需在其他视图控制器中进行修改。

【讨论】:

谢谢,贤者。这是否意味着单例需要简单地获取顶部视图控制器的句柄,并且特定于每个通知的 segues 将存在于从单例到每个通知目标视图的情节提要中。或者segues是否需要来自顶部视图控制器?我唯一担心的另一个问题是,我还使用 SWRevealViewControler 开源界面来提供从侧面平移的滑块菜单。你认为这会给工作带来麻烦吗? 这是我几天前发布的关于这个主题的一个未回答的问题...***.com/q/21884926/615518

以上是关于寻求与管理 iBeacon 本地通知相关的最佳实践建议的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序被用户终止时的 iBeacon 通知(通过在任务视图中向上滑动)

关于举办Oracle高级管理与性能调优最佳实践 培训班的通知

从本地通知将 iphone 变成 iBeacon

管理一系列相关 iOS 应用程序的最佳实践

在 Angular 2/4/6 应用程序中管理状态的最佳实践

应用关闭时的 iBeacon 通知