我有一个应用程序,在viewController上,我有一个简单的webview,我正在加载我的网站,比如https://mywebsite.com。
现在我想把设备令牌发送到与cookie相同的网站,但是由于某种原因,我不能访问viewDidLoad方法中的设备令牌。
代码如下所示。
- (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];
}
它仍然不能在真正的设备上工作。我在这里做错什么了?
谢谢你
AppDelete没有名为strDeviceToken的成员变量,因此您可能会遇到编译器错误。您可以做几件事,一件是将它存储到委托中的nsuserdefaults中,然后在控制器中从中读取它。
@DonaldTrumpateMyhamster我已经更新了相关代码。请告诉我如何访问viewDidLoad方法中的变量token。
对于每个set方法都有一个对应的get方法。
@DonaldTrumpatemyhamster我确实像你说的那样使用了NSUserDefaults,但它仍然不起作用。我已经编辑了代码。
您是否检查过您是否能够获得设备令牌?你有突破点吗
@Joshua我不知道怎么检查,因为在模拟器设备中,我想ken不起作用。但当我安装这个应用程序时,它确实要求获得接收通知的权限。我还能怎么检查?
连接设备并从那里调试。然后在did registerforremote上放置断点…检查strdevicetoken值
@是的,我试过你说的。我确实得到了devicetoken,但是在调试会话中,我可以说viewDidLoad函数是先执行的,AppDelegate.didRegisterForRemoteNotificationsWithDeviceToken函数是稍后执行的。不管怎样?
好吧,您可以看看通知,其中如果您设法接收到设备注册,您可以发送通知通知VC或使用委托。然后在通知/委托调用后重新加载WebView
@约书亚,我不完全理解你对风投或代表团的意思。但我认为重新加载UIwebView看起来并不是很好的编程。网站内的webview会先加载,收到设备后再重新加载,不喜欢这样的想法。还有其他选择吗?
那只是我的两分钱。vc=视图控制器。我不确定您的WebView在做什么,我只是假设用所需的参数重新加载一个页面是可以的。您也可以在实际初始化WebView之前等待它。
@Joshua如何在初始化WebView之前等待它??
@米凯洛斯用木块。
@费利克斯感谢您的输入,但我现在的问题是应用程序的生命周期,它先执行ViewController,然后执行AppDelegate.didRegisterForNotification方法。所以我的webview是先加载的,稍后我会得到devicetoken。
如何在初始化WebView之前"等待"令牌:使用nsnotificationcenter(broadcast-receiver)模式从app delegate将令牌发送到具有WebView的VC。一旦在您的VC中收到令牌,将其添加到cookie中,请求该网站。等待令牌时放置加载指示器。我已经更新了下面的答案。
您当前的情况是,当您在应用程序委托中注册远程通知时,在调用DidRegisterForRemoteMotificationWithDeviceToken之前,您已经初始化了视图控制器(VC),并且在获取设备令牌之前正在调用ViewDidLoad方法。
你的应用程序流程应该是这样的
i.应用程序内委托didFinishLaunchingWithOptions方法,注册远程通知。
二。在带有devicetoken回调函数的didregisterforremotenotifications中,您应该在一秒钟内收到设备令牌。
iii.如果启动视图控制器的应用程序内委托,则可以在视图控制器中执行公共功能:
- (void)requestWebViewWithToken:(NSString *)token {
// You code - storing token in cookies and request webview.
}
iv.只有在获得令牌时,才使用devicetoken调用didregisterforremotenotifications中的函数。有很多选择。您可以使用nsnotificationCenter、自定义委托、公共方法(如上所述)或静态方法。
"But i think reloading UIwebView doesnt seem like good programming. Website inside webview will be loaded first and after receiving deviceToken reloaded,dont like the idea of that"
当需要而不是多余的时候重新加载WebView是可以接受的。对于您的案例,您可以在viewdidload中显示和动画活动指示器视图(加载指示器)。
仅在收到令牌时加载WebView。获取令牌只需1秒钟,因此在获取令牌后等待加载WebView不会导致用户体验缺陷。
最后,您可能需要处理用户没有打开以接收推送通知或没有Internet连接等情况…
解决方案:
在AppDelegate.m中,在DidRegisterforRemoteMotificationWithDeviceToken委托中,
[[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"];
}