{"id":20915,"date":"2018-03-19T16:47:53","date_gmt":"2018-03-19T20:47:53","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=20915"},"modified":"2018-03-19T16:48:30","modified_gmt":"2018-03-19T20:48:30","slug":"app-store-certificate-checker-framework","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2018\/03\/19\/app-store-certificate-checker-framework\/","title":{"rendered":"App Store Certificate Checker Framework"},"content":{"rendered":"<p><a href=\"https:\/\/github.com\/delicious-monster\/AppStoreReceiptChecker\">Wil Shipley<\/a> (<a href=\"https:\/\/twitter.com\/wilshipley\/status\/975539008984854528\">tweet<\/a>):<\/p>\n<blockquote cite=\"https:\/\/github.com\/delicious-monster\/AppStoreReceiptChecker\"><p>The framework was written to be a Swift-y way to validate App Store receipts.<\/p>\n<p>This contains receipt verification code plus a semi-complete ASN.1 parser (but not emitter) because the ASN.1 reading functions that Apple ships actually cannot be used from Swift, due to badly annotated headers combined with an incredibly horrrifying API (which they may have inherited from the standards body, to be fair).<\/p><\/blockquote>\n\n<p>Note: This seems to be <a href=\"https:\/\/twitter.com\/hannesoid\/status\/975649716213112832\">Mac-only<\/a>, due to an API that iOS is missing.<\/p>","protected":false},"excerpt":{"rendered":"<p>Wil Shipley (tweet): The framework was written to be a Swift-y way to validate App Store receipts. This contains receipt verification code plus a semi-complete ASN.1 parser (but not emitter) because the ASN.1 reading functions that Apple ships actually cannot be used from Swift, due to badly annotated headers combined with an incredibly horrrifying API [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"","apple_news_api_id":"","apple_news_api_modified_at":"","apple_news_api_revision":"","apple_news_api_share_url":"","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[],"tags":[30,39,1529,74,71,901],"class_list":["post-20915","post","type-post","status-publish","format-standard","hentry","tag-mac","tag-macappstore","tag-macos-10-13","tag-opensource","tag-programming","tag-swift-programming-language"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/20915","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=20915"}],"version-history":[{"count":2,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/20915\/revisions"}],"predecessor-version":[{"id":20917,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/20915\/revisions\/20917"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=20915"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=20915"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=20915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}