[THEOS]コードの書き方

広告非表示

最もやりたいことがこれである。

もちろん、広告全てを消そうというつもりは毛頭ない。料金を支払うことで広告が消せるのであれば、料金を払うつもりである。

何も広告によるビジネスモデルが悪だから、そのモデルを潰してしまおうというつもりは全くない。そのビジネスモデルが嫌いだから自分では使わないというだけである。

よって、「無料で使うけれども広告は表示させない」というようなことはしない。

ただ、中には有料ユーザになりたいにも関わらずそのようなプランがなく、広告が強制的に表示されてしまうものが存在する。そういったアプリはやはり広告を非表示にするしかないな、という気持ちになるのである。

Objective-Cであれば以下の命令が何かを表示したり非表示したりすることに使われている。

- (void)layoutSubviews

つまり、この命令をHookすることで広告を非表示にすることができるはずだ。

Hidden属性を使う

  • メリット
    実装がとても簡単。
  • デメリット
    広告が表示されていたスペースがそのまま残るので、不自然な何も表示されていない場所がそのまま残ってしまう。

単純に広告を非表示にするにはhiddenプロパティを利用する。
これは、広告表示に使われているクラス全体を非表示にするというものである。

@interface ADBannerView
@property (nonatomic, assign, readwrite, getter=isHidden) BOOL hidden;
@end
%hook ADBannerView
- (void) layoutSubviews
{
self.hidden = YES;
}
%end


%origと書けばそのメソッド自体を実行してくれるのであるが、広告を表示しているインスタンスを実行すること自体が無駄なのでそもそもそれを書かない。
というか、この場合であればhiddenしなくても「何も実行しない」とすれば非表示になりそうな気がするのだが、このインスタンスを呼び出すときにフレーム等が生成されてしまっている可能性もあるので念には念を入れて消しておく。
ただし、このやり方が通用するのは基本的に広告表示用のクラスがあるような場合の時である。例えばUIViewで広告を表示しているなら、この方法で非表示にするとほとんど全ての表示が消えてしまうことになる。UIImageViewの場合も同様である。

表示領域を0にする

  • メリット
    実装が簡単。
    余計なスペースが消える(こともある)。
    FLEXでは扱えない領域(多分)なので、強みがある。
  • デメリット
    見えないようにしているだけで実際には作られているのでメモリを圧迫する。
@interface ADBannerView
@property (nonatomic, assign, readwrite) CGRect frame;
@end
%hook ADBannerView
- (void) layoutSubviews
{
CGRect rect = CGRectMake(0,0,0,0);
self.frame = rect;
}
%end

インスタンスを生成しない

  • メリット
    根本的に削除するので最強。
  • デメリット
    生成しないことでバグが生み出される可能性がある。
    どうやったらいいのかよくわかっていない。

やり方がよくわかっていないので解説不可能です。