hachinoBlog

hachinobuのエンジニアライフ

WebViewで表示しているHTMLのソースを表示する方法

背景

プログラム内で動的に生成したHTMLをWebViewで表示した際にデバッグ目的としてHTMLのソースを表示したくて調べた。

やり方

表示終わりのwebViewDidFinishLoad:メソッドあたりに下記コードを追加。

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{
  //全文表示
  NSString *fullHtml = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('html')[0].outerHTML"];
  NSLog(@"html:%@", fullHtml);

 
  //bodyタグ内のみ
  NSString *bodyHtml = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
  NSLog(@"html:%@", bodyHtml);
}

これでHTMLのソースを表示することができます。

WebViewでHTMLを読み込んだ際に画像が表示されない現象

背景

久しぶりにHTMLつくってWebViewで表示させたらHTML内で表示するはずの画像が表示されなかった。

問題のコード

  NSString* htmlFileName = @"sample.html";
  NSString *filePath = [[NSBundle mainBundle] pathForResource:filename ofType:nil];
  NSString *html = [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:NULL];
  [_webView loadHTMLString:html baseURL:nil];

原因

原因はloadHTMLString:の第二引数であるbaseURLをnilにしていたため。

ここには画像とかリソースのパスを指定してあげなくてはならない。

解決コード

  NSString* htmlFileName = @"sample.html";
  NSString *filePath = [[NSBundle mainBundle] pathForResource:filename ofType:nil];
  NSString *html = [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:NULL];
  NSURL *resourceURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"html"];
  [_webView loadHTMLString:html baseURL:resourceURL];

初歩的なことなのだけれど忘れてしまっていたのでメモ。

UIImageのリサイズ

背景

画像の大きさをコードでリサイズしたかったのでUIImageのリサイズ方法を調べた。

やり方

//UIImageのリサイズメソッド
- (UIImage *)resizeImage:(UIImage *)image rect:(CGRect)rect
{
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0);
    [image drawInRect:rect];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    UIGraphicsEndImageContext();
    return resizedImage;
}

//使う側
UIImage *image = [UIImage imageNamed:@"imageName"]; //100x100の画像とする
CGRect imageRect = (CGRect){ CGPointZero, CGSizeMake(50.0f, 50.0f) }; //50x50にリサイズ
image = [self resizeImage:image rect:imageRect];

UIGraphicsBeginImageContextWithOptions(サイズ, 透過有無(NOで透過有), スケール指定(0でデバイス固有));

※0でデバイス固有というのはRetinaディスプレイであれば100x100は200x200の解像度になるよ。という意味です。

Xcode5.1で今まで使っていたプラグインが使えなくなってしまった場合の対処方法(暫定版)

背景

Xcodeを5.1にしたら便利なプラグインが使えなくなって発狂した。

解決方法

~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/[各プラグインフォルダ]/Contents/Info.plist を開いて DVTPlugInCompatibilityUUIDsキーの値に A2E4D43F-41F4-4FB9-BB94-7177011C9AED を追加してXcodeを再起動。

Info.plist

f:id:hachinobu:20140312102445p:plain

これで私の使用しているプラグイン達は再び動き始めました。

ちなみにA2E4D43F-41F4-4FB9-BB94-7177011C9AED という値はXcode5.1のDVTPlugInCompatibilityUUIDのこと。

どうやらXcode5.1でDVTPlugInCompatibilityUUIDに変更があったようです。

XcodeのDVTPlugInCompatibilityUUIDは

open /Applications/Xcode.app/Contents/Info.plist

で確認できます。

参考文献

stackoverflow

Xcode5.1でundefined symbols for architecture armv64 エラー

背景

iOS7.1のリリースに併せてXcodeのバージョンを5.1にアップデートし以前のXcodeで正常にビルドできていたプロジェクトをXcode5.1でビルドしてみたところ、あるコードの箇所で

undefined symbols for architecture armv64

という見慣れた感じのArchitectureのエラーが出現。

原因

[Build Settings]-[Architectures]の[Architectures]項目の値であるStandard architecturesにarm64が入っていた。

f:id:hachinobu:20140311111332p:plain

解決方法

f:id:hachinobu:20140311111548p:plain

[Build Settings]-[Architectures]の[Architectures]項目の値をarm64を含めないようにしました。

f:id:hachinobu:20140311111535p:plain

もしかしたらXcode5.1以前からarm64はStandard architecturesに含まれていたかも。

それでもって対応したことを忘れていたかもなのでメモ。

そもそもarm64対応になっていないコードがあることが問題か。。

warningチェックも改良されているっぽい。

*追記

このやり方だとCocoaPodsでこける。

$(ARCHS_STANDARD_32_BIT)を追加して選択するのが正解のようだ。

申請時に Creating a new Signiant Transfer Engine because the previous transfer had to be canceled. This session is at risk of running out of availble system resources.

背景

いつものように申請作業をしていたら、Validateの際に Creating a new Signiant Transfer Engine because the previous transfer had to be canceled. This session is at risk of running out of availble system resources. という警告が出た。

警告が出ていても普通にバイナリをアップロードできてiTunes Connectのステータスは[ Waiting For Review.]になったのだが、やはり警告が出ているのは気持ち悪いということで調べた。

検証

まずは使用しているMacのシステムリソースの問題か?と思い、社内の良さげスペックの端末でやるも再度同じ警告が。

当然Xcodeを再起動しても無理。

解決

接続しているwifiを変更したら警告なしでいけました。

パケづまりとか、そんな類なのかな。。

Xcode内の環境変数$(SRCROOT)を参照する方法

背景

Xcodeのビルドエラーで$(SRCROOT)などの環境変数が出てきて、それがどこの階層を示しているのか分からなくて困っていたのでやり方を調べた。

やり方

Xcodeの[TARGETS]-[プロジェクト名]-[Build Phase]タブを選択してTarget Dependenciesをクリック。 その状態で[Editor]-[Add Build Phase]-[Add Run Script Build Phase]をクリック。

f:id:hachinobu:20140219135404p:plain

すると下記のように Run Script 項目が追加される。

f:id:hachinobu:20140219135743p:plain

Run Scriptを展開しシェル入力欄に

    env > ./env.txt

と入力する。

f:id:hachinobu:20140219140308p:plain

この状態で[Product]-[Build]を実行するとxcodeprojと同じ階層に環境変数値の一覧が出力されたenv.txtが作成されている。

f:id:hachinobu:20140219140616p:plain

f:id:hachinobu:20140219140633p:plain

参考にしたリンク

まさにこの通りでした。

$(SRCROOT) や $(BUILD_DIR) 等の Xcode で使用しているマクロの置換内容の一覧を調べる方法Add Star