NetNewsWire/Frameworks/Account/AccountTests/Feedly/Initial/saved_initial.json

1 line
48 KiB
JSON
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved","items":[{"originId":"https://inessential.com/2019/10/14/netnewswire_os_compatibility_strategy","fingerprint":"fa6e6fff","id":"+jHfsXnBCVfCstSIW1WDumAyigT4rnsUPnI5WFxgnAU=_16dccdfc972:a6e5:d4506071","summary":{"direction":"ltr","content":"<p>We have two goals with the app: 1) get as many people using RSS as possible, and 2) make the best app we can.</p>\n<p>To reach #2 — making the best app we can — we need to do a couple things. One is stay modern: use new APIs and tools that make the app better and easier to maintain. A second is to not spend time on things that dont make the app better. A third is to attract and retain contributors, who are usually more psyched to work with modern stuff than with old stuff.</p>\n<p>You can see how thats in a little bit of conflict with #1 (getting as many people as possible using RSS readers).</p>\n<h4>Heres the plan</h4>\n<p>After a major OS update, we will switch to requiring that update on our next major release — where major is defined as something like 5.0 or 5.1, but not something like 5.0.1. (In other words: the upcoming NetNewsWire 5.0.3 release will run on Mojave, while NetNewsWire 5.1 will require Catalina.)</p>\n<p>At the same time, we will make older versions available via the website. For instance, the last version that will run on Mojave will likely be 5.0.4 (which isnt finished yet) — and well make that version available indefinitely for people who havent upgraded to Catalina.</p>\n<p>This will mean that people running older OSes will still get a high-quality app — its just that it wont have the latest features.</p>\n<p>The key is that this allows us to make NetNewsWire the best app it can be, and making the best app we can is also part of furthering the goal of getting as many people as possible using RSS. (The biggest part, in fact. Bigger than compatibility with older OSes.)</p>\n<p>While I know this will disappoint some people, I hope youll understand <em>why</em> we decided to do it this way. Decisions like this are never easy — there are always conflicting values to weigh, pros and cons and add up — and we dont make them impulsively. But making NetNewsWire the best app it can be has to be job #1.</p>"},"alternate":[{"href":"https://inessential.com/2019/10/14/netnewswire_os_compatibility_strategy","type":"text/html"}],"crawled":1571100281202,"title":"NetNewsWire OS Compatibility Strategy","published":1571099404000,"origin":{"streamId":"feed/http://ranchero.com/xml/rss.xml","htmlUrl":"https://inessential.com/","title":"inessential.com"},"unread":false,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8","label":"THree"}],"tags":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved","label":"Saved For Later"},{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read","label":""}],"actionTimestamp":1571123677415},{"keywords":["Xcode"],"originId":"https://nshipster.com/swiftui-previews","fingerprint":"e3a6f78b","id":"08l+9ftpGejQ9f/2DZ6dom5rSnNJJO9OCox6I3nUnWg=_16dc8d7749a:96ed:d4506071","updated":1571036400000,"author":"Mattt","summary":{"direction":"ltr","content":"<p>Working on a large iOS codebase often involves a lot of waiting. But with Xcode 11, our wait is finally over — and its all thanks to SwiftUI.</p>"},"alternate":[{"href":"https://nshipster.com/swiftui-previews/","type":"text/html"}],"crawled":1571032626330,"title":"SwiftUI Previews on macOS Catalina and Xcode 11","published":1571036400000,"origin":{"streamId":"feed/http://nshipster.com/feed.xml","htmlUrl":"https://nshipster.com/","title":"NSHipster"},"content":{"direction":"ltr","content":"<p>Working on a large iOS codebase often involves a lot of waiting:\nWaiting for Xcode to index your files,\nwaiting for Swift and Objective-C code to compile,\nwaiting for the Simulator to boot and your app to launch…</p>\n<p>And after all of that,\nyou spend even more time getting your app\ninto a particular state and onto a particular screen,\njust to see whether the Auto Layout constraint you just added\nfixes that regression you found.\nIt didnt, of course,\nso you jump back into Xcode,\ntweak the Content Hugging Priority,\nhit <kbd>⌘</kbd><kbd>R</kbd>,\nand start the whole process again.</p>\n<p>We might relate our sorry predicament to\n<a rel=\"noopener noreferrer\" href=\"https://xkcd.com/303/\">that one xkcd comic</a>,\nbut for those of us who dont so much relish in\nthe stop-and-go nature of app development,\ntheres an old Yiddish joke about Shlemiel the painter\n<em>(provided below with a few -specific modifications;\nfor the uninitiated,\nplease refer to Joel Spolskys\n<a rel=\"noopener noreferrer\" href=\"https://www.joelonsoftware.com/2001/12/11/back-to-basics/\">original telling</a>)</em>:</p>\n<blockquote>\n<p>Shlemiel gets a job as a software developer,\nimplementing a new iOS app.\nOn the first sprint he opens Xcode\nand implements 10 new screens of the app.\n<em>“Thats pretty good!”</em> says his manager,\n<em>“youre a fast worker!”</em> and pays him a Bitcoin.</p>\n<p>The next sprint Shlemiel only gets 5 screens done.\n<em>“Well, thats not nearly as good as yesterday,\nbut youre still a fast worker. 5 screens is respectable,”</em>\nand pays him a Bitcoin.</p>\n<p>The next sprint Shlemiel implements 1 screen.\n<em>“Only 1!”</em> shouts his manager.\n<em>“Thats unacceptable!\nOn the first day you did ten times that much work!\nWhats going on?”</em></p>\n<p><em>“I cant help it,”</em> says Shlemiel.\n<em>“Each sprint I get further and further away from\n<code>application(_:did<wbr>Finish<wbr>Launching<wbr>With<wbr>Options:)</code>!”</em></p>\n</blockquote>\n<p>Over the years,\nthere have been some developments thatve helped things slightly,\nincluding\n<a href=\"https://nshipster.com/ibinspectable-ibdesignable/\"><code>@IBInspectable</code> and <code>@IBDesignable</code></a>\nand <a href=\"https://nshipster.com/xcplayground/\">Xcode Playgrounds</a>.\nBut with Xcode 11,\nour wait is finally over —\nand its all thanks to SwiftUI.</p>\n<hr>\n<aside>\n<p>The functionality described in this article requires the following:</p>\n<ul>\n<li><strong>Xcode 11</strong></li>\n<li><strong>macOS Catalina</strong></li>\n<li>\n<strong>iOS 13</strong> set as the <strong>Base SDK</strong> for your apps <strong>Debug</strong> configuration</li>\n</ul>\n<p>Without these three things,\nyour code either wont compile or wont render live previews.</p>\n</aside>\n<hr>\n<p>Although many of us have taken a <a href=\"https://nshipster.com/wwdc-2019/\"><em>“wait and see”</em> approach</a> to SwiftUI,\nwe can start using its capabilities <strong>today</strong>\nto radically speed up and improve our development process —\n<em>without changing a line of code in our UIKit apps</em>.</p>\n<p>Consider a subclass of <code>UIButton</code>\nthat draws a border around itself:</p>\n<pre data-lang=\"Swift\"><code><span>final</span> <span>class</span> <span>Bordered<wbr>Button</span><span>:</span> <span>UIButton</span> <span>{</span>\n <span>var</span> <span>corner<wbr>Radius</span><span>:</span> <span>CGFloat</span> <span>{</span> <var>...</var> <span>}</span>\n <span>var</span> <span>border<wbr>Width</span><span>:</span> <span>CGFloat</span> <span>{</span> <var>...</var> <span>}</span>\n <span>var</span> <span>border<wbr>Color</span><span>:</span> <span>UIColor</span><span>?</span> <span>{</span> <var>...</var> <span>}</span>\n <span>}</span>\n </code></pre>\n<p>Normally,\nif we wanted to test how our UI element performs,\nwed have to add it to a view in our app,\nbuild and run,\nand navigate to that screen.\nBut with Xcode 11,\nwe can now see a preview side-by-side with the code editor\nby adding the following under the original declaration of <code>Bordered<wbr>Button</code>:</p>\n<div>\n<pre data-lang=\"Swift\"><code><span>#if can<wbr>Import(Swift<wbr>UI) &amp;&amp; DEBUG</span>\n <span>import</span> <span>Swift<wbr>UI</span>\n <span>@available(i<wbr>OS 13.0, *)</span>\n <span>struct</span> <span>Bordered<wbr>Button_Preview</span><span>:</span> <span>Preview<wbr>Provider</span> <span>{</span>\n <span>static</span> <span>var</span> <span>previews</span><span>:</span> <span>some</span> <span>View</span> <span>{</span>\n <span>UIView<wbr>Preview</span> <span>{</span>\n <span>let</span> <span>button</span> <span>=</span> <span>Bordered<wbr>Button</span><span>(</span><span>frame</span><span>:</span> <span>.</span><span>zero</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Title</span><span>(</span><span>&quot;Follow&quot;</span><span>,</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>tint<wbr>Color</span> <span>=</span> <span>.</span><span>system<wbr>Orange</span>\n <span>button</span><span>.</span><span>set<wbr>Title<wbr>Color</span><span>(</span><span>.</span><span>system<wbr>Orange</span><span>,</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>return</span> <span>button</span>\n <span>}</span><span>.</span><span>preview<wbr>Layout</span><span>(</span><span>.</span><span>size<wbr>That<wbr>Fits</span><span>)</span>\n <span>.</span><span>padding</span><span>(</span><span>10</span><span>)</span>\n <span>}</span>\n <span>}</span>\n <span>#endif</span>\n </code></pre>\n<aside>\n<p><img alt=\"SwiftUI preview with Follow button\" src=\"https://nshipster.com/assets/swiftui-preview-follow-94a523cd048a0cd14d78414d55d238e9c57abd3ed7ea30dd9a6fb73facc05d78.png\"></p>\n</aside>\n</div>\n<p>Using a new feature called <dfn>dynamic replacement</dfn>,\nXcode can update this preview without recompiling —\nwithin moments of your making a code change.\nThis lets you rapidly prototype changes like never before.</p>\n<p>Want to see how your button handles long titles?\nBang away on your keyboard within the call to <code>set<wbr>Title(_:for:)</code>\nin your preview,\nand test out potential fixes in your underlying implementation\nwithout so much as leaving your current file!</p>\n<aside>\n<p><code>UIView<wbr>Preview</code> is a custom, generic structure\nthat we created to conveniently host previews of <code>UIView</code> subclasses.\nFeel free to <a rel=\"noopener noreferrer\" href=\"https://gist.github.com/mattt/ff6b58af8576c798485b449269d43607\">download the source</a>\nand add it to your project directly.</p>\n<p>Incorporating a proper dependency would be complicated by\nthe conditional import and iOS 13 Base SDK settings\nrequired to make Xcode Previews work for non-SwiftUI apps,\nso in this particular instance,\nwe think its best to embed these files directly.</p>\n<details>\n\n<pre data-lang=\"Swift\"><code><span>import</span> <span>UIKit</span>\n <span>#if can<wbr>Import(Swift<wbr>UI) &amp;&amp; DEBUG</span>\n <span>import</span> <span>Swift<wbr>UI</span>\n <span>struct</span> <span>UIView<wbr>Preview</span><span>&lt;</span><span>View</span><span>:</span> <span>UIView</span><span>></span><span>:</span> <span>UIView<wbr>Representable</span> <span>{</span>\n <span>let</span> <span>view</span><span>:</span> <span>View</span>\n <span>init</span><span>(</span><span>_</span> <span>builder</span><span>:</span> <span>@escaping</span> <span>()</span> <span>-></span> <span>View</span><span>)</span> <span>{</span>\n <span>view</span> <span>=</span> <span>builder</span><span>()</span>\n <span>}</span>\n <span>// MARK: - UIView<wbr>Representable</span>\n <span>func</span> <span>make<wbr>UIView</span><span>(</span><span>context</span><span>:</span> <span>Context</span><span>)</span> <span>-></span> <span>UIView</span> <span>{</span>\n <span>return</span> <span>view</span>\n <span>}</span>\n <span>func</span> <span>update<wbr>UIView</span><span>(</span><span>_</span> <span>view</span><span>:</span> <span>UIView</span><span>,</span> <span>context</span><span>:</span> <span>Context</span><span>)</span> <span>{</span>\n <span>view</span><span>.</span><span>set<wbr>Content<wbr>Hugging<wbr>Priority</span><span>(</span><span>.</span><span>default<wbr>High</span><span>,</span> <span>for</span><span>:</span> <span>.</span><span>horizontal</span><span>)</span>\n <span>view</span><span>.</span><span>set<wbr>Content<wbr>Hugging<wbr>Priority</span><span>(</span><span>.</span><span>default<wbr>High</span><span>,</span> <span>for</span><span>:</span> <span>.</span><span>vertical</span><span>)</span>\n <span>}</span>\n <span>}</span>\n <span>#endif</span>\n </code></pre>\n</details>\n</aside>\n<h2>\n<a href=\"https://nshipster.com/swiftui-previews/#previewing-multiple-states\"></a>Previewing Multiple States</h2>\n<p>Lets say our app had a <code>Favorite<wbr>Button</code> —\na distant cousin (perhaps by composition) to <code>Bordered<wbr>Button</code>.\nIn its default state,\nit shows has the title “Favorite”\nand displays a <span title=\"Heart\">♡</span> icon.\nWhen its <code>is<wbr>Favorited</code> property is set to <code>true</code>,\nthe title is set to “Unfavorite”\nand displays a <span title=\"Heart with slash\">♡̸</span> icon.</p>\n<p>We can preview both at once\nby wrapping two <code>UIView<wbr>Preview</code> instances within a single SwiftUI <code>Group</code>:</p>\n<div>\n<pre data-lang=\"Swift\"><code><span>Group</span> <span>{</span>\n <span>UIView<wbr>Preview</span> <span>{</span>\n <span>let</span> <span>button</span> <span>=</span> <span>Favorite<wbr>Button</span><span>(</span><span>frame</span><span>:</span> <span>.</span><span>zero</span><span>)</span>\n <span>return</span> <span>button</span>\n <span>}</span>\n <span>UIView<wbr>Preview</span> <span>{</span>\n <span>let</span> <span>button</span> <span>=</span> <span>Favorite<wbr>Button</span><span>(</span><span>frame</span><span>:</span> <span>.</span><span>zero</span><span>)</span>\n <span>button</span><span>.</span><span>is<wbr>Favorited</span> <span>=</span> <span>true</span>\n <span>return</span> <span>button</span>\n <span>}</span>\n <span>}</span><span>.</span><span>preview<wbr>Layout</span><span>(</span><span>.</span><span>size<wbr>That<wbr>Fits</span><span>)</span>\n <span>.</span><span>padding</span><span>(</span><span>10</span><span>)</span>\n </code></pre>\n<aside>\n<p><img alt=\"SwiftUI previews with Favorite and Unfavorite buttons\" src=\"https://nshipster.com/assets/swiftui-preview-favorite-unfavorite-e0658904f16daa64c98d7ae4e9e35d011f3c1996da29b3aecc4a8c438298e13f.png\"></p>\n</aside>\n</div>\n<aside>\n<p>The chained <code>preview<wbr>Layout</code> and <code>padding</code> methods\napply to each member of the <code>Group</code>.\nYou can use these and\n<a rel=\"noopener noreferrer\" href=\"https://developer.apple.com/documentation/swiftui/view\">other <code>View</code> methods</a>\nto change the appearance of your previews.</p>\n</aside>\n<h2>\n<a href=\"https://nshipster.com/swiftui-previews/#previewing-dark-mode\"></a>Previewing Dark Mode</h2>\n<p>With <a href=\"https://nshipster.com/dark-mode/\">Dark Mode in iOS 13</a>,\nits always a good idea to double-check that your custom views\nare configured with dynamic colors\nor accommodate both light and dark appearance in some other way.</p>\n<p>An easy way to do this\nwould be to use a <code>For<wbr>Each</code> element\nto render a preview for each case in the <code>Color<wbr>Scheme</code> enumeration:</p>\n<div>\n<pre data-lang=\"Swift\"><code><span>For<wbr>Each</span><span>(</span><span>Color<wbr>Scheme</span><span>.</span><span>all<wbr>Cases</span><span>,</span> <span>id</span><span>:</span> <span>\\</span><span>.</span><span>self</span><span>)</span> <span>{</span> <span>color<wbr>Scheme</span> <span>in</span>\n <span>UIView<wbr>Preview</span> <span>{</span>\n <span>let</span> <span>button</span> <span>=</span> <span>Bordered<wbr>Button</span><span>(</span><span>frame</span><span>:</span> <span>.</span><span>zero</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Title</span><span>(</span><span>&quot;Subscribe&quot;</span><span>,</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Image</span><span>(</span><span>UIImage</span><span>(</span><span>system<wbr>Name</span><span>:</span> <span>&quot;plus&quot;</span><span>),</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Title<wbr>Color</span><span>(</span><span>.</span><span>system<wbr>Orange</span><span>,</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>tint<wbr>Color</span> <span>=</span> <span>.</span><span>system<wbr>Orange</span>\n <span>return</span> <span>button</span>\n <span>}</span><span>.</span><span>environment</span><span>(\\</span><span>.</span><span>color<wbr>Scheme</span><span>,</span> <span>color<wbr>Scheme</span><span>)</span>\n <span>.</span><span>preview<wbr>Display<wbr>Name</span><span>(</span><span>&quot;</span><span>\\(</span><span>color<wbr>Scheme</span><span>)</span><span>&quot;</span><span>)</span>\n <span>}</span><span>.</span><span>preview<wbr>Layout</span><span>(</span><span>.</span><span>size<wbr>That<wbr>Fits</span><span>)</span>\n <span>.</span><span>background</span><span>(</span><span>Color</span><span>(</span><span>.</span><span>system<wbr>Background</span><span>))</span>\n <span>.</span><span>padding</span><span>(</span><span>10</span><span>)</span>\n </code></pre>\n<aside>\n<p><img alt=\"SwiftUI previews with different color schemes\" src=\"https://nshipster.com/assets/swiftui-preview-color-schemes-34bd0a96b6e3768b29f0ddd537ee99243fed2430bc42a7a4f535fad5ec533fbe.png\"></p>\n</aside>\n</div>\n<aside>\n<p>When rendering previews with <code>For<wbr>Each</code>,\nuse the <code>preview<wbr>Display<wbr>Name</code> method to help distinguish among\nall of the enumerated values.</p>\n</aside>\n<h2>\n<a href=\"https://nshipster.com/swiftui-previews/#previewing-dynamic-type-size-categories\"></a>Previewing Dynamic Type Size Categories</h2>\n<p>We can use the same approach to preview our views in various\n<a rel=\"noopener noreferrer\" href=\"https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/typography/\">Dynamic Type Sizes</a>:</p>\n<div>\n<pre data-lang=\"Swift\"><code><span>For<wbr>Each</span><span>(</span><span>Content<wbr>Size<wbr>Category</span><span>.</span><span>all<wbr>Cases</span><span>,</span> <span>id</span><span>:</span> <span>\\</span><span>.</span><span>self</span><span>)</span> <span>{</span> <span>size<wbr>Category</span> <span>in</span>\n <span>UIView<wbr>Preview</span> <span>{</span>\n <span>let</span> <span>button</span> <span>=</span> <span>Bordered<wbr>Button</span><span>(</span><span>frame</span><span>:</span> <span>.</span><span>zero</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Title</span><span>(</span><span>&quot;Subscribe&quot;</span><span>,</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Image</span><span>(</span><span>UIImage</span><span>(</span><span>system<wbr>Name</span><span>:</span> <span>&quot;plus&quot;</span><span>),</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Title<wbr>Color</span><span>(</span><span>.</span><span>system<wbr>Orange</span><span>,</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>tint<wbr>Color</span> <span>=</span> <span>.</span><span>system<wbr>Orange</span>\n <span>return</span> <span>button</span>\n <span>}</span><span>.</span><span>environment</span><span>(\\</span><span>.</span><span>size<wbr>Category</span><span>,</span> <span>size<wbr>Category</span><span>)</span>\n <span>.</span><span>preview<wbr>Display<wbr>Name</span><span>(</span><span>&quot;</span><span>\\(</span><span>size<wbr>Category</span><span>)</span><span>&quot;</span><span>)</span>\n <span>}</span><span>.</span><span>preview<wbr>Layout</span><span>(</span><span>.</span><span>size<wbr>That<wbr>Fits</span><span>)</span>\n <span>.</span><span>padding</span><span>(</span><span>10</span><span>)</span>\n </code></pre>\n<aside>\n<p><img alt=\"SwiftUI previews with different content size categories\" src=\"https://nshipster.com/assets/swiftui-preview-content-size-categories-33be9504b46e4fbfc96f152a165378b9b517c1ca54c20ea21096a7767c49dd67.png\"></p>\n</aside>\n</div>\n<h2>\n<a href=\"https://nshipster.com/swiftui-previews/#previewing-different-locales\"></a>Previewing Different Locales</h2>\n<p>Xcode Previews are especially time-saving when it comes to\nlocalizing an app into multiple languages.\nCompared to the hassle of configuring Simulator\nback and forth between different languages and regions,\nthis new approach makes a world of difference.</p>\n<p>Lets say that, in addition to English,\nyour app supported various <a rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Right-to-left\">right-to-left languages</a>.\nYou could verify that your\n<abbr title=\"Right-to-Left\">RTL</abbr> logic worked as expected like so:</p>\n<div>\n<pre data-lang=\"Swift\"><code><span>let</span> <span>supported<wbr>Locales</span><span>:</span> <span>[</span><span>Locale</span><span>]</span> <span>=</span> <span>[</span>\n <span>&quot;en-US&quot;</span><span>,</span> <span>// English (United States)</span>\n <span>&quot;ar-QA&quot;</span><span>,</span> <span>// Arabid (Qatar)</span>\n <span>&quot;he-IL&quot;</span><span>,</span> <span>// Hebrew (Israel)</span>\n <span>&quot;ur-IN&quot;</span> <span>// Urdu (India)</span>\n <span>]</span><span>.</span><span>map</span><span>(</span><span>Locale</span><span>.</span><span>init</span><span>(</span><span>identifier</span><span>:))</span>\n <span>func</span> <span>localized<wbr>String</span><span>(</span><span>_</span> <span>key</span><span>:</span> <span>String</span><span>,</span> <span>for</span> <span>locale</span><span>:</span> <span>Locale</span><span>)</span> <span>-></span> <span>String</span><span>?</span> <span>{</span> <var>...</var> <span>}</span>\n <span>return</span> <span>For<wbr>Each</span><span>(</span><span>supported<wbr>Locales</span><span>,</span> <span>id</span><span>:</span> <span>\\</span><span>.</span><span>identifier</span><span>)</span> <span>{</span> <span>locale</span> <span>in</span>\n <span>UIView<wbr>Preview</span> <span>{</span>\n <span>let</span> <span>button</span> <span>=</span> <span>Bordered<wbr>Button</span><span>(</span><span>frame</span><span>:</span> <span>.</span><span>zero</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Title</span><span>(</span><span>localized<wbr>String</span><span>(</span><span>&quot;Subscribe&quot;</span><span>,</span> <span>for</span><span>:</span> <span>locale</span><span>),</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Image</span><span>(</span><span>UIImage</span><span>(</span><span>system<wbr>Name</span><span>:</span> <span>&quot;plus&quot;</span><span>),</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>set<wbr>Title<wbr>Color</span><span>(</span><span>.</span><span>system<wbr>Orange</span><span>,</span> <span>for</span><span>:</span> <span>.</span><span>normal</span><span>)</span>\n <span>button</span><span>.</span><span>tint<wbr>Color</span> <span>=</span> <span>.</span><span>system<wbr>Orange</span>\n <span>return</span> <span>button</span>\n <span>}</span><span>.</span><span>environment</span><span>(\\</span><span>.</span><span>locale</span><span>,</span> <span>locale</span><span>)</span>\n <span>.</span><span>preview<wbr>Display<wbr>Name</span><span>(</span><span>Locale</span><span>.</span><span>current</span><span>.</span><span>localized<wbr>String</span><span>(</span><span>for<wbr>Identifier</span><span>:</span> <span>locale</span><span>.</span><span>identifier</span><span>))</span>\n <span>}</span><span>.</span><span>preview<wbr>Layout</span><span>(</span><span>.</span><span>size<wbr>That<wbr>Fits</span><span>)</span>\n <span>.</span><span>padding</span><span>(</span><span>10</span><span>)</span>\n </code></pre>\n<aside>\n<p><img alt=\"SwiftUI previews with different locales\" src=\"https://nshipster.com/assets/swiftui-preview-locales-4a05412203ff6074a58a86ad4e5e742e8250d2f70ae898c27c19fa5bd4a405f5.png\"></p>\n</aside>\n</div>\n<aside>\n<p>We dont know of an easy way to use <code>NSLocalized<wbr>String</code> with an explicit locale.\nYou could go to the trouble of retrieving localized strings\nfrom a strings file in your bundle,\nbut in most cases,\nyoull be just fine hard-coding text in your previews.</p>\n</aside>\n<h2>\n<a href=\"https://nshipster.com/swiftui-previews/#previewing-view-controllers-on-different-devices\"></a>Previewing View Controllers on Different Devices</h2>\n<p>SwiftUI previews arent limited to views,\nyou can also use them with view controllers.\nBy creating a <a rel=\"noopener noreferrer\" href=\"https://gist.github.com/mattt/ff6b58af8576c798485b449269d43607\">custom <code>UIView<wbr>Controller<wbr>Preview</code> type</a>\nand taking advantage of some\n<a href=\"https://nshipster.com/ios-13/#remove-implicitly-unwrapped-optionals-from-view-controllers-initialized-from-storyboards\">new <code>UIStoryboard</code> class methods in iOS 13</a>,\nwe can easily preview our view controller\non various devices —\none on top of another:</p>\n<div>\n<pre data-lang=\"Swift\"><code><span>#if can<wbr>Import(Swift<wbr>UI) &amp;&amp; DEBUG</span>\n <span>import</span> <span>Swift<wbr>UI</span>\n <span>let</span> <span>device<wbr>Names</span><span>:</span> <span>[</span><span>String</span><span>]</span> <span>=</span> <span>[</span>\n <span>&quot;i<wbr>Phone SE&quot;</span><span>,</span>\n <span>&quot;i<wbr>Pad 11 Pro Max&quot;</span><span>,</span>\n <span>&quot;i<wbr>Pad Pro (11-inch)&quot;</span>\n <span>]</span>\n <span>@available(i<wbr>OS 13.0, *)</span>\n <span>struct</span> <span>View<wbr>Controller_Preview</span><span>:</span> <span>Preview<wbr>Provider</span> <span>{</span>\n <span>static</span> <span>var</span> <span>previews</span><span>:</span> <span>some</span> <span>View</span> <span>{</span>\n <span>For<wbr>Each</span><span>(</span><span>device<wbr>Names</span><span>,</span> <span>id</span><span>:</span> <span>\\</span><span>.</span><span>self</span><span>)</span> <span>{</span> <span>device<wbr>Name</span> <span>in</span>\n <span>UIView<wbr>Controller<wbr>Preview</span> <span>{</span>\n <span>UIStoryboard</span><span>(</span><span>name</span><span>:</span> <span>&quot;Main&quot;</span><span>,</span> <span>bundle</span><span>:</span> <span>nil</span><span>)</span>\n <span>.</span><span>instantiate<wbr>Initial<wbr>View<wbr>Controller</span> <span>{</span> <span>coder</span> <span>in</span>\n <span>View<wbr>Controller</span><span>(</span><span>coder</span><span>:</span> <span>coder</span><span>)</span>\n <span>}</span><span>!</span>\n <span>}</span><span>.</span><span>preview<wbr>Device</span><span>(</span><span>Preview<wbr>Device</span><span>(</span><span>raw<wbr>Value</span><span>:</span> <span>device<wbr>Name</span><span>))</span>\n <span>.</span><span>preview<wbr>Display<wbr>Name</span><span>(</span><span>device<wbr>Name</span><span>)</span>\n <span>}</span>\n <span>}</span>\n <span>}</span>\n <span>#endif</span>\n </code></pre>\n<aside>\n<p><img alt=\"SwiftUI previews with different devices\" src=\"https://nshipster.com/assets/swiftui-preview-devices-c15a3ade082a4860c53f81fc6b5f3975e92d1570663c9e79cd10889d872564ad.png\"></p>\n</aside>\n</div>\n<aside>\n<p>Theres currently no way to get SwiftUI device previews in landscape orientation.\nAlthough you can approximate this with a fixed size preview layout,\nbe aware that it wont respect Safe Area on iPhone\nor render split views correctly on iPad.</p>\n</aside>\n<hr>\n<p>Although most of us are still some years away from shipping SwiftUI in our apps\n(whether by choice or necessity),\nwe can all immediately benefit from the order-of-magnitude improvement\nit enables with Xcode 11 on macOS Catalina.</p>\n<p>By eliminating so much time spent waiting for things to happen,\nwe not only get (literally) <em>hours</em> more time each week,\nbut we unlock the possibility of maintaining an unbroken flow state during that time.\nNot only that,\nbut the convenience of integrated tests\nfundamentally changes the calculus for testing:\ninstead of being a rare <em>“nice to have,”</em>\ntheyre the new default.\nPlus:\nthese inline previews serve as living documentation\nthat can help teams both large and small\nfinally get a handle on their design system.</p>\n<p>Its hard to overstate how much of a game-changer Xcode Previews are for iOS development,\nand we couldnt be happier to incorporate them into our workflow.</p>\n"},"visual":{"url":"none"},"unread":false,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/885f2e01-d314-4e63-abac-17dcb063f5b5","label":"Programming"}],"tags":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved","label":"Saved For Later"},{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read","label":""}],"actionTimestamp":1571037592868},{"originId":"tag:blogger.com,1999:blog-8954608646904080796.post-3215871338266756283","fingerprint":"717870dc","thumbnail":[{"url":"https://1.bp.blogspot.com/-JTONCNpv2X8/XaEUgnGZSzI/AAAAAAAADTg/EaM5cDjkD3kRnXPIR0-6AX-3VxlC_br_QCEwYBhgL/s72-c/091.jpg","width":72,"height":72}],"id":"v0v+7Ya8tssIZvd3/pcnFRr3HwvY/5YK3FGc2t65c0Y=_16dbd619e56:82fa:d4506071","updated":1570837682218,"author":"Edward Feser","alternate":[{"href":"http://edwardfeser.blogspot.com/2019/10/around-web.html","type":"text/html"}],"crawled":1570840354390,"title":"Around the web","published":1570837680000,"origin":{"streamId":"feed/http://edwardfeser.blogspot.com/feeds/posts/default","htmlUrl":"http://edwardfeser.blogspot.com/","title":"Edward Feser"},"content":{"direction":"ltr","content":"<br><div></div><div></div><div><a href=\"https://1.bp.blogspot.com/-JTONCNpv2X8/XaEUgnGZSzI/AAAAAAAADTg/EaM5cDjkD3kRnXPIR0-6AX-3VxlC_br_QCEwYBhgL/s1600/091.jpg\"><img border=\"0\" src=\"https://1.bp.blogspot.com/-JTONCNpv2X8/XaEUgnGZSzI/AAAAAAAADTg/EaM5cDjkD3kRnXPIR0-6AX-3VxlC_br_QCEwYBhgL/s200/091.jpg\" data-original-width=\"166\" width=\"136\" data-original-height=\"243\" height=\"200\"></a></div><div><span>At <i>The Catholic Thing</i>, Fr. Thomas Weinandy on <span><a href=\"https://www.thecatholicthing.org/2019/10/08/pope-francis-and-schism/\">the studied ambiguity of Pope Francis.</a></span>  In his new book <i>Conciliar Octet</i>, Fr. Aidan Nichols on <a href=\"https://www.catholicworldreport.com/2019/08/22/fr-aidan-nichols-conciliar-octet-is-a-welcome-guide-to-the-eight-key-texts-of-vatican-ii/\">the hermeneutic of continuity and Vatican II</a>. </span></div><div><span><br></span></div><div><span>At <i>Medium</i>, philosopher Kathleen Stock on <span><a href=\"https://medium.com/@kathleenstock/are-academics-freely-able-to-criticise-the-idea-of-gender-identity-in-uk-universities-67b97c6e04be\">gender theory versus academic freedom in the UK</a></span>.<span>  </span>At <i>Inside Higher Education</i>, twelve prominent philosophers <span><a href=\"https://www.insidehighered.com/views/2019/07/22/philosophers-should-not-be-sanctioned-their-positions-sex-and-gender-opinion\">defend the right to free inquiry on matters of sex and gender</a></span>.<span>  </span></span></div><div><span><span><br></span></span></div><div><span>Philosopher Daniel A. Kaufman on <span><a href=\"https://theelectricagora.com/2019/09/08/philosophys-aspirant-tin-pot-dictators/\">the “woke” fanatics increasingly infesting academic philosophy</a></span>, at <i>The Electric Agora</i>.<span>  </span>Richard Marshall <span><a href=\"https://316am.site123.me/articles/anti-theory-philosophy?c=end-times-series\">interviews Kaufman</a></span> at <i>3:16</i>.<span> </span></span></div><a name=\"more\"></a> <br> <div><span>Peggy Noonan on <u><a href=\"http://peggynoonan.com/what-were-robespierres-pronouns/\">transgender Jacobinism</a></u>, at <i>The Wall Street Journal</i>.<span>  </span>At YouTube, <u><a href=\"https://www.youtube.com/watch?v=IzNGkwGYE4E\">video of an indoctrination session</a></u>.<span><span></span></span></span></div><div><span><br></span></div><div><span>Jacob Howland on <span><a href=\"https://newcriterion.com/issues/2019/10/borgess-mirror\">Borgess Library of Babel</a></span>, at <i>The New Criterion</i>.</span></div><div><span><br></span></div><div><span>At <i>New Statesman</i>, John Gray on Tom Holland on <u><a href=\"https://www.newstatesman.com/dominion-making-western-mind-tom-holland-review\">the Christian origins of modern secular liberal values</a></u>.<span>  </span>More reviews <u><a href=\"https://kirkcenter.org/reviews/the-origin-of-the-secular-species/\">at <i>The University Bookman</i></a></u> and <u><a href=\"https://literaryreview.co.uk/it-began-in-a-manger\">at <i>Literary Review</i></a></u>.</span></div><div><span><br></span></div><div><span>At <i>Quillette</i>, Benedict Beckeld diagnoses <span><a href=\"https://quillette.com/2019/10/07/oikophobia-our-western-self-hatred/\">Western self-hatred or <i>oikophobia</i></a></span>.</span></div><div><span><br></span></div><div><u><span><a href=\"http://www.axs.tv/featured/shaffer-105/\">Donald Fagen interviewed</a></span></u><span> on <i>Paul Shaffer Plus One</i>.</span></div><div><span><br></span></div><div><span>Kay Hymowitz on <span><a href=\"https://www.washingtonexaminer.com/opinion/a-nation-dying-in-despair-and-family-breakdown-is-part-of-the-problem\">the sexual revolution and mental health</a></span>, at <i>The Washington Examiner</i>.</span></div><div><span><br></span></div><div><span>John DeRosa of the Classical Theism Podcast <span><a href=\"http://www.classicaltheism.com/kerr/\">interviews Thomist philosopher Gaven Kerr</a></span> on the topic of Aquinas and creation.</span></div><div><span><br></span></div><div><span>Ronald W. Dworkin on <span><a href=\"https://www.the-american-interest.com/2019/10/08/artificial-intelligence-whats-to-fear/\">“artificial intelligence” as a projection of artificial intelligence researchers</a></span>, at <i>The American Interest</i>.</span></div><div><span><br></span></div><div><span>New books on Aquinas: <span><i><a href=\"https://global.oup.com/academic/product/aquinas-and-the-metaphysics-of-creation-9780190941307?cc=us&lang=en&\">Aquinas and the Metaphysics of Creation</a></i></span>, by Gaven Kerr; <span><i><a href=\"https://www.hfsbooks.com/books/the-discovery-of-being-and-thomas-aquinas-cullen-harkins/\">The Discovery of Being and Thomas Aquinas</a></i></span>, edited by Christopher Cullen and Franklin Harkins; <span><i><a href=\"https://www.springer.com/gp/book/9783030339111#aboutAuthors\">The Human Person: What Aristotle and Thomas Aquinas Offer Modern Psychology</a></i></span>, by Thomas Spalding, James Stedman, Christina Gagné, and Matthew Kostelecky</span><span>.<span></span></span></div><div><span><br></span></div><div><span>At the <i>Institute of Art and Ideas</i>: Philosopher of physics Tim Maudlin on <span><a href=\"https://iai.tv/articles/quantum-theory-and-common-sense-auid-1254\">quantum physics and common sense</a></span>.<span>  </span>Physicist Subir Sarkar and philosophers Nancy Cartwright and John Dupré <span><a href=\"https://iai.tv/video/the-end-of-all-things-what-is-reality-made-of-metaphysics\">discuss physics and materialism</a></span>.</span></div><div><span><br></span></div><div><span>Philosopher Dennis Bonnette on <span><a href=\"https://strangenotions.com/why-humans-are-more-than-mere-animals/\">the distinction between the intellect and the imagination</a></span>, at <i>Strange Notions</i>.</span></div><div><span><br></span></div><div><span>Philosopher of time <span><a href=\"https://316am.site123.me/articles/moving-spotlight-metaphysics-and-other-stuff?c=end-times-series\">Ross Cameron is interviewed</a></span> by Richard Marshall at <i>3:16</i>.</span></div><div><span><br></span></div><div><span>Duns Scotus in focus at <i><u><a href=\"https://philosophynow.org/issues/127/Duns_Scotus_1265_66-1308?utm_term=Autofeed&utm_medium=Social&cpg=ebtw&utm_source=Twitter#Echobox=1562194883\">Philosophy Now</a></u></i> and <i><u><a href=\"https://www.commonwealmagazine.org/have-you-tried-scotus\">Commonweal</a></u></i>.<span>  </span></span></div><div><span><span><br></span></span></div><div><span><a href=\"http://mentalfloss.com/article/585008/alfred-hitchcock-presents-facts\">10 facts about <i>Alfred Hitchcock Presents</i></a><span>, at <i>Mental Floss</i>.</span></span></div><div><br></div><div><span>Tim Maudlin on <span><a href=\"https://bostonreview.net/science-nature/tim-maudlin-why-world?fbclid=IwAR3m9AO4OVK9FkgSZ5sI8YQTw8ADc4QQ2UCn0Sm5PclvxqvjhJjnjMy_NPc\">Judea Pearl on causation versus correlation</a></span>, at the <i>Boston Review</i>.<span>  </span>Maudlins book <i><span>Philosophy of Physics: Quantum Theory</span></i><span> <span><a href=\"https://ndpr.nd.edu/news/philosophy-of-physics-quantum-theory/\">is reviewed</a></span> at <i>Notre Dame Philosophical Reviews</i>.</span></span></div><div><span><span><br></span></span></div><div><span>Charles Styles interviews Peter Harrison on the subject of <span><a href=\"https://fivebooks.com/best-books/history-science-and-religion-peter-harrison/\">the best books on the history of science and religion</a></span>, at <i>Five Books</i>.</span></div><div><span><br></span></div><div><span>At <i>Quillette</i>, Kevin Mims on <span><i><a href=\"https://quillette.com/2019/09/13/william-peter-blattys-counter-countercultural-parable/\">The Exorcist<span> as a film about the breakdown of the family</span></a></i></span>.</span></div><div><span><br></span></div><div><i><span>Society in Mind</span></i><span> on <span><a href=\"https://societyinmind.com/2019/08/13/beneath-the-replication-crisis/\">the replication crisis in psychology</a></span>.</span></div><div><span><br></span></div><div><span>Matias Slavov on <span><a href=\"https://aeon.co/essays/what-albert-einstein-owes-to-david-humes-notion-of-time\">Hume and Einstein on the nature of time</a></span>, at <i>Aeon</i>.</span></div><div><span><br></span></div><div><span>At <i>Catholic World Report</i>, philosopher Joseph Trabbic on <span><a href=\"https://www.catholicworldreport.com/2019/09/18/thomism-and-political-liberalism-part-2/\">Aquinas and political liberalism</a></span>.<span><span></span></span></span></div><div><span><br></span></div><div><i><span>Boston Review</span></i><span> on <span><a href=\"https://bostonreview.net/philosophy-religion/katrina-forrester-future-political-philosophy\">post-liberal academic political philosophy</a></span>.<span>  </span><i>The Chronicle of Higher Education</i>on <span><a href=\"https://www.chronicle.com/interactives/20190912-academias-holy-warriors?key=mi0Bff1vaLHL09_no2EmgyubkYGaE_Z0wYeVvMXRpBMlzD16oZl7OvOuo9-6VB1CQ1pUYTE5WnhOR1J5VUFMaG1lRk1TdExEQ1VIbkRnQXRiYkZkdzh4VER0MA\">post-liberal Catholic political philosophy</a></span>.<span>  </span></span></div><div><span><span><br></span></span></div><div><i><span><a href=\"https://www.amazon.com/Blue-World-John-Coltrane/dp/B07VQTJ24X/ref=tmm_acd_swatch_0?_encoding=UTF8&qid=1570834820&sr=8-1\">Blue World</a></span></i><span>, an album of lost John Coltrane tracks, <a href=\"https://www.theguardian.com/music/2019/sep/27/john-coltrane-blue-world-review\">has been released</a>.</span></div><div><span><br></span></div><div><span>Its a thing.<span>  </span><i>The Huffington Post</i> reports on <span><a href=\"https://www.huffpost.com/highline/article/millennial-nuns/?guce_referrer=aHR0cHM6Ly90LmNvL1JIdXVhTjlTMHU&guce_referrer_sig=AQAAAKxj_Bm_NFaQWyWT2RPd2P6rfBbWMgCJPbUxhqTn7Fdecu8HgfzTlbd86V4ExNaoyeVmJOyDI00RQGJkVgc3GmO0deVEaGXPwwHtHUmfgTD2i8_0zUWCCCvEL0XqanrNIoGWugj9sspmIZVEGtAT_e94HA6TxKExBNVohlcRDj_F&guccounter=2\">millennials who are becoming nuns</a></span>.</span></div><div><span><br></span></div><div><span>Scott Alexander on LGBT as a new civil religion, at <span><i><a href=\"https://slatestarcodex.com/2019/07/08/gay-rites-are-civil-rites/\">Slate Star Codex</a></i></span>.  C. C. Pecknold on <span><a href=\"https://catholicherald.co.uk/commentandblogs/2019/07/02/the-pride-flag-flies-everywhere-but-what-does-it-stand-for/\">the phony neutrality of post-Obergefell liberalism</a></span>, at <i>Catholic Herald</i>.</span></div>"},"visual":{"url":"http://b.vimeocdn.com/ts/452/218/452218069_1280.jpg","width":1280,"height":720,"contentType":"image/jpeg"},"unread":false,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/5ca4d61d-e55d-4999-a8d1-c3b9d8789815","label":"Macintosh"},{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/fbdcd69b-7e27-4b6a-bfed-6584b944155d","label":"🤞🏻🤞🏻🤞🏻"}],"tags":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved","label":"Saved For Later"},{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read","label":""}],"actionTimestamp":1571037184309},{"keywords":["Google","Apple Arcade"],"originId":"https://www.macrumors.com/2019/09/26/apple-arcade-vs-google-play-pass/","fingerprint":"fd93a55d","id":"SusR11hdg5ydv7o+xGl+0XlI0AhBL77Oxid8QOO3j5k=_16d6f7df794:48e16:18991ffa","author":"Juli Clover","summary":{"direction":"ltr","content":"With the launch of <a href=\"https://www.macrumors.com/roundup/ios-13/\">iOS 13</a>, <a href=\"https://www.macrumors.com/2019/09/19/apple-arcade-live-ios-13/\">Apple released Apple Arcade</a>, a new $4.99 per month gaming service that provides unlimited access to new and exclusive games.\n<br>\n<br>\nLess than two weeks later, Google <a href=\"https://www.macrumors.com/2019/09/23/google-launches-new-play-pass-service-on-android/\">announced its own gaming service</a> called Play Pass, which also offers unlimited access to games. In our latest YouTube video, we went hands-on with both services to compare them.\n<br>\n<br>\n<center><iframe allowfullscreen src=\"https://www.youtube.com/embed/klZfwC5Wh9I\" width=\"560\" height=\"315\"></iframe></center><center><em><a href=\"https://www.youtube.com/user/macrumors?sub_confirmation=1\">Subscribe to the MacRumors YouTube channel</a> for more videos.</em></center>\n<br>\nBoth <a href=\"https://www.apple.com/apple-arcade/\">Apple Arcade</a> and <a href=\"https://play.google.com/about/play-pass/\">Play Pass</a> are priced at $4.99 per month. Apple offers a one-month free trial while Google offers a 10-day free trial, but for the first year, Google is offering a deal that drops the price of Play Pass to $1.99 per month.\n<br>\n<br>\nThough the prices are similar, the two services are quite different. <a href=\"https://www.macrumors.com/guide/apple-arcade/\">Apple Arcade</a> features new and exclusive games, some of which were funded by Apple, while Google's Play Pass offers up older games.\n<br>\n<br>\nPlay Pass includes some super popular titles like Stardew Valley, Reigns, Star Wars Knights of the Old Republic, Terraria, and more, but the problem with older games is that many people may have already played them.\n<br>\n<br>\nPlay Pass is also not limited to games -- Google is including apps too. AccuWeather, Pic Stitch, ISS HD, and Tunable are some of the apps offered.\n<br>\n<br>\nApple Arcade only offers gaming titles, but all of the games are fresh, new, and exclusive to Apple Arcade. In some cases, though, some of the games are also available on consoles, but on mobile platforms, Apple Arcade gets exclusive access. That means no Android equivalent.\n<br>\n<br>\nIt's not clear if apps can leave Apple Arcade, but Google warns that apps can leave Play Pass. If that happens, users will need to buy the game to continue to use it if it's a paid game, and for free titles, ads and in-app purchases may show up.\n<br>\n<br>\nGoogle says there are hundreds of apps and games included with more being added every month. Apple Arcade launched with right around 60 games, and Apple has also promised new content on a monthly basis. Both services offer offline gaming, so no internet connection is required.\n<br>\n<br>\nWith both services, content is ad free and features no in-app purchases. Apple titles were designed from the ground up with no additional purchases, but for Play Pass, these gaming elements have been removed from titles that previously offered them.\n<br>\n<br>\nApple allows up to six family members to share games through a single Apple Arcade subscription using Family Sharing, and Google allows for up to five family members to share content through its Google Play Family Library.\n<br>\n<br>\nApple Arcade has launched in multiple countries around the world, while Play Pass is limited to the United States at the current time. Google does plan to expand, however.\n<br>\n<br>\nOne other aspect worth noting is privacy. Apple specifically mentions privacy protections and says that users are able to choose to share data, while Google's Play Pass materials don't mention privacy or data sharing. &quot;Every game must meet Apple's high privacy standards,&quot; reads Apple's <a href=\"https://www.apple.com/newsroom/2019/09/apple-arcade-invites-you-to-play-something-extraordinary/\">press release</a> for Apple Arcade.\n<br>\n<br>\nMost people are locked in to either Android or iOS and few have both, so most people won't need to choose between services.\n<br>\n<br>\nApple users who have a Mac, iPhone, <a href=\"https://www.macrumors.com/roundup/ipad/\">iPad</a>, or <a href=\"https://www.macrumors.com/roundup/apple-tv/\">Apple TV</a> can access Apple Arcade on those devices, while Google Play Pass requires a smartphone, laptop, or tablet with Android 4.4 or above and Play Store version 16.6.25. Google Play Pass games can't be played on the larger screen of a television, which gives Apple Arcade a bit of an edge when it comes to non-mobile gaming.\n<br>\n<br>\nDo you prefer Apple Arcade with its fresh selection of titles, or Google Play Pass with its larger library of already available games? Let us know in the comments.<br><br><div>Tags: <a href=\"https://www.macrumors.com/roundup/google/\">Google</a>, <a href=\"https://www.macrumors.com/roundup/apple-arcade/\">Apple Arcade</a></div><br>This article, &quot;<a href=\"https://www.macrumors.com/2019/09/26/apple-arcade-vs-google-play-pass/\">Apple Arcade vs. Google Play Pass</a>&quot; first appeared on <a href=\"https://www.macrumors.com\">MacRumors.com</a><br><br><a href=\"https://forums.macrumors.com/threads/apple-arcade-vs-google-play-pass.2201924/\">Discuss this article</a> in our forums<br><br><div>\n<a href=\"http://feeds.macrumors.com/~ff/MacRumors-Front?a=8qvKbZNFw68:13u-CPoeJ6s:yIl2AUoC8zA\"><img border=\"0\" src=\"http://feeds.feedburner.com/~ff/MacRumors-Front?d=yIl2AUoC8zA\"></a> <a href=\"http://feeds.macrumors.com/~ff/MacRumors-Front?a=8qvKbZNFw68:13u-CPoeJ6s:6W8y8wAjSf4\"><img border=\"0\" src=\"http://feeds.feedburner.com/~ff/MacRumors-Front?d=6W8y8wAjSf4\"></a> <a href=\"http://feeds.macrumors.com/~ff/MacRumors-Front?a=8qvKbZNFw68:13u-CPoeJ6s:qj6IDK7rITs\"><img border=\"0\" src=\"http://feeds.feedburner.com/~ff/MacRumors-Front?d=qj6IDK7rITs\"></a>\n</div><img width=\"1\" alt=\"\" src=\"http://feeds.feedburner.com/~r/MacRumors-Front/~4/8qvKbZNFw68\" height=\"1\">"},"alternate":[{"href":"https://www.macrumors.com/2019/09/26/apple-arcade-vs-google-play-pass/","type":"text/html"}],"crawled":1569533589396,"title":"Apple Arcade vs. Google Play Pass","published":1569531802000,"origin":{"streamId":"feed/http://www.macrumors.com/macrumors.xml","htmlUrl":"https://www.macrumors.com","title":"MacRumors: Mac News and Rumors - Front Page"},"visual":{"url":"https://cdn.vox-cdn.com/thumbor/m3ztxUEeETYXD9gGfyEjUpS0GFE=/0x0:800x533/1310x873/cdn.vox-cdn.com/uploads/chorus_image/image/59662701/800x_1.0.jpg","width":1310,"height":873,"contentType":"image/jpeg"},"unread":false,"readTime":33744,"tags":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read","label":""},{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.unsaved","label":"Unsaved"},{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved","label":"Saved For Later"}],"actionTimestamp":1569536278861}]}