Tag Archives: iOS

iOS Mail.app: when text doesn’t wrap while you’re writing an email

Writing email is one of those fundamental things most of us have to do, so you’d expect doing it on your iPad or iPhone to be pretty painless.

Lately, this hasn’t been my experience at all. I’ve found that text wraps fine when I’m reading emails, but when it’s time to write one (whether by replying or starting from scratch), I’m writing into a window with a horizontal scrollbar, which makes it impossible to see all of my text (or, for that matter, the text I’m replying to) without continuously swiping left and right to see the beginning and end of each line.

It’s like Mail.app is enforcing a message width wider than the window it’s giving me to write in. Super frustrating, especially for correspondence that isn’t pithy.

It doesn’t seem to be a new phenomenon, and none of the workarounds I’ve found on forums have worked for me:

  • rotating the device
  • power cycling the device
  • disabling “Increase Quote Level”
  • removing and re-adding the account
  • using Gmail instead of IMAP (I noticed the same behaviour on both types of accounts)

The only “solution” that “works” is dropping my iPad text size to the smallest available setting. But that makes text tiny across the entire device, and I’m too old for that.

I had just about given up on Apple’s Mail app when I noticed that hitting “Send Again”–on an email I had just sent with the wrapping issue–brought up the exact same message without the wrapping issue.

It turns out my fancy HTML signature (not actually very fancy–just a table to keep things aligned) was causing the whole thing. I’ve deleted my iOS email signatures and wrapping works perfectly.

Apparently Mail on iOS doesn’t know what to do when email signatures contain HTML tables. I’ll have to figure something else out. Meanwhile, hopefully this discovery (that took me far too long to make) will help someone else.

Why Android still sucks

This is the second post in my November writing challenge series.

I’ve been an Apple convert for a few years now (I started to see the light in 2010-ish), but every 12-18 months, I grab a Google-endorsed device that can run the latest version of Android and put it through its paces.

I do this because I feel obliged to speak without ignorance on the advantages and disadvantages of the major mobile platforms. Also because playing with new tech is fun.

There’s more to it than the UI

When it comes to Android vs. iOS, the differences are much bigger than user experience. Apple’s business model is completely different to Google’s, which impacts on everything about its hardware, software and online services.

Some of the differences are less obvious than others. For example, Google’s efforts to retain and profit from its users’ data are no secret, but most people don’t realise just how much of their personal information is being passively disclosed. Apple, meanwhile, draws most of its profit from hardware sales and actively avoids the disclosure and retention of user particulars.

A more obvious difference is in the area of version fragmentation. Android hardware vendors aren’t obliged to provide timely software updates for their devices–even if they contain critical security patches–and most of them don’t. Meanwhile, iOS updates are made available, to all devices capable of running them, simultaneously. You can guess which of these ecosystems is riddled with unpatched, deprecated operating system software.

But let’s talk about the UI anyway

Assuming we’ve made peace with Android’s underlying constraints, the next question to ask is: how does its user experience stack up?

To find out, I tested Android “Lollipop” (5.1.1) on a Nexus 7 (2013 version). I tried to use it productively for about a week, in place of an equivalent iPad.

I accept that without migrating all of my data to Google’s cloud services, my experience of the platform wasn’t completely immersive, but hopefully you’ll agree that it was immersive enough to make a few meaningful observations.

1. Reading and typing

iOS always set a high bar when it came to the display, entry and editing of text, but with Lollipop, Android has caught up pretty comprehensively. Its new font (Roboto) is crisp and appealing; the default keyboard has an improved layout and responds without the lag of earlier versions; and working with text selections is much less frustrating than it used to be.

It’s not just the keyboard that’s more responsive. Animations are vastly smoother, and scrolling is finally on par with iOS. I can’t overstate the importance of these these improvements–they significantly increase user enjoyment and confidence.

2. App updates

