{"id":20892,"date":"2018-03-15T13:42:27","date_gmt":"2018-03-15T17:42:27","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=20892"},"modified":"2018-03-30T15:47:40","modified_gmt":"2018-03-30T19:47:40","slug":"overcast-4-1-and-smart-resume","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2018\/03\/15\/overcast-4-1-and-smart-resume\/","title":{"rendered":"Overcast 4.1 and Smart Resume"},"content":{"rendered":"<p><a href=\"https:\/\/marco.org\/2018\/03\/13\/overcast41\">Marco Arment<\/a> (<a href=\"https:\/\/twitter.com\/OvercastFM\/status\/973721641405571073\">tweet<\/a>):<\/p>\n<blockquote cite=\"https:\/\/marco.org\/2018\/03\/13\/overcast41\">\n<p>Smart Resume is actually two features:<\/p>\n<ol>\n<li>It jumps back by up to a few seconds after having been paused to help remind you of the conversation.<\/li>\n<li>It slightly adjusts resumes and seeks to fall in the silences between spoken words when reasonably possible.<\/li>\n<\/ol>\n<p>[&#8230;]<\/p>\n<p>I was using an <code>NSNumberFormatter<\/code> to read the total [time saved] value from Overcast&rsquo;s server as a <code>double<\/code>. My server always sends values with U.S.-style number formatting, using a period as the decimal separator (e.g. &ldquo;1234.5&rdquo;). But by default, <code>NSNumberFormatter<\/code> uses the device&rsquo;s locale, so in countries that use a comma as the decimal separator (e.g. &ldquo;1234,5&rdquo;), it was interpreting the server&rsquo;s numbers with periods as invalid and returning zero. So the Settings screen thought they hadn&rsquo;t saved any time, and hid the time-saved label.<\/p>\n<p>Fortunately, it was an easy fix: setting that <code>NSNumberFormatter<\/code> locale to <code>en_US<\/code> to match what the server was sending.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/marcoarment\/status\/973769169538830336\">Macro Arment<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/marcoarment\/status\/973769169538830336\">\n<p>My first instincts were all surface-level UI issues: string localization, nil strings, and UILabel sizeToFit problems.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/rjonesy\/status\/974291126097268736\">Ryan Jones<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/rjonesy\/status\/974291126097268736\">\n<p>Overcast&rsquo;s new Smart Resume feature has allowed me to turn voice turn-by-turn directions back on in Google Maps. Driving is easier (and safer &#x2013; I don&rsquo;t look down for next turn). I swear I&rsquo;m not just saying this either. Honest truth.<\/p>\n<p>Very small wins make products.<\/p>\n<\/blockquote>\n\n<p>It&rsquo;s amazing how much better Overcast&mdash;from a solo developer&mdash;<em>still<\/em> is than Apple&rsquo;s Podcasts app. If anything, its lead seems to be increasing.<\/p>\n\n<p><a href=\"https:\/\/twitter.com\/marcoarment\/status\/974269877031759873\">Marco Arment<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/marcoarment\/status\/974269877031759873\">\n<p>Thanks for all of the Smart Resume praise and press coverage!<\/p>\n<p>To be clear, skipping back a bit after being paused isn&rsquo;t a new idea. I think Instacast was first to it, years ago.<\/p>\n<p>I think adjusting those (and other) seeks to fall on silences is new, though.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/jachee\/status\/913806859714404352\">Jake Ach&eacute;e<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/jachee\/status\/913806859714404352\">\n<p>Overcast feature idea: <\/p>\n<p>SmartStop. When enabled, wait for a silence that would normally be SmartSpeed optimized THEN stop.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/twitter.com\/OvercastFM\/status\/974284697319636992\">Marco Arment<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/OvercastFM\/status\/974284697319636992\">\n<p>I actually tried this during the beta, but it&rsquo;s much more complex to implement than seek adjustments, and I couldn&rsquo;t get it stable enough to ship in time.<\/p>\n<\/blockquote>\n\n<p>Update (2018-03-30): <a href=\"https:\/\/twitter.com\/marcoarment\/status\/979487393010143232\">Marco Arment<\/a>:<\/p>\n<blockquote cite=\"https:\/\/twitter.com\/marcoarment\/status\/979487393010143232\">\n<p>If there&rsquo;s any doubt why I file trademarks&#8230;<\/p>\n<p>(Didn&rsquo;t for Smart Resume, unfortunately.)<\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Marco Arment (tweet): Smart Resume is actually two features: It jumps back by up to a few seconds after having been paused to help remind you of the conversation. It slightly adjusts resumes and seeks to fall in the silences between spoken words when reasonably possible. [&#8230;] I was using an NSNumberFormatter to read 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":"","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":[648,95,131,31,1472,26,309,568,647,112,1365],"class_list":["post-20892","post","type-post","status-publish","format-standard","hentry","tag-apple-podcasts","tag-audio","tag-bug","tag-ios","tag-ios-11","tag-iosapp","tag-localization","tag-nsdateformatter","tag-overcast","tag-podcasts","tag-trademark"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/20892","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=20892"}],"version-history":[{"count":2,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/20892\/revisions"}],"predecessor-version":[{"id":21002,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/20892\/revisions\/21002"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=20892"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=20892"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=20892"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}