Archive for May, 2015

iOS App Store analytics now open to all devs

Apple’s new beta analytics program is no longer invite-only.

Now available to all developers, App Analytics gives you detailed insight into your app’s performance. There’s no need for additional code or app updates, and it’s available at no extra cost.



With App Analytics, you’ll be able to:

  • See how many customers visit your app’s page on the App Store
  • Learn how often your users open your app over time
  • Create custom campaign links and watch the success of your marketing campaigns
  • Find out which websites refer the most users

Still iOS only. Apps only (no iBooks).

Swift: Enumerating Collections

the-kids-dont-stand-a-chance-1418954-m

I don’t particularly like how Swift prints collections by default. Back in ObjC-World, NSLog does a better job rendering complex collections than println. It’s not that the println results are awful, especially for small collections, but when you’re working with real (read “nontrivial”) data Swift doesn’t really pull its weight.

Read On…

Xcode 6.4 Beta 3

A few quick observations after a not particularly long test period:

  • The weird error in the results sidebar when using SpriteKit seems to have gone away.
  • Code you drop into Sources seems to be visible without having to quit Xcode, restart it, and re-load playgrounds. This is a huge improvement.
  • QuickLooked Bezier paths are still upside down in iOS playgrounds. 🙁
  • Still plenty of DVTAssertion issues begging for bug reports in the OS X console.
  • A nasty little bug when rendering custom classes in arrays to strings no longer happens. Radar be closed!
  • Rendering documentation no longer kills value history panes when you go back and forth between the two (at least in my minimal tests), which is great because re-setting all of those up was annoying. \o/ to the playgrounds team.
  • Rendering views on the iOS simulator still causes epilepsy and migraines.

 

Swift: () -> () vs () -> Void

For those of you who have been following along, the tl;dr answer is:

() -> Void

Everyone else: The Swift Programming Language ebook refers exclusively to () -> (). APIs all use () -> Void.

I much prefer the Void typealias because it better matches return conventions in the Objective-C world.

And now, word of Apple at devforums: “FWIW, we’ve recently decided to standardize on () -> Void (generally, () for parameters and Void for return types) across all of our documentation.”

Review wait times

Here’s my shot in the dark: f(p) = 7 + 3 * tan(1 – p). At 99%, reviews are processed in 5 business days or 7 real world days. At 0%, reviews never finish.

0.99 7.030001
0.9 7.301004016
0.8 7.608130107
0.7 7.928008749
0.6 8.268379656
0.5 8.63890747
0.4 9.052410425
0.3 9.526865141
0.2 10.08891567
0.1 10.78047465

Current waits at AppReviewTimes are 6 days and 9 days, with Apple reporting

Screen Shot 2015-05-11 at 5.04.47 PM

Just submitted a new OS X utility today. Fingers crossed that it gets reviewed with reasonable speed.

 

Thoughts on Self-Publishing my Swift Playgrounds Book (and a Price Drop)

ITCSwift Slowly3

Pricing stuff on iBooks isn’t easy. iBooks doesn’t get nearly the volume or traffic that Amazon does. The Amazon marketplace uses some reasonably easy to follow unofficial pricing rules for self publishing: the magic point is $2.99 because you can earn 70% instead of 35%. Length, quality, name recognition, etc. help bring you up to a max of $9.99.

(Also, the bigger your book, the more you’re hit with media delivery charges on Amazon. This doesn’t affect iBooks at all.)

Read On…

Swift: Class properties

Just throwing this out there.

class MyClass {
    // "class stored properties not yet supported in classes; did you mean 'static'?"
    // class var classProperty = "classProperty" // does not work
    class func classFunction() {println("classFunction")} // works
}

MyClass.classFunction() // works

class MyClass2 {
    static var staticProperty = "staticProperty"
    class func classFunction() {println("classFunction")} // works
    static func staticFunction() {println("staticFunction")}
}

MyClass2.staticProperty // works
MyClass2.classFunction() // works
MyClass2.staticFunction() // works

Swift: Fetching methods for a Cocoa class

Just because.

func ClassMethods(c : AnyClass) -> [String] {
    var num : UInt32 = 0
    var results = [String]()
    let methods = class_copyMethodList(c, &num) // Thanks Jordan Rose
    for index in 0..<numericCast(num) {
        let method : Method = methods[index]
        let selector : Selector = method_getName(method)
        results += [String(_sel:selector)]
    }
    return results
}
import XCPlayground
println(ClassMethods(NSClassFromString("DVTPlaygroundCommunicationSender")))

Redesigning IB Auto Layout: A wee rant

 

InterfaceBuilder

Yo, I’ll tell you what I want, what I really really want, So tell me what you want, what you really really want, I’ll tell you what I want, what I really really want, So tell me what you want, what you really really want, I wanna, I wanna, I wanna, I wanna, I wanna really really really wanna zigazig ha.” – Spice Girls

While I applaud IB’s efforts at Auto Layout, many areas remain that deserve improvement. Here’s an unfocused rant about some of those deficits.

While IB’s latest incarnations enable you to build nearly any constraint you need, its support for organizing, annotating, and sharing  constraint decisions with others (and “future you”) approach zero.

Read On…