UIWebViewのcookieの扱い

UIWebViewのcookieの取り扱いをちょっと検証したのでメモ。

  1. cookieの情報そのものはアプリ内で管理されている模様。
    • 依って、アプリをremove後、再インストールするとcookieもエキスパイアされている。
  2. UIWebViewを使用したViewControllerをリリースすると「ブラウザを閉じた」という扱いになる模様。
    • 依って、cookieの「有効期限をブラウザを閉じるまで」とするとcookieもエキスパイアされる。
    • ここがハマりどころだった。
    • サーバ側でcookieの有効期限を変更すると、引き回すことは可能。
  3. webView.delegate = nil; としても「ブラウザを閉じた」とはみなされない
    • 依って、アプリを終了するまでcookieを引き継ぐことが可能。
  4. 別UIWebViewでも、同ドメインの発行cookieであれば参照できる。

以下、検証で使ったコード

ViewController.h

#import <UIKit/UIKit.h>
 
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@property (weak, nonatomic) IBOutlet UILabel *topLabel;
- (IBAction)startView:(UIButton *)sender;
- (IBAction)endView:(UIButton *)sender;
@property (weak, nonatomic) IBOutlet UIWebView *webView_A;
- (IBAction)startView_A:(UIButton *)sender;
 
@end

ViewController.m

#import "ViewController.h"
 
@interface ViewController ()
 
@end
 
@implementation ViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    self.webView.hidden = YES;
    self.webView_A.hidden = YES;
 
}
 
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
- (IBAction)startView:(UIButton *)sender {
    self.topLabel.hidden = YES;
    self.webView_A.hidden = YES;
    self.webView.hidden = NO;
 
    NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.jp/w.php"]];
    [self.webView loadRequest:req];
}
 
- (IBAction)startView_A:(UIButton *)sender {
    self.topLabel.hidden = YES;
    self.webView_A.hidden = NO;
    self.webView.hidden = YES;
    NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.jp/x.php"]];
    [self.webView_A loadRequest:req];
 
}
 
- (IBAction)endView:(UIButton *)sender {
    self.topLabel.hidden = NO;
    self.webView.hidden = YES;
    self.webView_A.hidden = YES;
 
    self.webView.delegate = nil;
    self.webView_A.delegate = nil;
}
@end