Blogフリュー株式会社の技術ブログです2016年07月6日AppStore自動更新購読のレシートについてAppStoreこんにちは、コンテンツ・メディア第1事業部の前田です。業務で自動更新購読型のAppStore課金を取り入れたのですが、AppStoreから返却される自動更新購読レシートの中身がよく分からず行き詰まることがありました。今回は自動更新購読レシートを調べた中で分かった仕様や消耗型・非消耗型レシートとの違い、ユーザの課金状態によってレシートの内容はどう変化するかについて書いていきます。AppStore自動更新購読のざっくりとした流れ上図が購入から完了までの流れになります。今回はレシートの内容についてなので詳細には触れません。この図中にあるAppStoreAPIから返却された検証結果レシートの内容について詳しく見ていきます。レシート仕様AppStoreから返却されるレシート例を以下に示します。レシートパラメータの各値は伏せ字にしておきます。見難いかと思いますがご了承下さい。※レシートデータの内容はiOSのバージョン毎に異なりますので注意して下さい。重要なパラメータのみ説明します。レシートが正しければ0、異常であれば対応したエラーコードとなる。購読の有効期限が切れても0が返る。latest_receiptの詳細となる。下記「in_app~消耗型・非消耗型プロダクトとの違い~」で詳しく説明。今まで購入した自動更新のレシートがすべて入る。下記「latest_receiptについて」で詳しく説明。なんの商品(たとえば1ヶ月購読と半年購読があったりした場合)を判別できるもの。購入または更新に対するID。latest_receipt_infoの配列毎に値は異なる。product_idを購読購入したということに対するID。購読購入→一度やめる→また1年後に購入とした場合でも値は同じとなる。transaction_idに対応した購読開始日時。transaction_idに対応した購読購入した日、または更新した日時。更新というのはApple側が更新をかけた日時であって、購読更新日(この日からまた購読)という日時ではない。transaction_idに対応した購読期限。Appleを通してキャンセルされた場合に入る。設定から自動更新オフした場合とかではない。ここに値が入っている場合は有効期限内であっても購入はキャンセルされているので注意。自動更新購読型にのみ存在する。アプリから渡され、レシートデータとしてAppStoreAPIへ渡す。ある購読情報をBase64エンコードしたもの。in_appについて~消耗型・非消耗型プロダクトとの違い~自動更新購読のレシート構造は消耗型・非消耗型プロダクト(ゲームなどによくあるアイテム課金等)のレシート構造といくつか違いがあります。非消耗型プロダクトのレシートは、in_appの中に課金したアイテムの情報が入ってきます。そのとき購入した情報はin_appを見れば分かるのですが、自動更新購読レシートはそうとは限りません。自動更新購読のin_appにはlatest_receiptに紐付く購入情報が入ってきます。latest_receiptが一番最新の購入情報であればin_appには最新の購入情報が入りますが、古いlatest_receiptであればin_appには古い購入情報が入ってきます。具体的には下図のようになります。下図では自動更新購読の内容を「一ヶ月の定期購読課金」としています。latest_receipt_infoについてlatest_receipt_infoは一見すると最新のレシートのみが入ってくるようにみえるのですが、ここにはアプリ内で購入した自動更新のレシート情報が全て入ってきます。一度更新をやめてしばらく経ってから再度購読を開始した場合でも、以前の購読レシートは一緒になって返ってきます。アプリ内にプロダクトが複数あり(300円コース、1000円コース等)、かつ両方で課金したことがある場合には両方の情報が入ってきます(下図参照)。以下図にある3つの状態でレシートを取得した際、original_transaction_idの内容について検証した結果をまとめます。ここでは、自動更新購読の内容を「一ヶ月の定期購読課金」としています。11月1日に購読を開始し、2月、3月も購読を更新している場合latest_receipt_infoには3ヶ月分の購読情報が入ってくる。この3つのoriginal_transaction_idは全て同じものである。21月1日に購読を開始。1月5日に自動更新を解除したが、1月10日に更新解除をやめ、2月、3月と購読した場合latest_receipt_infoには3ヶ月分の購読情報が入ってくる。この3つのoriginal_transaction_idは全て同じものである。31月1日に購読を開始し、1月5日に自動更新を解除。3月1日に購読を開始した場合。latest_receipt_infoには1月、3月の購読情報が入ってくる。この2つのoriginal_transaction_idは全て同じものである。してもoriginal_transaction_idは全て同じとなります。どこで月々の購読情報を見分けるの?と言うと、transaction_idで見分けることができます。パラメータ内容にも書きましたが、transaction_idには購読が更新される毎に違う値が入ってくるからです。実装する際に参考になればと思います。ManageriOSコンテンツ・メディア第1事業部の荒木です。ピクトリンクというアプリのAndroid版を作っています。Manager(以下、GTM)でAndroidアプリのABテストを効果的に行うためにウェブテストの目的を設定します。ちなみに今回の記事の内容は、Androidアプリに限らずiOSアプリでも使えます。-ABの出し分け-)を参照してください。設定の概要ウェブテストの目的は、各パターン(Aパターン、Bパターン)の優劣判定に使われます。GTMは、ウェブテストの目的を基準にして各パターンの優劣を判定します。アナリティクスのウェブテスト」変数の編集画面から目的を設定することができます。デフォルトでは、スクリーン数、セッションの長さ、例外数、クラッシュ数の四つから選ぶことができます。Analytics(以下、GA)で送信したスクリーン数が多いパターンが優秀と判定され、クラッシュ数を目的に設定していると、クラッシュ数が少ないパターンが優秀と判断されます。GAの目標を作成するさて、ここで特定ボタンのクリックイベントが多いパターンを優秀と判定したい場合を考えてみましょう。カスタムの目的を設定するには、GAの目標を利用します。GAにログインし、「アナリティクス設定」タブの「目標」を選択してください。このとき、アカウント・プロパティ・ビューがGTMのウェブテストと連携していることを確認してください。目標の設定画面に遷移したら、「+新しい目標」ボタンから目標の作成を開始してください。目標の詳細」の3ステップで実施します。「テンプレート」と「カスタム」から選びます。テンプレートは、プロパティ設定で指定されている業種で一般的に目標に設定されるものの候補を表示してくれるので、これから何を目標とすべきかわからないときに参考にしてください。今回は特定ボタンのクリックという目標がすでに決まっているので、「カスタム」を選択します。目標の説明ここでは、目標の名前とタイプを設定します。タイプとは目標の達成基準に関わるもので、全4種あります。以下は、各タイプの目標達成基準です。スクリーンビュー数:1セッションあたりのPV数またはスクリーン数が設定した数より多いかイベント:特定イベントが送信されたか今回は、ボタンのクリックイベントを目標としたいので、「イベント」を選択します。2で選択した目標タイプごとの詳細設定を行います。今回は、イベントの目標詳細を設定します。イベントの詳細設定では、GAイベントのカテゴリ、アクション、ラベル、値についてそれぞれ条件を設定することができます。一致条件を設定します。ここで設定した条件が全て満たされた場合に、目標達成となります。空欄の条件は無視されます。GAの目標を目的に設定するGAの目標作成が完了したら、GTMの設定に戻ります。アナリティクスのウェブテスト」変数の編集画面で設定できるウェブテストの目的に、先ほど作成したGAの目標「特定のボタンをタップ」が追加されています。これを選択すれば、ボタンのクリック率が良いパターンが優秀と判定されるようになります。テスト結果の確認テスト結果の確認は、GAで行います。GA左サイドメニューの「行動」→「ウェブテスト」から、ウェブテストの進捗や結果が確認できます。ウェブテストの目的で設定した基準の達成率(コンバージョン率)を元に、各パターンの優劣が判定されます。GTMの設定によっては、テスト終了時に成果の高いパターンに自動で固定したり、テスト中に徐々に成果の高いパターンに移行していくということが可能です。おわりにウェブテストの目的を適切に設定することで、ユーザーの動向にリアルタイムに追従して、より適切な画面を出せるようになります。みなさんもウェブテストの目的を設定して、よりユーザーに楽しんでもらえるようなアプリを作りましょう!以上です。Connect処理中を快適に過ごすiOSツールこんにちは。コンテンツメディア事業部で主にピクトリンクアプリを開発している盛岡です。Connectが利用者にやさしくないってことがありました。今回は、それがうまく解決したので紹介します。やさしくない?iOSアプリを公開する場合には、ざっくりと以下のような手順を踏むことになります。Connect側で対象ビルドを選択できず「処理中」というステータスになることがあります。ひどい時だと半日待ちという状況があります。Connectを表示しているブラウザを変えてみるとか、再度ビルドアーカイブをアップしたら行けた!みたいな報告があったり、iOSアプリ開発における”闇”な感じが漂っているこのごろです。Connect処理中待ち確認ツール”そのものずばりが公開されているようです。それが「watchbuild」です。Apps」を達成するための、iOSアプリのリリースにまつわる工数削減やコマンドラインツール化を提供するプロジェクトです。Fabricに組み込まれましたね。その中でwatchbuildはコマンドラインツールとして提供されており、上記の処理待ち状態の確認作業を代行してくれます。使ってみる以下のgithubプロジェクトでソースコードとインストール方法など提供されています。https://github.com/fastlane/watchbuild基本的には上記URLどおりにインストールするだけです。gemsがインストールされていればうまく行くはずです。実行した結果を見てみましょう。Connectのログインアカウントを指定して実行します。Connectのログインパスワードが聞かれます。上記実行結果を見てもらうと分かると思いますが、数十秒おきにループしてくれてますね。build”と出力されて完了する感じです。今回は117分間もがんばってもらってました。偉い!まとめエンジニアにとって改善活動を行うことは重要ですが、思わぬところで時間を取られている場合の対応については見逃しがちでした。今回は世界中の誰しもが困っていることだったので、解決してくれる人が居たので助かりました。今後については、似たような待ち作業が発生した時にただ待つだけではなく、自分でソフトウェアを書いて解決した方が良さそうなパターンもあるのだなと勉強になりました。みなさんも良いエンジニアライフをお過ごしください。参加レポートみなさん、こんにちは。ピクトリンクアプリを開発している盛岡です。久方ぶりのブログ更新です。jyukutyoのサンフランシスコレポートの間に割り込んでみました。今回のエントリは、先日フリューにて関西モバイルアプリ研究会#7を開催したので紹介したく書いてます。関西モバイルアプリ研究会とは?http://kanmoba.connpass.com/関西モバイルアプリ研究会名のとおり、関西在住のエンジニアによるiOS/Androidアプリ開発者向けの勉強会です。毎回コアなネタが繰り出される、おもしろい勉強会になっています。発表内容については上記URLの資料から参照出来ます。検索してもらうと、雰囲気などがある程度伝わるのかなと思います。毎月1回ペースで実施されており、今回は7回目でした。第8回目も予定されてます。6回目までは株式会社はてなさんで実施していたのですが、7回目はフリューで開催することとなりました。#7のトピックス勉強会の進め方・発表形式は1人5分間のライトニングトークを、多めの人数(10人前後)で回していくというものです。これが5分なのに深い内容が多い。CardboardiOSのbitcodeについてFastlaneアプリの権利を委譲するそうそうたる発表内容ですね。最新のiOS情報に関わるものからWindowsまで!気になった発表アプリの権利を委譲する話は興味深く聞かせてもらいました。企業でアプリを作成していると、たまに話題になることがあります。仕様は頻繁に変わるみたいです。発表者の方も「2015年10月時点での情報なので注意してください」と頻繁にアナウンスされてました。弊社でもFastlaneの導入を検討しており、実際の利用動向などチェックしていきたいなと感じました。Apps」を達成するためのプロジェクトになってます。https://github.com/fastlane/fastlaneフリューで開催してみて関西の凄腕エンジニアの方々との交流に一役かえるというのは、中々ない機会だと思います。実際に開催してみて凄く楽しかったですし貴重な体験でした。発表内容を見てもらえればわかると思いますが、このような内容が聞ける会はそれほどないので是非継続していきたいですね。事前準備等で不慣れな点がありご迷惑をおかけしたかと思いまが、京都タワー地下という立地条件は良かったという意見もあり、希望があれば会場提供も継続させてもらえればと思います。今後も関西のモバイル開発を盛り上げていきましょう!Tweet2012年10月1日iOS6のborder-imageの表示についてiOSデザイナーソフトウェア開発部の、いしはらです。iPhoneお持ちの方はiOS6にアップデートされたでしょうか?私は早速おこないました!iOS6のSafariで見ると、作成したサイトの一部が今までと違う表示になったので、調べていると...CSSのプロパティ「border-image」の表示が改善されていることが分かりました!border-imageに使う画像を↑の画像にして表示すると...iOS5・iOS6でそれぞれこのように表示されます。iOS5では画像一枚が背景のように表示されていますが、iOS6ではちゃんと「境界線」として画像が表示されています。iOS6でCSS3の対応が改善されていることがわかりますね。