アプリで発生した修正点と対応

とりあえず会社で作ったアプリの中で発生した問題と、対応をつらつらと。
他に同様の問題で困ってる人に対する指標になれば。


修正点と対応

・場合によってリピートモードが解除されてしまう

 良く分からないが、iPod Libraryに対して再生する曲を切り替えると
 リピートモードの状態が解除されてしまうことがある。
 なので、曲を切り替える前に一時的に状態を保存し、再度設定することで再発しなくなった。


・連続で同じリストに対してシャッフルモードでの実行を行おうとしても反応しない
 iPod Libraryに対してリスト再生を行う場合はQueueかCollectionを設定するのだが
 全く同じものを設定しようとすると何も反応を返さない。
 仕方が無いので、一時的にsetQueueでnilを指定した上で切り替える形とした。


・一部の端末でTwitterにログインすることができない
 これが一番クリティカルな問題で困った。
 iOS5以上であれば機種に拠らず、「一部の端末」のみで発生するため
 今回検証していた端末では発生していなかったので見逃してしまった。


 原因はiOSTwitteroAuth認証を利用している人ならば結構な人が
 利用していると思われる、以下のライブラリ。
 bengottlieb/Twitter-OAuth-iPhone - GitHub


 こちらに対して以下の記事で紹介されていた対応策を適用します。
 OAuth, Twitter & iOS 5: “It looks like someone already used the token information you provided.” | musicalgeometry


 英語を読みたくない人のために簡単に書くと、「SA_OAuthTwtterEngine.m」で
 定義されている認証処理などに使うURLを最新のものに更新する必要があるんですね。
 古いものは次のようになってるんですが、

- (SA_OAuthTwitterEngine *) initOAuthWithDelegate: (NSObject *) delegate {
    if (self = (id) [super initWithDelegate: delegate]) {
		self.requestTokenURL = [NSURL URLWithString: @"http://twitter.com/oauth/request_token"];
		self.accessTokenURL = [NSURL URLWithString: @"http://twitter.com/oauth/access_token"];
		self.authorizeURL = [NSURL URLWithString: @"http://twitter.com/oauth/authorize"];
	}
    return self;
}

 これを全て新しいURLに直します。
 Using OAuth 1.0a | Twitter Developers

- (SA_OAuthTwitterEngine *) initOAuthWithDelegate: (NSObject *) delegate {
    if (self = (id) [super initWithDelegate: delegate]) {
		self.requestTokenURL = [NSURL URLWithString: @"http://api.twitter.com/oauth/request_token"];
		self.accessTokenURL = [NSURL URLWithString: @"https://api.twitter.com/oauth/access_token"];
		self.authorizeURL = [NSURL URLWithString: @"https://api.twitter.com/oauth/authorize"];
	}
    return self;
}

 とりあえず私の方では、こちらの対応を行うだけで
 不具合を解消することができました。


・コンピレーションアルバム(オムニバス形式)が正常に表示されない
 iPod Libraryからアルバム内の楽曲を検索する条件が、
 アルバム名+アーティスト名となっていたから。
 ただし、それを安易にアルバム名などにすると同名アルバムが合体してしまう。


 そこで、今回はMPMediaItemPropertyAlbumPersistentIDを利用。
 これはアルバムに対して一意に決まっている値なので検索条件にふさわしい。
 以前から存在は知っていたが、このプロパティは「iOS4.2以降」という
 条件があったのであえて利用していなかったが直近で思い浮かぶ対応策がこれだけだったので。


 iOS4.2未満では、いまだに同様の問題が発生するかもしれない。
 一応ロジックその他も色々改造したのでPersistentID使ってなくても
 正常に表示されたことは確認したけど……。