[iOS9] 超手抜きATS対応(最後の砦)

2016.07.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

いよいよ、ATSが審査の対象となるようですが、皆様のアプリのATS対応は、進んでいるでしょうか。

今回は、https以外のURL遷移で、Safariに制御を渡してしまう、最も手抜きなATS対応を試してみました。

2 テストプログラム

当初、UIWebViewを指定したURLに遷移させる簡単なサンプルアプリを作成します。

#pragma  Action

- (IBAction)tapGoButton:(id)sender {
    // GOボタンをタップすれうと、入力したURLに遷移する
    NSURL *url = [NSURL URLWithString:self.urlTextField.text];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:req];
}

#pragma UIWebViewDelegate

// 読み込み完了
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    if (self.webView.loading)
    {
        return;
    }
    // 遷移後のURLを表示する
    _urlTextField.text = [webView stringByEvaluatingJavaScriptFromString:@"document.URL"];
}

// 読み込み失敗
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    if (self.webView.loading)
    {
        return;
    }
    // 失敗したことを表示する
    _urlTextField.text = @"読み込み失敗";

}

3 ATS無効(非推奨)の動作確認

当初、下記の設定をinfo.plistに追加して、ATS無効(非推奨)の状態で動作を確認してみます。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

httpsのURL( https://www.google.com )は、正常に表示されます。

001

また、httpのURL( http://www.tenki.jp/ )も表示できています。

002

4 ATS有効の動作確認

続いて、先にinfo.plistに追加した設定を削除し、ATSが有効な状態にもどします。

そうすると、httpsのURL( https://www.google.com )は、正常に表示されすが、httpのURL( http://www.tenki.jp/ )は、表示できません。

003

この時、Xcodeでは、次のようなログが出力されています。

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

5 Safari起動

ATSを有効にすると、このようにhttps以外へのアクセスは、物静かに失敗します。

しかし、ユーザにとっては、リンク先がhttpsであるかどうかは、通常意識されていないため、もしかすると非常にUXを害する可能性もあると思います。 そこで、https以外のURL遷移があった場合は、Safariを起動して、とりあえず、そのページを表示するようにしてみました。

// 遷移開始前
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([request.URL.description hasPrefix:@"https:"])
    {
        return true;
    }
    [[UIApplication sharedApplication] openURL: [request URL]];
    return false;
}

004

UIWebViewから出てしまうので、アプリとして完全な制御はできなくなりますが、画面を見ると分かるように、iOS9では、Safariの一番上に、Back to アプリ名のボタンが有りますので、一応アプリに戻るためのUIもあると言えるかも知れません。

6 最後に

単純にSafariを起動しただけです。これでATS対応というのは、おこがましい話ですが、最後の最後にこれを実装しておくことで、最悪、遷移ができなかった時のUXが保たれるかも知れません。