Hatena::Groupiphone-dev

Takuma104.m

2009-11-06

Three20でUndocumented APIが使われている件

23:03 | Three20でUndocumented APIが使われている件 - Takuma104.m を含むブックマーク はてなブックマーク - Three20でUndocumented APIが使われている件 - Takuma104.m Three20でUndocumented APIが使われている件 - Takuma104.m のブックマークコメント

Three20というすばらしいiPhone向けオープンソースライブラリがありますが、これがどうも、Undocumented APIを含んでしまっているようです。Three20のコードを含んだアプリをAppStoreに提出したのですが、この件でRejectをくらいました。作者様にはさきほどメールしておいたのですが、いちおうどこがまずそうなのかをとりいそぎということで。

@implementation UITouch (TTCategory)
 
- (id)initInView:(UIView *)view location:(CGPoint)location {
  if (self = [super init]) {
    _tapCount = 1;
    _locationInWindow = location;
    _previousLocationInWindow = location;
 
    UIView *target = [view.window hitTest:_locationInWindow withEvent:nil];
    _view = [target retain];
    _window = [view.window retain];
    _phase = UITouchPhaseBegan;
    _touchFlags._firstTouchForView = 1;
    _touchFlags._isTap = 1;
    _timestamp = [NSDate timeIntervalSinceReferenceDate];
  }
  return self;
}
 
- (void)changeToPhase:(UITouchPhase)phase {
  _phase = phase;
  _timestamp = [NSDate timeIntervalSinceReferenceDate];
}
 
@end

http://github.com/joehewitt/three20/blob/master/src/UIViewAdditions.m#L47-64

の黄色くハイライトされたあたりです。このUITouchクラスのメンバ変数にはcategoryを使うとアクセスできてしまいますが、これはやはりまずそうです。

こういったOpen Sourceのコードを使う上では、ライセンス上、AS ISになっていますので、コード作者ではなく、もちろん使う側に責任があります。使う上ではこういったリスクもあります。

おそらく今後もこういったことは起きないとも限らないので、ビルドしたあと、そのバイナリを静的に解析して、そのアプリでUndocumented APIやPrivate APIが使われていないかどうかをチェックするツールが欲しいなあと思ったのですが(たぶんAppleも審査時にこういう方法で試験しているものと思います)、こういったものって、存在するんでしょうか?

もしないとすると、とりあえず作ろうと思っています。多分、PublicなFrameworkのヘッダをすべてスキャンして、使えるAPIのリストを作り、なおかつビルド後のバイナリからclass-dump-xなど経由ですべての使用しているAPIのリストをとり、その差分を取ることで、これが可能な気もしています。が、できるのかなあ。。もしこの辺の情報お持ちの方おられましたら、@takuma104 あたりまでコメントお願いできればと思います。

(追記)

Three20のこの件は、すでに既出の話題だったのを教えていただきました。うーん、、御本人はレスしてないかあ。とりあえず fork してこの辺のコードを削除してpull request送るとかなんでしょかね。こういう場合。

http://groups.google.com/group/three20/browse_thread/thread/c442af6e39a918b0/6d5046771539d139

kimadakimada2009/11/07 00:24これはつらいケースですね。。。><

UITouch.hを見ると、これらのインスタンス変数はprotectedなので、サブクラスからでもアクセスできますし、「物理的」には問題ないはずです。
ただ、気になるのは、

// Note: all instance variables will become private in the future. Do not access directly.

というコメントがひっそりと書かれていることです。これに抵触しているということでしょうか。。。

もしそうだとすると、ふつうは気付かないですし、機械的にチェックするのは難しいかもしれないですね。
Appleの方で、こういうバラバラな情報を、どこか1ヶ所に集めて公開してほしいところです。
せめて、審査に関わるような、ヘッダのコメントには、共通のタグをつけてくれるくらいは、してほしいと思います。

内容が、はずれてたらすみません。。
何か、いい解決方法が見つかるといいですね。

takuma104takuma1042009/11/07 00:35コメントありがとうございます! とりあえず、アプリは、幸いこの部分は未使用コードだったので、この部分削って再提出しました。

ですね。基本すべてのメンバ変数への直接のアクセスはNGのようですね。

あと、AppleのiPhone SDK Agreement 3.3.1条項の姿勢としては、ドキュメントに載ってないのは
NGとしているような気がしていて、ヘッダからのスキャンだと差がある可能性もあって、
不十分かもですねえ。

手作業で作るのも相当面倒そうだし、、こういう情報をwiki的に編集できるようにして、みんなで編集してもらうとかしかないかなあ。。

kimadakimada2009/11/07 01:02とりあえず、再提出できたのはよかったですね!

> ですね。基本すべてのメンバ変数への直接のアクセスはNGのようですね。

そう解釈するのが安全な気がしますね。
UIKit.frameworkの中のヘッダファイルを、いくつか見てみたんですが、インスタンス変数にスコープが切られてないのは、UITouchくらいな気がします。
きっと、privateとかpackageにすると、都合が悪いことがあるんでしょうね。。
何だか、例外的なこと(バグ??)のような感じなので、審査時にわかってるんであれば、リリースノートには書いておいてほしいところです。

> 手作業で作るのも相当面倒そうだし、、こういう情報をwiki的に編集できるようにして、みんなで編集してもらうとかしかないかなあ。。

そういう場があれば、ありがたいですね。。
でも、そこまでしなくてもいい状況になるのが、もっとありがたいですね ;)

BeitskeBeitske2013/10/14 14:25We've arvried at the end of the line and I have what I need!

DheniferDhenifer2013/10/15 04:03This site is like a <a href="http://nhbtufuuje.com">cloasrosm,</a> except I don't hate it. lol

SunamyttahSunamyttah2013/10/15 15:39I rellay needed to find this info, thank God! http://dmduhvyqtj.com [url=http://iamizfmjn.com]iamizfmjn[/url] [link=http://cofmqdgnog.com]cofmqdgnog[/link]

CorazonCorazon2013/11/03 18:15A million thanks for posting this <a href="http://tvivvlx.com">innaimotrof.</a>

LilyLily2013/11/14 12:03Wait, I cannot fathom it being so stwoaghtfarrird. http://vpoyas.com [url=http://nqbdgmbimal.com]nqbdgmbimal[/url] [link=http://lclrvk.com]lclrvk[/link]

YogiYogi2013/11/18 02:51I think you hit a buleslye there fellas! http://twpymp.com [url=http://tntiaofqfj.com]tntiaofqfj[/url] [link=http://mnxvsd.com]mnxvsd[/link]