iOS
framework
Swift

AppStoreのVersionを元に更新アラートを出すFrameworkを作った

最新版への更新

やはり、アプリ開発を行っていて、色々なお客様がいらっしゃると常日頃感じています。
技術サイドにいるとアップデートというものが当たり前になっているので、過去Versionで止まっていることのほうが珍しいかなと思っています。
しかし、中にはAppStoreからのアップデートの意味がわからなかったりだとか、アップデートすることで何が変わるか理解していない方も少なからずいらっしゃいます。(うちの母とかもそうです。)
前置きは、置いておきましてやはり最新版をどんな方でも触って欲しい!

これに尽きます。
ですので、iOS向けに簡単に使えるVersionAlertFrameworkを書いてみました。

Version取得、比較

iTunes Search APIというものがAppleから実は提供されています。

iTunes Search API JPより

Search API を使えば、iTunes Store、App Store、 iBookstore、Mac App Store のコンテンツを検索するためのフィールドをご自分のウェブサイトに載せることができます。App、電子書籍、映画、Podcast、音楽、ミュージックビ デオ、オーディオブック、テレビ番組など、さまざまなコンテンツの検索が可能です。また、ID ベースのルックアップリクエストを呼び出し、自分のコンテンツライブラリとデジタルカタログのマッピングを作成できます。利用規約が適用されます。

アフィリエイトプログラムは、自分のウェブサイトや App でのクリックを通して iTunes Store、App Store、iBookstore、Mac App Store で発生した収益に基づき、コミッション (報酬) を獲得できるプログラムです。アフィリエイトプログラムの詳細情報については、 http://www.apple.com/itunes/affiliatesをご覧ください。

これで提供されているルックアップを用いることで、AppStoreに配信済みのご自身のアプリのストア情報をJson形式で取得することができます。

一例として下記の様なリクエストをかけると指定されたアプリのストア情報の取得が可能です。
鉄道オルゴール増幅器絶賛配信中!
https://itunes.apple.com/lookup?id=789133374

