将设备令牌从viewDidLoad发送到webView Objective C.

时间:2017-01-04 00:00:15

标签: ios objective-c iphone webview

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

}

它仍然无法在真实设备上运行。我在这做什么错?

谢谢

1 个答案:

答案 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不会导致用户体验缺陷。

最后,您可能需要处理用户未开启接收推送通知或没有互联网连接等情况......

解决方案:

  1. 在AppDelegate.m中,在 didRegisterForRemoteNotificationsWithDeviceToken 委托中,

    [[NSNotificationCenter defaultCenter] postNotificationName:@"device_token_notification"
                                                        object:nil
                                                      userInfo:@{@"token":@"8057b9be2a0caa8802034369fc6035aac9c577180xxxx"}];
    
  2. 在包含webview的vc中,在 viewDidLoad 方法中, 添加此代码:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(requestWebView:)
                                             name:@"device_token_notification"
                                           object:nil];
    
  3. 并创建方法

    - (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"];
    }