{"id":27172,"date":"2019-11-04T14:22:28","date_gmt":"2019-11-04T19:22:28","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=27172"},"modified":"2019-12-17T19:30:07","modified_gmt":"2019-12-18T00:30:07","slug":"electron-apps-rejected-from-the-mac-app-store","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2019\/11\/04\/electron-apps-rejected-from-the-mac-app-store\/","title":{"rendered":"Electron Apps Rejected From the Mac App Store"},"content":{"rendered":"<p><a href=\"https:\/\/david.dev\/you-cannot-submit-an-electron-6-or-7-app-to-the-apple-store\">David.dev<\/a> (via <a href=\"https:\/\/twitter.com\/sandofsky\/status\/1191137784670519296\">Ben Sandofsky<\/a>, <a href=\"https:\/\/news.ycombinator.com\/item?id=21437255\">Hacker News<\/a>, <a href=\"https:\/\/developers.slashdot.org\/story\/19\/11\/04\/1620223\/apple-now-rejects-electron-apps-from-mac-app-store\">Slashdot<\/a>):<\/p>\n<blockquote cite=\"https:\/\/david.dev\/you-cannot-submit-an-electron-6-or-7-app-to-the-apple-store\">\n<p>Allright, as a follow up to the <a href=\"https:\/\/david.dev\/submit-electron-7-app-to-apple-store\">previous chapter<\/a> in this odyssey I can now state that, apparently,&nbsp;<b>&nbsp;you cannot submit an electron 6 or 7 app to the apple store:<\/b><\/p><p>The first refusal from apple states:<\/p>\n<blockquote>Your app app links against the following non-public framework(s):<br \/>CAContext<br \/>CALayerHost<br \/>NSAccessibilityRemoteUIElement<br \/>NSNextStepFrame<br \/>NSThemeFrame<br \/>NSURLFileTypeMappings<\/blockquote>\n<p>I am<a href=\"https:\/\/github.com\/electron\/electron\/issues\/20027\"> not the only one having this issue<\/a>&nbsp;and I did write back to Apple trying to explain that I am using Electron and I can&rsquo;t really change any of these public-framework usage (I assume is something from Chromium)[&#8230;]<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/chockenberry\/status\/1191375484551974912\">Craig Hockenberry<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/chockenberry\/status\/1191375484551974912\">\n<p>There was a time when digging into the bowels of the macOS implementation was &ldquo;necessary&rdquo;. Back in the day, you&rsquo;d use <code>NSThemeFrame<\/code> to get UI into an app&rsquo;s titlebar.<\/p>\n<p>iTunes did it, so everyone wanted to do it.<\/p>\n<p>But those days are long gone - there are public APIs to get the job done now.<\/p>\n<p>And with the advent of Spaces, split-screen windows, and translucent effects, using these private APIs are likely to break an app.<\/p>\n<\/blockquote>\n\n<p>Unfortunately, that isn&rsquo;t the whole story. Some of the <a href=\"https:\/\/github.com\/electron\/electron\/issues\/20027\">private APIs<\/a> are used in the <a href=\"https:\/\/github.com\/electron\/electron\/issues\/20027#issuecomment-549269028\">Web rendering engine itself<\/a>:<\/p>\n<blockquote cite=\"https:\/\/github.com\/electron\/electron\/issues\/20027#issuecomment-549269028\"><p>Mozilla recently published a <a href=\"https:\/\/mozillagfx.wordpress.com\/2019\/10\/22\/dramatically-reduced-power-usage-in-firefox-70-on-macos-with-core-animation\/\">good write up<\/a> on why they started using the undocumented CALayer API in Firefox 69.  The TLDR is that that these private API&rsquo;s allowed them to get up to 3x better battery usage in Firefox.  The article also mentioned that Chrome uses these Core Animation API&rsquo;s.<\/p><\/blockquote>\n\n<p>So there are a multiple problems here:<\/p>\n<ol>\n<li>It&rsquo;s (apparently) impossible for Chromium to get competitive performance and battery life without using private API, which <a href=\"https:\/\/github.com\/WebKit\/webkit\/blob\/8e6f62a3b8a57bbe28d36321ee2ceb8a853bb19e\/Source\/WebCore\/PAL\/pal\/spi\/cocoa\/QuartzCoreSPI.h#L148\">Safari freely uses<\/a>.<\/li>\n<li>Apple probably has good reasons for keeping these APIs private.<\/li>\n<li>Private API has always been banned, but Apple has been accepting these apps for years and then abruptly stopped without any notice.<\/li>\n<li>Apps using Electron probably didn&rsquo;t know that they were even using private API. Neither Xcode nor Application Loader reports this, and App Review was accepting the apps.<\/li>\n<li>The rule is not being enforced equally.<\/li>\n<\/ol>\n\n<p><a href=\"https:\/\/twitter.com\/lapcatsoftware\/status\/1191159833111736320\">Jeff Johnson<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/lapcatsoftware\/status\/1191159833111736320\">\n<p>I just checked Slack, which was updated 3 days ago, and its embedded Electron Framework contains all of the listed private symbols.<\/p>\n<p>&ldquo;And developers, from first-time engineers to larger companies, can rest assured that everyone is playing by the same set of rules.&rdquo;<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/news.ycombinator.com\/item?id=21437641\">thomascgalvin<\/a>:<\/p>\n<blockquote cite=\"https:\/\/news.ycombinator.com\/item?id=21437641\"><p>This, however, is draconian:<\/p><blockquote><p>Continuing to use or conceal non-public APIs in future submissions of this app may result in the termination of your Apple Developer account, as well as removal of all associated apps from the App Store.<\/p><\/blockquote><p>&ldquo;Keep trying to submit, and we might just ban you forever&rdquo; is insane. Every program of any complexity depends on third party libraries, and many people wouldn&rsquo;t be able to tell what arcane APIs their dependencies (or their dependencies&rsquo; dependencies) call. &ldquo;If you continue to have an upstream dependency that violates our terms, we might permaban you&rdquo; is bullshit.<\/p><\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/colincornaby\/status\/1191146129993408512\">Colin Cornaby<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/colincornaby\/status\/1191146129993408512\">\n<p>This has got to be a big problem for Apple. The widespread distribution of Electron and Chromium means they have to maintain this as semi-public API. Or risk breaking a lot of apps in a future OS release. Google is forcing them into a bad spot.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/mattbirchler\/status\/1191210188105277441\">Matt<\/a> <a href=\"https:\/\/twitter.com\/mattbirchler\/status\/1191323428072148994\">Birchler<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/mattbirchler\/status\/1191210188105277441\">\n<p>Good people of Twitter, what are your favorite Catalyst apps? Asking because I am yet to find one that is remotely as good as the Electron apps I use daily.<\/p>\n<\/blockquote>\n<blockquote cite=\"https:\/\/twitter.com\/mattbirchler\/status\/1191323428072148994\">I&rsquo;ll be more specific: Slack and Visual Studio Code works great for me, while Postman is a little annoying, but very functional. Meanwhile the Jira and Twitter Catalyst apps have sent me running back for the web.<\/blockquote>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2019\/10\/18\/catalyst-in-catalina\/\">Catalyst in Catalina<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2018\/12\/07\/electron-and-the-decline-of-native-apps\/\">Electron and the Decline of Native Apps<\/a><\/li>\n<\/ul>\n\n<p id=\"electron-apps-rejected-from-the-mac-app-store-update-2019-11-05\">Update (2019-11-05): <a href=\"https:\/\/twitter.com\/anatomisation\/status\/1191579002370064385\">anatomisation<\/a> points out that the Mozilla post does not actually say that they are using private API and that <a href=\"https:\/\/twitter.com\/anatomisation\/status\/1191570345087520768\">WebKit<\/a> is not using <code>CALayerHost<\/code> very extensively. However, <a href=\"https:\/\/github.com\/chromium\/chromium\/search?q=calayerhost&amp;unscoped_q=calayerhost\">Chromium<\/a> does seem to be using it for compositing during rendering.<\/p>\n\n<p><a href=\"https:\/\/twitter.com\/PierreLebeaupin\/status\/1191427490943819776\">Pierre Lebeaupin<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/PierreLebeaupin\/status\/1191427490943819776\">\n<p>Reminds me of the time people found out Unity was relying on an undocumented API, around the iPhoneOS 3 or iOS 4 timeframe IIRC. I think we were affected too (by direct usage, not through Unity. Our bad.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/lapcatsoftware\/status\/1191435623468548096\">Jeff Johnson<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/lapcatsoftware\/status\/1191435623468548096\">\n<p>These private symbols have been in Electron\/Chromium for a long time. Strange coincidence that Apple is changing their enforcement now, so soon after Catalyst is available.<\/p>\n<p>[&#8230;]<\/p>\n<p>That neither Chrome nor Firefox is in the MAS could be considered an indictment of the MAS.<\/p>\n<\/blockquote>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2019\/09\/25\/chrome-updater-bug-prevents-macs-from-booting\/\">Chrome Updater Bug Prevents Macs From Booting<\/a><\/li>\n<\/ul>\n\n<p><a href=\"https:\/\/twitter.com\/rosyna\/status\/1191837554284195840\">Rosyna Keller<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/rosyna\/status\/1191837554284195840\">\n<p>FWIW, Chromium is using <code>CALayerHost<\/code> for something better served by public <code>IOSurface<\/code> APIs and public <code>CALayer<\/code> properties.<\/p>\n<\/blockquote>\n\n<p id=\"electron-apps-rejected-from-the-mac-app-store-update-2019-11-09\">Update (2019-11-09): <a href=\"https:\/\/onezero.medium.com\/apple-is-trying-to-kill-web-technology-a274237c174d\">Owen Williams<\/a> (via <a href=\"https:\/\/news.ycombinator.com\/item?id=21486430\">Hacker News<\/a>):<\/p>\n<blockquote cite=\"https:\/\/onezero.medium.com\/apple-is-trying-to-kill-web-technology-a274237c174d\">\n<p>Developers use technologies like Electron and PWA because they allow for faster updates across platforms without an array of different codebases. Some argue that this results in lower quality apps, but I&rsquo;d argue the alternative is no app at all or apps that are rarely updated because maintaining unique Windows, Mac, and web-based products is complex and expensive.<\/p>\n<p>[&#8230;]<\/p>\n<p>Apple&rsquo;s subtle, anti-competitive practices don&rsquo;t look terrible in isolation, but together they form a clear strategy: Make it so painful to build with web-based technology on Apple platforms that developers won&rsquo;t bother.<\/p>\n<p>[&#8230;]<\/p>\n<p>These types of changes may be made in the name of privacy or security, but the reality is that the argument looks weak when both users and developers simply don&rsquo;t have a choice because Apple controls the platform, browser engine, and the distribution method. Regardless of your opinion of Electron app quality, choice is important.<\/p>\n<\/blockquote>\n\n<p id=\"electron-apps-rejected-from-the-mac-app-store-update-2019-12-17\">Update (2019-12-17): <a href=\"https:\/\/twitter.com\/lapcatsoftware\/status\/1202572339562631170\">Jeff Johnson<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/lapcatsoftware\/status\/1202572339562631170\"><p>Slack was updated again today in the Mac App Store, and guess what? The private symbols are still there.<\/p><\/blockquote>","protected":false},"excerpt":{"rendered":"<p>David.dev (via Ben Sandofsky, Hacker News, Slashdot): Allright, as a follow up to the previous chapter in this odyssey I can now state that, apparently,&nbsp;&nbsp;you cannot submit an electron 6 or 7 app to the apple store:The first refusal from apple states: Your app app links against the following non-public framework(s):CAContextCALayerHostNSAccessibilityRemoteUIElementNSNextStepFrameNSThemeFrameNSURLFileTypeMappings I am not the [&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":"2019-11-04T19:22:31Z","apple_news_api_id":"26f69891-2c5f-4902-9e28-2281220c0a30","apple_news_api_modified_at":"2019-12-18T00:30:12Z","apple_news_api_revision":"AAAAAAAAAAAAAAAAAAAACQ==","apple_news_api_share_url":"https:\/\/apple.news\/AJvaYkSxfSQKeKCKBIgwKMA","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":[130,1621,412,689,1627,279,456,30,39,1666,1013,103,1500,1227],"class_list":["post-27172","post","type-post","status-publish","format-standard","hentry","category-technology","tag-rejection","tag-marzipan","tag-chromium","tag-core-animation","tag-electron","tag-firefox","tag-googlechrome","tag-mac","tag-macappstore","tag-macos-10-15","tag-private-api","tag-safari","tag-slack","tag-top-posts"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/27172","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=27172"}],"version-history":[{"count":10,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/27172\/revisions"}],"predecessor-version":[{"id":27606,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/27172\/revisions\/27606"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=27172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=27172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=27172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}