アプリのアップデートがAppStoreで却下されたあと承認されました
2021-01-25
Rejected kenmo reader update. And approved.
AppStoreにkenmo readerのアップデートを提出したら却下された話と、アーカイブ機能を少し変更した話を書きます。
kenmo readerがAppStoreで初めて却下されました
kenmo readerはReact Native(Expo)で開発しているのでOTAアップデートが利用できます。これはアプリストアの審査を通さずにアプリをアップデートできる機能です。
ただ、ストアで表示したときに更新履歴が何もないと印象が悪いので機能追加したときには新しいバイナリをストアに提出して審査してもらっています。
ここのところ登録したサイトの記事をまとめて取得とかアーカイブ機能とか追加しているので頻繁にストアに提出しています。
お気づきだと思いますがバージョン1.0.4が上の画像では抜けています。これはApp Storeで却下されたためです。
アーカイブ機能を追加したバージョンを審査に提出したときに却下されました。
レビュワーから届いたメッセージがこちらです。
どうやらAllボタンをタップしたときに読込中から変わらずアプリが操作不能になったということのようです。
スクリーンショットも添付されていました。
今回追加したアーカイブ機能とは関係ないみたいです。
登録したサイトの記事をまとめて取得する機能は1個前のバージョン(1.0.3)で追加してそのときは承認されたんですが、今回の審査ではうまく動かなかったみたいです。
まとめて取得機能は、「登録したサイトのURLをストレージからロードしてfetch
を繰り返す」という実装になっています。
該当部分のコードです。
getNews() {
global.storage.getAllDataForKey('site')
.then(res => {
const urls = res.map(site => site.url);
for (const url of urls) {
fetch(url + '/wp-json/wp/v2/posts?_embed')
.then((response) => response.json())
.then((responseJson) => {
for(var i in responseJson) {
var p = new WPPost(responseJson[i]);
this.setState({ items: this.state.items.concat([p]) });
}
})
.catch((error) => {
console.error(error);
});
}
});
}
エラーの場合の処理とかタイムアウトを設定してないので、レビュワーが登録したサイトが多すぎたかレビュー中にどこかのサイトが落ちていたんだろうと想像できます。
確かに、読み込み中が延々と表示され続けるのは印象が悪いのでローディングスピナーが表示されないようにしました。
読込中の表示が出ないので画面は地味になりますが、代わりにfetch
が完了した記事から次々に表示されていくので体験は良くなるだろうという判断です。
ローディングスピナーを撤去しただけのバージョンを再提出しても良かったのですが、アーカイブ機能で修正したい箇所があったのでバージョン1.0.5としてビルドしなおすことにしました。
アーカイブ機能の改善
前回実装した、記事をアーカイブする機能ですが、アーカイブ記事の一覧画面から記事表示画面に遷移したときは保存ボタンが表示されないという動きにしていました。
記事の削除は一覧画面でチェックマークをタップすることで行います。
記事を読み終わったら、一覧画面に戻ってチェックマークをタップするという使い方になるため操作の手数が多いのが気になりました。
そこで、アーカイブした記事の表示画面に記事を削除して一覧に戻るボタンを設置することにしました。
実装したコード
前回書いた通り、記事の保存ボタンはどの画面から遷移してきたかを三項演算子で評価して真の場合に表示する仕組みになっています。偽のときはnull
を返すようにしていました。
今回は偽の時に記事削除&前に戻る
ボタンを表示することにします。
src\scenes\article\article.js
{arrival ?
<View style={{ position: 'absolute', right: 120 }}>
<TouchableOpacity
onPress={() => {
var archiveData = {
title: title,
url: url,
date: date,
content: content
}
global.storage.save({
key: 'archive',
id: title,
data: archiveData,
});
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success)
}}
>
<Icon name="inbox" size={30} color="black"/>
</TouchableOpacity>
</View>
: /* ここから */
<View style={{ position: 'absolute', right: 120 }}>
<TouchableOpacity
onPress={() => {
global.storage.remove({
key: 'archive',
id: title,
});
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success)
this.props.navigation.goBack()
}}
>
<Icon name="trash" size={30} color="black"/>
</TouchableOpacity>
</View>
/* ここまで追加 */
}
onPress
イベントにレコードの削除とハプティックフィードバックとReact NavigationのgoBackメソッドを与えて実装しました。
これで、記事を読み終わったときにtrash
アイコンをタップすることで記事を削除しつつ前の画面(アーカイブ記事一覧)に戻ることができます。
まとめ
このバージョンで再提出したところ、無事に承認されてストアで配信されました。
以上です。