Android’s built-in apps receive updates via Google’s Play Store. This allows core apps to be updated without the overhead of a full operating system update (great!), but it also makes for a volatile experience when the Play Store app itself needs updating (not so great!). After factory resetting my Nexus 7, I had the Play Store app crash, then declare it wasn’t installed, before eventually starting to work again. Unfriendly much?

The Play Store also had trouble resolving dependencies between core apps while they were being upgraded. A bunch of “You must upgrade X before you can upgrade Y” notifications were thrown at me after I hit “Update All”. This sort of thing shouldn’t happen ever, much less immediately after a factory reset (i.e. with no third-party apps in play).

3. Settings, settings, settings

The design of Android’s “Settings” app has improved significantly since previous versions, but I still found it relatively cluttered, with too many superfluous “advanced” options offered too prominently. Your mileage may vary.

Enterprise users will be annoyed to find that proxy auto-discovery remains unavailable in Lollilop. Manually entering a PAC file URL is still necessary. Apple has been all over this for years now. C’mon, Google!

Also, disabling those annoying keyboard tap sounds is not a simple task, because settings for “Sounds” aren’t all in one place. (I eventually found the toggle I was looking for–deep in “Keyboard” settings. Argh.)

Finally: IMAP users still can’t configure the stock email app to use custom mailboxes for Sent messages and Trash. Their names are hard-coded into the app.

4. Notifications

I liked that I could turn off all notifications for a set period of time (unlike “Do Not Disturb” mode on iOS, which needs to be manually switched off). I didn’t like that I could allow “priority” interruptions during this notification blackout–simply because it’s not clear what a “priority” interruption is (“Did I configure this? Do I trust my former self to have configured it properly? Is my presentation going to be interrupted by a Facebook message?”) I also didn’t like that the UI for this feature only appeared when I used the volume rocker. It belongs on the main notification panel.

My verdict

Android as an operating system isn’t bad. Like iOS, it has annoying shortcomings in some areas, but overall, it’s fast, beautiful and easy to use. When it’s not, pop-up tips pick up the slack.

So why do I think it “still sucks”?

It’s the apps.

Or, to be more specific, it’s the tablet apps.

Android has been tablet-friendly for years now, but a large of number of app developers (including Facebook) stubbornly refuse to build tablet versions of their apps. With a few exceptions, most of the apps I tried on the Nexus 7 opened as stretched or magnified phone apps. I could access all of my content, but the apps were so useless I couldn’t do anything with it.

The iOS App Store, meanwhile, is full of high-quality tablet apps.

Also, iOS plays nice with IMAP.

Also, Apple doesn’t hunger and thirst for my metadata.

OS X Server doesn’t cache iOS 8

Based on my testing this morning, although the caching service on OS X Mavericks Server is supposed to cache iOS updates, and although it does a perfectly good job caching App Store content, it does NOT cache iOS 8 itself.

For those of us who manage large iPad deployments (and would prefer iOS 8 to be installed by end-users), this is a problem. Potentially a multiple-terabytes-through-a-finite-pipe problem.

Thankfully the Squid hack I figured out during the iOS 7 launch works with iOS 8 too. Otherwise we’d be in trouble.

Caching iOS updates on a Squid proxy server

Update (22 December 2014): The following instructions have been updated and tested with iOS 8.

Right now, my challenge is upgrading almost 200 iPads to iOS 7 with minimal pain (read: zero device handling). Factor in less-than-ideal Internet bandwidth and Apple’s disinterest in allowing proxies to cache iOS updates, and it’s been a bit of a headache.

First, a word of advice: ask your users not to upgrade when prompted. Do this before Apple release a major update, to buy yourself some time to test it on your network and to check that the update is being cached properly.

Hopefully your iPad fleet is already using your Squid proxy. Ours is configured (via Apple’s Profile Manager) to use a PAC file when it’s on our WiFi network. The PAC file directs all but onsite requests to Squid.

Unfortunately, iOS doesn’t use the proxy for everything; system update authorizations, in particular, don’t get out unless permitted on your firewall. Here’s the relevant rule on our iptables firewall (no_proxy_ok is one of our custom chains, as is tcp_allowed):

