watch kit pitfalls. developing ios app for dribbble
TRANSCRIPT
WatchKit Pitfalls
Developing iOS App for Dribbble
Zgonik Vova
Register your application
• Website URL
• Callback URL
• Client ID
• Client Secret
• Client Access Tokenhttps://dribbble.com/account/applications/new
OAuth2 solutions
NXOauth2Client GTMOAuth2
• Detailed error handling
• Block callbacks
• No response body on auth
error
• NSNotificationCenter
Dribbble API understanding of HTTP response codes
422 Unprocessable
Entity
400 Bad request
500 Internal server
error
403 Operation is
forbidden
• upload shot or attachment
without mimeType
• follow more than 1800 followers
• follow own userId
• incorrect parameter name
• upload limit:
- 48 shots per month
- 5 shots per day
• access denied (canUplodShot =
NO)
429Too many requests
304Content not
modified
404Not found
204No content
API restrictions:
• 60 requests per minute
• 10000 requests per day
• no like shot, like comment
transaction entry found
• no following transaction entry
«A follows B» found
• presence of transaction entry
for
user «A follows user B»
• response on delete request
for:
like comment, like shot
• if the resource has not
changed in conditional request
with parameter
If-Modified-Since
• POST incorrect JSON
Requests Rate Limiting
low-priority
• check if like shot
• check if follow user
• 60 per minute
• 10000 per day
high-priority
• account request
• switch & load category of shots
• like shot
• follow user
Apple Watch
watchOS App
WatchKit App
WatchKit app Target
Storyboard
Resources
WatchKit Extension
WatchKit extension target
WatchKit codeand Resources
WatchKit App
IOS App
iOS app target
iOS Code
WatchKit Extension
WatchKit app stores on watch device and consist of storyboard and static resources (images, fonts)
WatchKit Extension stores on iPhone and consist of
source and resources
all source executes on iPhone, without iPhone
Watch app won’t launch
NOT SURE OF WHAT IS GOING ON HERE
iPhone
Extension Communication
Glance
Notification
WKInterfaceControll
er
Apple Watch
WatchKit App
Storyboard
Resources
WatchKit Extension
Code
Resources
WatchKitWatchKit
WatchKit Launch Flow
Launch WatchKit
APP
Load initialinterface controller
Initialize UI
Display UI
Storyboard
Interface controller
init willActivate
• user launches app on watch
• watchKit finds initial controller in storyboard and notifies iPhone
• watchKit Extension should be launched and specified class of controller is instantinated
WatchKit Extension
Glance
• no interactive items: buttons, switches
• no vertical scrolling
• San Francisco system font only
• Apple doesn’t recommend use maps and
tables
Notification short look
• no interactive items: buttons, switches,
sliders
• allow different typefaces of system font
• allow change tint color with app Name
Notification long looksystem stuff
application content
action definedin watch app
two types activation mode:
background & foreground
• openParentApplication:reply:
• App Groups
• Darwin-notification
• Handoff
WatchKit Extension and App Communication
Communication• model classes, web services,
credentials
• restricted API:
! any API marked with
NS_EXTENSION_UNAVAILABLE
! calls to UIApplication
+sharedApplication
! access the camera or microphone on
an iOS device
! receive data using AirDrop
Sharing code
openParentApplicationAPI on watch App [WKInterfaceController openParentApplication:reply:]
API on main application: implement
(:handleWatchKitExtensionRequest:reply:)
• main app launches in background
• error handling available
- slower than other methods + API calls time increases
- objects should conform <NSCoding>
App Groups
• com.apple.security.application-groups entitlement
• initWithSuiteName: (NSUserDefaults)
• containerURLForSecurityApplicationGroupIdentifier: (NSFileManager)
- main app can’t notify watch about new data
Darwin-notifications
Exchange messages between processes in iOS by means of Darwin-notifications
pod ‘MMWormHole’
Sending processNotification
notifyd
routines allow processes to exchange stateless
notification events
process 1
process 2
process 3
Client processesnotification is just a signalit can't transport any data apart from
the notification identifier
Handoff
• NSUserActivity in main app’s Info.plist
• perform updateUserActivity:userInfo:webpageURL: in
WKInterfaceController
• handle activity event in AppDelegate:
- application:willContinueUserActivity
- application:continueUserActivity:restorationHandler
Shot Bucket App
ApiClient
AppDelegate
ShotsViewController
WKInterfaceControllerWatch App
Main App
Core structure
ShotsControllerData source
Networking
ShotBucketCore Framework
App ModelsOauth2Clients
Api ClientsActionManager
Gallery on WatchKit
. . . . . . . . .
Gallery on WatchKit
reloadRootControllersWithNames:contexts:
swipe
InitialInterfaceController
swipe
12:0012-0012-00
12-00
Load more
Modal controller
12-00Close
ContentContent
More pictures?
Page-based Controller Life Cycle Changes
Smart personalized notifications without backend
Background fetch
Conditional requestLast-Modified: Sat, 22 Feb 2014 17:10:33 GMT
HTTP/1.1 304 Not ModifiedHTTP/1.1 200 OK
Local notification No action
BG Fetch issues
- [UIApplication performFetchWithCompletionHandler:]
UIBackgroundFetchResult
• UIBackgroundFetchResultNewData
• UIBackgroundFetchResultNoData
• UIBackgroundFetchResultFailed
https://github.com/agilie/dribbble-ios-sdk