[iOS][Android] WebView の Cookie を削除する方法

eye-catch-ios-and-android

iOS, Android でそれぞれ WebView の Cookie を削除する方法をご紹介します。
結構ハマりました。
WebView は罠が多いですね。

iOS

iOS は WKWebView に関しての方法です。
UIWebView については調べていません。

サンプルコード

- (void)removeAllCookies
{
    NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject;
    NSString *cookiesPath = [libraryPath stringByAppendingPathComponent:@"Cookies"];
    NSString *webKitPath = [libraryPath stringByAppendingPathComponent:@"WebKit"];
    [[NSFileManager defaultManager] removeItemAtPath:cookiesPath error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:webKitPath error:nil];

    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    [cookieStorage.cookies enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL *stop) {
        [cookieStorage deleteCookie:cookie];
    }];

    NSOperatingSystemVersion version = { 9, 0, 0 };
    if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:version]) {
        NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
        NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];
        [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes
                                                   modifiedSince:date
                                               completionHandler:^{}];
    }
}

解説

やっていることは以下のとおりです。

  1. Application/Library/Cookies ディレクトリの削除
  2. Application/Library/WebKit ディレクトリの削除
  3. NSHTTPCookieStorage の Cookie を全削除
  4. iOS 9 以上の場合 WKWebsiteDataStore のデータを全削除

私の環境ではこれら全てを実施しなければ期待した動作は得られませんでした。
Cookie が消えることもあれば消えないこともあるといった、不安定な動作となったのです。
どれか一つが残っていれば、WebView が自動でデータを復元することもあるという情報があったので、このような実装になっています。

Android

サンプルコード

@SuppressWarnings("deprecation")
private void removeAllCookies() {
    CookieManager cookieManager = CookieManager.getInstance();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        cookieManager.removeAllCookies(null);
    } else {
        cookieManager.removeAllCookie();
    }
}

解説

Android 5.0 以上の場合は CookieManager の removeAllCookies() メソッドを、それ以外は removeAllCookie() メソッドを実行しています。

さいごに

調べていて感じたのですが、iOS も Android も Cookie の削除については様々なやりかたがあり、対応方法は一つではないようです。
削除したいタイミングやデータによって、消えることもあれば消えないこともあるのでしょう。
それゆえ、情報が散らばり「WebView は複雑である」という印象を与えているように感じました。

今回紹介した方法も、私の環境では上手く動作しましたが、他の人の環境では意図通りに動かないかもしれません。
あくまで、「こういうやり方もある」と捉えていただければ幸いです。

リンク

ミレニアム・ファルコン製作日記 #51

51 号 表紙

mfd_51_1

パーツ

mfd_51_2

mfd_51_3

mfd_51_4

成果

mfd_51_5

mfd_51_6

今回の作業は以下の 2 つでした。

  • 上部外殻フレームを拡張する
  • 半径方向肋材を加える

前回で組み立てたものにフレームを加え、フレーム補強用に肋材を取り付けました。
これで上部外殻フレームの 3 分の 1 が完成だそうです。
・・・下部外殻フレームに比べて組み立てペースが早く感じるのは気のせいでしょうか。

オリジナル塗装ディテール参考写真

マガジン内で紹介された こちらのページ では、『帝国の逆襲』で使用されたオリジナルの撮影用ミニチュアの各部を写した一連の写真を見ることができます。
作り手の愛が伝わってくるので、是非ご覧ください。

それではまた次回。

May the Force be with you!

AWS Cloud Roadshow 2017 福岡