-A no_proxy_ok -p tcp -m comment -m tcp -m multiport -d -j tcp_allowed --dports 80,443,5223,2195,2196 --comment "allow Apple services (e.g. APNs, updates)"

Mercifully, the update itself is requested via the proxy, but getting it to cache is non-trivial. Obviously max_object_size needs to be big enough to accommodate a 1GB+ file. I went with 2GB:

maximum_object_size 2048000000 bytes

But this wasn’t enough to get the update to cache. A bit of sleuthing led to the first problem: Apple adds HTTP headers like these to its updates, so Squid discards them:

Cache-Control: max-age=0, no-cache, no-store
Pragma: no-cache

The workaround is to break HTTP a little by adding this line above any other refresh_pattern entries in your squid.conf:

refresh_pattern -i appldnld\.apple\.com 129600 100% 129600 ignore-reload ignore-no-store override-expire override-lastmod ignore-must-revalidate

refresh_pattern -i phobos\.apple\.com 129600 100% 129600 ignore-reload ignore-no-store override-expire override-lastmod ignore-must-revalidate

This forces Squid to treat objects from *.appldnld.apple.com and *.phobos.apple.com as “fresh” (i.e. cacheable) for 90 days (129600 minutes), no matter what appldnld.apple.com and phobos.apple.com say.

Finally, I made sure appldnld.apple.com requests were excluded from Squid’s delay pools and filtering ACLs; you may need to make similar tweaks. I also found that maximum_object_size wasn’t being applied correctly to cache_dir, so I defined it explicitly, i.e.:

cache_dir aufs /var/spool/squid3 256000 128 256 max-size=2048000000

iOS 7 is rolling out smoothly as I type.

Daring Fireball on “Innovation through simplicity”

Daring Fireball on “Innovation through simplicity”

One of the more common critiques I hear of iOS is that its home screen is boring / featureless / widgetless / uncustomisable.

Now, don’t get me wrong, I’d love to see customisable widgets in the notifications pull-down of iOS. But the simplicity and consistency of its home screen is a win, in my opinion.

Daring Fireball agrees:

The utter simplicity of the iOS home screen is Apple’s innovation. It’s the simplest, most obvious “system” ever designed. It is a false and foolish but widespread misconception that “innovation” goes only in the direction of additional complexity.

Unreal 3D rendering on iOS and Android: Epic Citadel

I’m not a gamer. At all.

If I’m staring at a screen for fun, it’s to read, write, socialise or code.

But I’m truly impressed with the real-time 3D rendering this free showcase app demonstrates:

Epic Citadel for iOS
Epic Citadel for Android (Google Play)

Check out the falling leaves, flowing water and dynamic sun flare!

Here’s the kicker: the framerate on Mr 3’s first-gen iPad is perfectly acceptable. Of course the iPad 4, iPad Mini and Nexus 7 smoke it, but still. Unreal Engine 3 is amazing.

Why “Open In” doesn’t solve the brokenness of iOS silos

Why “Open In” doesn’t solve the brokenness of iOS silos

From Federico Viticci, on MacStories:

You just used five apps and created four copies of a file (two of them are iOS Camera Roll + Photo Stream) to annotate a photo. Lather, rinse, repeat for note taking, PDF reading, electronic bill management, and assembling that nice slideshow of your vacation in Italy.

Yes, I love a lot of things about Apple, but it’s not a blind love.

File sharing between apps on iOS still needs a LOT of work. Meanwhile, it’s incredibly annoying, benefits notwithstanding.

Another killer iPhone app: Momento

Another killer iPhone app: Momento

I haven’t kept a journal in years, but lately I’ve been considering the potential value in keeping track of thoughts and events too personal to share with the world. (I know, it’s hard to believe, but I’ve come to accept that TMI is an Actual Thing.)

Enter Momento: the perfect companion for private journaling. It’s beautiful, intuitive, and has important features like plain-text export and local (i.e. private) backup.