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
UITouch.hを見ると、これらのインスタンス変数はprotectedなので、サブクラスからでもアクセスできますし、「物理的」には問題ないはずです。
ただ、気になるのは、
// Note: all instance variables will become private in the future. Do not access directly.
というコメントがひっそりと書かれていることです。これに抵触しているということでしょうか。。。
もしそうだとすると、ふつうは気付かないですし、機械的にチェックするのは難しいかもしれないですね。
Appleの方で、こういうバラバラな情報を、どこか1ヶ所に集めて公開してほしいところです。
せめて、審査に関わるような、ヘッダのコメントには、共通のタグをつけてくれるくらいは、してほしいと思います。
内容が、はずれてたらすみません。。
何か、いい解決方法が見つかるといいですね。
ですね。基本すべてのメンバ変数への直接のアクセスはNGのようですね。
あと、AppleのiPhone SDK Agreement 3.3.1条項の姿勢としては、ドキュメントに載ってないのは
NGとしているような気がしていて、ヘッダからのスキャンだと差がある可能性もあって、
不十分かもですねえ。
手作業で作るのも相当面倒そうだし、、こういう情報をwiki的に編集できるようにして、みんなで編集してもらうとかしかないかなあ。。
> ですね。基本すべてのメンバ変数への直接のアクセスはNGのようですね。
そう解釈するのが安全な気がしますね。
UIKit.frameworkの中のヘッダファイルを、いくつか見てみたんですが、インスタンス変数にスコープが切られてないのは、UITouchくらいな気がします。
きっと、privateとかpackageにすると、都合が悪いことがあるんでしょうね。。
何だか、例外的なこと(バグ??)のような感じなので、審査時にわかってるんであれば、リリースノートには書いておいてほしいところです。
> 手作業で作るのも相当面倒そうだし、、こういう情報をwiki的に編集できるようにして、みんなで編集してもらうとかしかないかなあ。。
そういう場があれば、ありがたいですね。。
でも、そこまでしなくてもいい状況になるのが、もっとありがたいですね ;)