在我的应用程序中,在appDelegate文件中,我注册毛发推送通知获取令牌并获取设备UDID。我将这些变量保存为全局变量。
我接下来要做的就是在我的viewController中使用这两个变量连接到一个URL。
然而,当我从viewController调用变量时,它们是(null)。
所以我想也许我对他们做错了。但即使我在appdelegate()和viewcontroller()上发布了一些内容,它首先从viewcontroller中获取nslog ...
这怎么可能,因为新的是appdelegate首先运行,其次我将如何在viewcontroller中使用我在appdelegate上获得的令牌和udid变量?
我的代码如下所示:
在@interface
之前的appdelegate.h中:
extern NSString *newDeviceToken;
extern NSString *udid;
在@implementation
之前的appdelegate.m中:
NSString *newDeviceToken;
NSString *udid;
在我的视图控制器中,我只需导入委托:
#import "AppDelegate.h"
答案 0 :(得分:1)
委托方法:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
你应该得到你的变量,是异步运行的。 是的,它可能会在您的RootViewController初始化后调用。
您不应在ViewController上执行URL连接,因为您可能还没有访问令牌。 您应该自己在委托方法上执行此操作。
现在,如果您想使用ViewController的一个功能而不想在AppDelegate中进行服务器通信,请在AppDelegate中获取对ViewController的引用,将ViewController上的URL函数设为public,并调用它
至于获取对ViewController的引用,如果不知道你的应用程序的设计,这将很难回答。
假设你的应用程序的RootViewController是一个NavigationController,让我们说NavigationController RootViewController被命名为HomeNewViewController,这就是你如何从App Delegate获取它的指针引用:
NavigationController *navigationController = (NavigationController*) [self.window rootViewController];
HomeNewViewController *homeController = (HomeNewViewController*)[navigationController.viewControllers objectAtIndex:0];
然后让我们说在HomeNewViewController中,你有一个名为uploadToken的函数。
然后你可以这样做:
[homeController uploadToken];
并上传。
答案 1 :(得分:1)
application:didRegisterForRemoteNotificationsWithDeviceToken
后,不会立即调用{p> [UIApplication registerForRemoteNotificationTypes:]
。
这意味着您可以在加载视图时获得令牌。将UI与连接代码分开。调用application:didRegisterForRemoteNotificationsWithDeviceToken
时必须触发连接,而不是在视图控制器生命周期的某个时刻触发。请注意,在调用application:didRegisterForRemoteNotificationsWithDeviceToken
之前,还可能会有一个要求用户批准的对话框。