{"id":43902,"date":"2024-06-28T16:34:59","date_gmt":"2024-06-28T20:34:59","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=43902"},"modified":"2024-06-28T16:50:05","modified_gmt":"2024-06-28T20:50:05","slug":"python-apps-rejected-from-app-store","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2024\/06\/28\/python-apps-rejected-from-app-store\/","title":{"rendered":"Python Apps Rejected From App Store"},"content":{"rendered":"<p><a href=\"https:\/\/lwn.net\/SubscriberLink\/979671\/4fb7c1827536d1ae\/\">Joe Brockmeier<\/a> (via <a href=\"https:\/\/news.ycombinator.com\/item?id=40815130\">Hacker News<\/a>):<\/p>\n<blockquote cite=\"https:\/\/lwn.net\/SubscriberLink\/979671\/4fb7c1827536d1ae\/\"><p>The problem at hand is that Apple&rsquo;s macOS App Store is automatically rejecting apps that contain the string &ldquo;itms-services&rdquo;. That is the URL scheme for apps that want to ask Apple&rsquo;s iTunes Store to install another app. [&#8230;] That string is in the\n<tt><a href=\"https:\/\/docs.python.org\/3\/library\/urllib.html\">urllib<\/a><\/tt>\nparser in Python&rsquo;s standard library, though an application may never actually use\nthe <tt>itms-services<\/tt> handler.<\/p><p>[&#8230;]<\/p><p>Of course, Apple did not do anything so straightforward as to <em>explain<\/em> this to Froemling.<\/p><p>[&#8230;]<\/p><p>One solution might be to obfuscate the offending string to pass review, but that might &ldquo;lead to an obfuscation arms race&rdquo; and there were no guarantees this would be the last time the project had to resolve app-validation problems.<\/p><p>[&#8230;]<\/p><p>It is frustrating that free-software projects like Python have to waste time finding ways around opaque review processes just so developers can write software for non-free platforms.<\/p><\/blockquote>\n<p>The first problem is that Apple is doing a dumb static analysis. If it can be thwarted by simple obfuscation then what good is it really doing? But, second, why is it even trying to detect this URL scheme upon submission when iOS could more easily and effectively block all the &ldquo;dangerous&rdquo; URLs at runtime?<\/p>\n\n<p>Years ago, I ran into a similar problem with EagleFiler being rejected because it used PyObjC, which included some symbols for the deprecated Java VM.<\/p>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2019\/06\/04\/scripting-languages-to-be-removed\/\">Scripting Languages to Be Removed<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Joe Brockmeier (via Hacker News): The problem at hand is that Apple&rsquo;s macOS App Store is automatically rejecting apps that contain the string &ldquo;itms-services&rdquo;. That is the URL scheme for apps that want to ask Apple&rsquo;s iTunes Store to install another app. [&#8230;] That string is in the urllib parser in Python&rsquo;s standard library, though [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2024-06-28T20:35:02Z","apple_news_api_id":"5a879a43-7076-4573-839a-a2a39790b0d3","apple_news_api_modified_at":"2024-06-28T20:50:09Z","apple_news_api_revision":"AAAAAAAAAAAAAAAAAAAAAA==","apple_news_api_share_url":"https:\/\/apple.news\/AWoeaQ3B2RXODmqKjl5Cw0w","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":[2],"tags":[91,130,595,31,2321,84,635,232,489],"class_list":["post-43902","post","type-post","status-publish","format-standard","hentry","category-technology","tag-appstore","tag-rejection","tag-eaglefiler","tag-ios","tag-ios-17","tag-java","tag-pyobjc","tag-python","tag-url"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/43902","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=43902"}],"version-history":[{"count":2,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/43902\/revisions"}],"predecessor-version":[{"id":43913,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/43902\/revisions\/43913"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=43902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=43902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=43902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}