我有一个应用程序,其中viewController
我有一个简单的webView,我正在加载我的网站说https://mywebsite.com
现在我想将设备令牌发送到与cookie
相同的网站,但出于某种原因,我无法使用viewDidLoad
方法访问deviceToken。
代码低于viewController.m
- (void)viewDidLoad {
NSUserDefaults *deviceInfo = [NSUserDefaults standardUserDefaults];
NSString *deviceID = [deviceInfo objectForKey:@"deviceToken"];
[super viewDidLoad];
NSURL *url=[NSURL URLWithString:@"http://staging.mywebsite.com"];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies: cookies];
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"deviceToken" forKey:NSHTTPCookieName];
[cookieProperties setObject:deviceID forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"staging.mywebsite.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"staging.mywebsite.com" forKey:NSHTTPCookieOriginURL];
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
[request setHTTPMethod:@"Post"];
[request setHTTPShouldHandleCookies:YES];
[request setAllHTTPHeaderFields:headers];
[_webView loadRequest:request];
}
我在方法didRegisterForRemoteNotificationsWithDeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSString *strDevicetoken = [[NSString alloc]initWithFormat:@"%@",[[[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""]];
NSUserDefaults *deviceInfo = [NSUserDefaults standardUserDefaults];
[deviceInfo setObject:strDevicetoken forKey:@"deviceToken"];
[deviceInfo synchronize];
}
它仍然无法在真实设备上运行。我在这做什么错?
谢谢
答案 0 :(得分:1)
您目前的情况是,当您在app delegate中注册远程通知时,在调用didRegisterForRemoteNotificationsWithDeviceToken之前,您已经启动了视图控制器(VC)并且在获取设备令牌之前正在调用viewDidLoad方法。
您的应用流程应该是这样的
我。在app delegate didFinishLaunchingWithOptions 方法中,注册远程通知。
II。在一秒钟内,在 didRegisterForRemoteNotificationsWithDeviceToken 回调函数中,您应该收到设备令牌。
III。如果您在应用委托中启动视图控制器,则可以在视图控制器中创建公共功能:
- (void)requestWebViewWithToken:(NSString *)token {
// You code - storing token in cookies and request webview.
}
IV。仅在获得令牌时调用 didRegisterForRemoteNotificationsWithDeviceToken 中的函数。有这么多的选择。您可以使用 NSNotificationCenter , custom delegate ,公共方法(如上所述)或static method。
&#34;但我认为重新加载UIwebView似乎不是很好的编程。 webview中的网站将首先被加载,并且在收到deviceToken后重新加载,不喜欢那个&#34;
的想法
当您需要时,重新加载webview,而不是多余的,是可以接受的。对于您的情况,您可以在viewDidLoad中显示活动指示器视图(加载指示器)并为其设置动画。
仅在收到令牌时加载webview。只需1秒即可获得令牌,因此在获得令牌后等待加载webview不会导致用户体验缺陷。
最后,您可能需要处理用户未开启接收推送通知或没有互联网连接等情况......
解决方案:
在AppDelegate.m中,在 didRegisterForRemoteNotificationsWithDeviceToken 委托中,
[[NSNotificationCenter defaultCenter] postNotificationName:@"device_token_notification"
object:nil
userInfo:@{@"token":@"8057b9be2a0caa8802034369fc6035aac9c577180xxxx"}];
在包含webview的vc中,在 viewDidLoad 方法中, 添加此代码:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(requestWebView:)
name:@"device_token_notification"
object:nil];
并创建方法
- (void)requestWebView:(NSNotification *)noti {
NSDictionary *dict = [noti userInfo];
NSString *deviceToken = dict[@"token"];
// Store token into cookies.
// Request your web.
}
请记住在不需要时取下接收器。
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:@"device_token_notification"];
}