android webview先验证令牌后访问网页,关于iOS:将设备令牌token从viewdidload发送到WebView...

我有一个应用程序,在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"];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值