{
    "resultCount": 1,
    "results": [
        {
            "ipadScreenshotUrls": [],
            "appletvScreenshotUrls": [],
            "artworkUrl512": "https://is5-ssl.mzstatic.com/image/thumb/Purple62/v4/02/4a/92/024a92fc-12f5-6313-318c-400667602709/source/512x512bb.jpg",
            "screenshotUrls": [
                "https://is5-ssl.mzstatic.com/image/thumb/Purple128/v4/95/dc/6d/95dc6d74-dde8-2433-452d-ab70adf1cd13/source/392x696bb.jpg",
                "https://is3-ssl.mzstatic.com/image/thumb/Purple128/v4/93/83/bc/9383bc81-f80e-37c4-e03a-1fd2e880c702/source/392x696bb.jpg"
            ],
            "artistViewUrl": "https://itunes.apple.com/us/developer/masami-yamate/id789133377?uo=4",
            "artworkUrl60": "https://is5-ssl.mzstatic.com/image/thumb/Purple62/v4/02/4a/92/024a92fc-12f5-6313-318c-400667602709/source/60x60bb.jpg",
            "artworkUrl100": "https://is5-ssl.mzstatic.com/image/thumb/Purple62/v4/02/4a/92/024a92fc-12f5-6313-318c-400667602709/source/100x100bb.jpg",
            "isGameCenterEnabled": false,
            "kind": "software",
            "features": [],
            "supportedDevices": [
                "iPhone5-iPhone5",
                "iPadFourthGen-iPadFourthGen",
                "iPadFourthGen4G-iPadFourthGen4G",
                "iPhone5c-iPhone5c",
                "iPhone5s-iPhone5s",
                "iPadAir-iPadAir",
                "iPadAirCellular-iPadAirCellular",
                "iPadMiniRetina-iPadMiniRetina",
                "iPadMiniRetinaCellular-iPadMiniRetinaCellular",
                "iPhone6-iPhone6",
                "iPhone6Plus-iPhone6Plus",
                "iPadAir2-iPadAir2",
                "iPadAir2Cellular-iPadAir2Cellular",
                "iPadMini3-iPadMini3",
                "iPadMini3Cellular-iPadMini3Cellular",
                "iPodTouchSixthGen-iPodTouchSixthGen",
                "iPhone6s-iPhone6s",
                "iPhone6sPlus-iPhone6sPlus",
                "iPadMini4-iPadMini4",
                "iPadMini4Cellular-iPadMini4Cellular",
                "iPadPro-iPadPro",
                "iPadProCellular-iPadProCellular",
                "iPadPro97-iPadPro97",
                "iPadPro97Cellular-iPadPro97Cellular",
                "iPhoneSE-iPhoneSE",
                "iPhone7-iPhone7",
                "iPhone7Plus-iPhone7Plus",
                "iPad611-iPad611",
                "iPad612-iPad612",
                "iPad71-iPad71",
                "iPad72-iPad72",
                "iPad73-iPad73",
                "iPad74-iPad74",
                "iPhone8-iPhone8",
                "iPhone8Plus-iPhone8Plus",
                "iPhoneX-iPhoneX"
            ],
            "advisories": [],
            "languageCodesISO2A": [
                "JA"
            ],
            "fileSizeBytes": "69950464",
            "sellerUrl": "https://www.youtube.com/watch?v=ZZ3O3CUGfCY",
            "trackContentRating": "4+",
            "trackCensoredName": "鉄道オルゴール増幅器",
            "trackViewUrl": "https://itunes.apple.com/us/app/%E9%89%84%E9%81%93%E3%82%AA%E3%83%AB%E3%82%B4%E3%83%BC%E3%83%AB%E5%A2%97%E5%B9%85%E5%99%A8/id789133374?mt=8&uo=4",
            "contentAdvisoryRating": "4+",
            "formattedPrice": "$0.99",
            "currency": "USD",
            "wrapperType": "software",
            "version": "5.1.2",
            "artistId": 789133377,
            "artistName": "Masami Yamate",
            "genres": [
                "Entertainment",
                "Utilities"
            ],
            "price": 0.99,
            "description": "~車内アナウンス前に流れるオルゴールをあなたのお手元で再現~\n「今日から家で乗務員気分!」\n\n◇~~~~鉄道オルゴール増幅器概要~~~~◇\n特急,急行列車で流れる車内チャイムを再現.\nいつでもどこでも車内チャイムを流せる.\n鉄道模型運転中に使うことで,いつもよりも実車の雰囲気に近づいた運転を楽しむことが出来たり,目覚まし時計機能を使うことで家で寝台列車で流れる「おはよう放送」の再現も可能なアプリケーション.\n\nそれが「鉄道オルゴール増幅器」です.\n\n◆国鉄型車両に採用されていた6曲を搭載\n~~全て懐かしのオルゴール調で再現~~\n-「ハイケンスのセレナーデ」\n-「鉄道唱歌」※Version違い含め計2曲\n-「アルプスの牧場」\n-「ブラームスの子守唄」\n-「宮津節」\n※実車音源ではありません、実物と音色が若干異なります。\n\n◆搭載車両の走行音も4種搭載\n-DMF15-G + DM109 搭載車両:カニ24\n-MT54 主電動機 搭載車両:165系,185系 etc...\n-MT61 主電動機 搭載車両:651系 etc...\n-DML30系エンジン 搭載車両:キハ181系 etc...\n\n◆目覚まし機能も搭載\n指定の時間をセットすることで,寝台列車で流れる「おはよう放送」を自宅で再現できて毎朝往年の車内チャイムで起床も可能!\n※目覚まし使用の際、楽曲フルでの再生はできません。\n\n待望のゼンマイモード追加!\n実物同様ゼンマイを巻いて再生も可能に!\n※実物同様7回巻く事が可能,ゼンマイモード使用時の再生最大回数は7回です.ゼンマイが切れた場合再度巻き直してください.\n\nボリュームコントローラーは未実装です.\nご了承ください.\n\nご使用時は、マナーモード解除の上お使いください。皆様のご理解ご協力をお願い致します。",
            "bundleId": "net.yamatte.trainmusicbox",
            "isVppDeviceBasedLicensingEnabled": true,
            "primaryGenreName": "Entertainment",
            "minimumOsVersion": "10.0",
            "currentVersionReleaseDate": "2018-02-21T18:26:02Z",
            "releaseNotes": "毎度ご乗車ありがとうございます。お客様の利便性を向上させるため、下記の修繕作業を行いました。\n・データ選択画面で、設定されている楽曲、環境音、背景色に合わせて選択された状態になるように修正いたしました。\n\n今後も、鉄道オルゴール増幅器をどうぞよろしくお願い致します。",
            "sellerName": "Masami Yamate",
            "trackId": 789133374,
            "trackName": "鉄道オルゴール増幅器",
            "releaseDate": "2014-01-18T00:04:39Z",
            "primaryGenreId": 6016,
            "genreIds": [
                "6016",
                "6002"
            ]
        }
    ]
}

このようにストア情報が一覧で取得できます。
この中の、versionのKeyが現在ストアにリリースされているアプリバージョンになります。
ストアのアプリバージョンとBundle.main.infoDictionaryのCFBundleShortVersionStringに含まれるデバイスにインストールされているアプリバージョンと比較をしアラートを出す処理を行っています。

Framework化した

YMTVersionAlert
https://github.com/MasamiYamate/YMTVersionAlert

まともにGithub使うのが初なのと英語できないので機械翻訳に頼りつつなので、
温かい目で見守っていただけると嬉しいです。
BuildするとFrameworkが生成されます。

Install

CocosPodsに対応しました。
Podfileに下記を追記してください。

pod 'YMTVersionAlert'

How to use

基本的な呼び出し方法

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    //インスタンスを生成
    let versionAlert = YMTVersionAlert()

    //openVersionAlertを呼ぶ
    //表示する親のVCとStoreID、強制アップデートフラグ
    //任意でコールバックで呼ばれるメソッドを引数で渡す。
    versionAlert.openVersionAlert(self, storeId: "StoreId", forceUpdate: false, callback: nil)
}

オフライン時取得できない場合は、Version判定処理がスキップされます。
forceUpdateをtrueにするとアップデート促し用のアラートの選択肢が「アップデートする」だけになり、ストアページへの移動を必須にすることができます。