由 AsiaYo 主辦的 UI/UX 分享會,請到紐約資深UI設計師 江孟芝 與大家分享她曾參與合作的《英雄聯盟》遊戲互動設計,及UI Principle的趨勢與發展。
在之前的「好有格」剛好聽過江孟芝的專訪,沒想到這麼快就可以見到本人。對孟芝的印象就是留學紐約,之後在美國發展,得到專業人士綠卡,是個高手。
這次分享主題是「10個設計準則」以及分享之前一些專案的經驗。接下來歸納10個準則:
- 「Icon」利用適當的設計,讓 Icon 自己說話,是文字以外的語言
- 「Hamburg」將其他物件,收在一個按鈕。類似 Menu 按鈕
- 「Rich animation」 避免使用者立刻跳走,比較不無聊,使用時機包括:loading, menu, hovering
- 「Flat design」平面化設計,用色彩讓畫面也是擁有立體、層次感,但是遊戲除外
- 「Responses design」網頁排版能適應各尺寸螢幕
- 「Rich image and video」網頁素材盡量運用照片與影片,可以讓使用者黏著度增加。並且素材要自己攝影拍照,不用現成。
- 「Vibrant color scheme」背景用色大膽豐富,但是字色單調,參考 Awward
- 「Design with real data」跟實際數據結合,例如跑步的路徑
- 「Broken grid layout」 打破框架的設計,讓一些按鈕、文字介於區塊與區塊之間,展現活潑,也讓使用者可以注意。這種設計也可以創造層次感,類似以前雜誌風格。最常見的範例是 google 的加入按鈕。
- 「Looking for future: VR」最後孟芝提出 VR 在未來網頁呈現上,很酷炫...
想要製作設計一個,藉由設定好區域位置,當離開或是進入時,可以跳出訊息,來提示使用者切換警戒狀態。
例如:當離開家的時候,提醒開啟無人在家模式。或是回到家後,降低警戒層級,減少因為正常活動而觸發的警告。
在早期的 ios 即可使用 CLLocationManager 的電子柵欄做設計,當觸發事件時,再使用 Local Notification 提醒使用者。
這次 ios10 直接新增的一個新的 Trigger 型態「UNLocationNotificationTrigger」,讓你兩個願望一次滿足。
下面是 Apple Develope 的範例:
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(37.335400, -122.009201);
CLCircularRegion* region = [[CLCircularRegion alloc] initWithCenter:center
radius:2000.0 identifier:@"Headquarters"];
region.notifyOnEntry = YES;
region.notifyOnExit = NO;
UNLocationNotificationTrigger* trigger = [UNLocationNotificationTrigger
triggerWithRegion:region repeats:NO];
再加入文字訊息,搭配上 [addNotificationRequest: withCompletionHandler:] 放入 UNUserNotificationCenter。
xcode 可以利用 GPX 檔案讓程式模擬位置。我使用 New File,選擇 GPX 類型,儲存在個好地方後,就可以在 xcode breakpoint 的那欄,使用 GPS。
遇到問題:
- 設定在同一個地點有 notifyOnEntry 與 notifyOnExit,當模擬位置到達時,卻同時彈出「進入」與「離開」
參考文件
https://developer.apple.com/reference/usernotifications/unlocationnotificationtrigger?language=objc
在關閉一點通以前,多寫幾行字悼念他一下。
剛開始使用 macbook 時,因為內建的注音不是很好用(不好用的點已經忘記...)
當時有朋友推薦了「奇摩注音」,的確很方便,按caps lock
可以快速切換中英打,或是在中打的時候,利用shift
可以打出英文字。標點符號也是顯示全型的,很喜歡,從此就一直使用下去了。
但是...But...每每按到那個什麼一點通,他就是會有個彈出視窗卡在哪,只能 esc 離開,才能繼續打字,始終不知道那到底要幹嘛。
最近因為使用了 Markdown 的語法,要使用 code block 時就會使用到「`」,突然感覺 WTF 一點通!!
Anyway, 我們來把它關掉吧! 喔,別期待在「設定」有什麼勾勾可以關掉他...
我使用 cmd 的方式開啟 vim ~/Library/Preferences/com.yahoo.KeyKey.OneKey.plist
會看到以下的片段
<dict>
<key>ShortcutKey</key>
<string>`</string>
</dict>
將他的設定值換掉,使用了「換行」
<dict>
<key>ShortcutKey</key>
<string>
</string>
</dict>
存檔離開!
我打這篇文章的時候,再也不用擔心按到「`」不會出現了!
BTW,在搜尋這個問題時,看到2008年就有人反應想要關掉,但是設定無法關掉,到現在都2016年,川普都可以當總統了,奇摩還是不願意加這個功能! 莫非是跳出一次「一點通」他們會賺一塊錢?
雖然 Widget 並不是 iOS10 的新功能,但是因為 iOS10 的 UserNotifiction 的研究所以也想要來試著應用 Widget 看看。
App Extension 在 Today 中稱為 Widgets,用來讓使用者立即取得一些資訊。例如:股市價格、天氣狀況、今日行程。使用者會導向頻繁的開啟 Today,並且預期可以看到他們感興趣的資訊。
加入 Widget 的方式一樣也是透過新增 Target(iOS > Application Extension > Today Extension)的方式
並且要先去 developer center 加入一個 App Group,可以讓 Widget 與原本的 APP 做溝通。
- App extension:就是我們的 Widget
- Containing app:是原本開發的 app
- Host app:是呼叫 extension 的 app,舉例來說,如果是一個照片修改的功能 extension,那 host app 可能就是 camera roll。以我們現在的 Widget 討論,那 host app 就是 Today 頁面。
- Shared resource:我們設定了 App Group 讓 extension 可以存取原本 app 的資源空間。
Design
Apple 對於設計方面,提供許多的「建議」,希望你不要因為錯誤的設計,而流失使用者!
- Widget 應該保持輕巧迅速
- Widget 應該功能單一
- Widget 應該不打擾使用者的情況下完成功能
- Widget 不要阻塞了 host app
Programming
1. Widget is a ViewController
Widget 其實也是為 ViewController,可以用 App 開發的觀念來進行處理。
2. Layout
在排版的設計方面,寬度是固定的,我們可以針對高度的調整做設計。
可以使用 Autolayout 或是 preferredContentSize。
還有針對邊界的操作,可以使用 NCWidgetProviding 中的 theWidgetMarginInsetsForProposedMarginInsets:
3. interaction
Extension 與 containing APP 的 interaction
- 自定的 framework 共享程式碼
- 利用 App Group,使用 NSUserDefaults、NSFileCoordinator、NSFilePresenter,甚至是 CoreData 和 SQLite 來共享數據
- 自定的 url scheme 來開啟 containing app 與向 app 反饋數據。
4. Some Tips
- 在 containing app 中加入一個 applicationWillResignActive 的事件監聽,並在觸發時儲存需要的資料在 UserDefault
- 利用設定 preferredContentSize 來調整 widget 的尺寸
- 利用 NSExtensionContext 來與 host app 做溝通。最後需要在 containing app 的 target 裡設置適合的 URL Scheme。
// 在 Widget 中, @objc private func buttonPressed(sender: AnyObject!) { extensionContext.openURL(NSURL(string: "simpleTimer://finished"), completionHandler: nil) } // 然後在 AppDelegate.swift 中,處理打開事件,並檢測計時是否完成,然後做出對應: func application(application: UIApplication!, openURL url: NSURL!, sourceApplication: String!, annotation: AnyObject!) -> Bool { if url.scheme == "simpleTimer" { if url.host == "finished" { NSNotificationCenter.defaultCenter() .postNotificationName(taskDidFinishedInWidgetNotification, object: nil) } return true } return false }
-
在 Widget 沒有被出現的時間,系統會定期呼叫,可以進行一些 API 的詢問,來更新widget。
// 設定 delegate NCWidgetProviding @interface TodayViewController () <NCWidgetProviding> // some var @end func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) { // Perform any setup necessary in order to update the view. // If an error is encoutered, use NCUpdateResult.Failed // If there is no update required, use NCUpdateResult.NoData // If there is an update, use NCUpdateResult.NewData completionHandler(NCUpdateResult.NewData) }
相關文章
Apple Dev
human-interface-guidelines
iOS 10
http://www.jianshu.com/p/11a68ae3ef7e
http://cdnnn.07net01.com/2016/09/1674260.html
iOS 8
http://www.takobear.tw/2014/06/28/ios-8-sdk-extension-item/
https://blog.hsin.tw/2015/ios-dev-notification-center-widget-app-today-extension-widget/
iOS 10 讓我更接近了 Android
因為工作需求,摸索了一下 iOS 10 Notification 相關的一些變化,與實作功能的研究,也閱讀了許多網路分享的資料,將心得記錄在此。
由於之前都沒有實際開發過 Notification 相關的功能,所以直接學習 iOS 10 新支援的 framework,有些功能在 iOS8 就有支援,但是採用的 App 似乎不多,因此感覺都很新奇。
除了新功能之外,也有許多的改變勢將過往的功能整合起來,不會像以前一樣零散,至少我覺得學習起來蠻容易上手的。
Apple Developer Doc
Local and Remote Notification Programming Guide
活久见的重构 - iOS 10 UserNotifications 框架解析
被移除的元件
- UILocalNotification
- UIUserNotificationSettings
- UIUserNotificationCategory(UIMutableUserNotificationCategory)
- UIUserNotificationAction(UIMutableUserNotificationAction)
- handleActionWithIdentifier:forLocalNotification:
- handleActionWithIdentifier:forRemoteNotification:
- didReceiveLocalNotification:withCompletion:
- didReceiveRemoteNotification:withCompletion:
初始設定
- 加入 UserNotifications.framework
- 使用
@import UserNotifications;
向使用者申請權限
// Swift
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
granted, error in
if granted {
// 用户允许进行通知
}
}
// Objective-C
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge)
completionHandler:^(BOOL granted, NSError * _Nullable error) {
// Enable or disable features based on authorization.
// granted = YES,取得權限
}];
向 APNS 要求 token
利用 registerForRemoteNotifications 索取,並且在 didRegisterForRemoteNotificationsWithDeviceToken: 得到 deviceToken。 (這一步與iOS9以前一樣)
// Swift
UIApplication.shared.registerForRemoteNotifications()
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenString = deviceToken.hexString
print("Get Push token: \(tokenString)")
}
// Objective-C
[[UIApplication sharedApplication] registerForRemoteNotifications];
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
Notification 權限檢查
為了避免重要的服務,一定要開啟 Notification,我們也可以檢查看看當前的設定是否正確。
// Swift
UNUserNotificationCenter.current().getNotificationSettings {
settings in
print(settings.authorizationStatus) // .authorized | .denied | .notDetermined
print(settings.badgeSetting) // .enabled | .disabled | .notSupported
// etc...
}
// Objective-C
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
//settings.authorizationStatus == UNAuthorizationStatusAuthorized)
}];
Notification Request 基本概念
UNNotificationRequest 包含
- identifier(標記此request,未來可用於更新、刪除)
- content,
- trigger(本地端:TimeInterval、Calendar、Location,遠端只能馬上顯示)
然後利用 UNUserNotificationCenter 發送 UNNotificationRequest
APNS 的格式
{
"aps":{
"alert":{
"title":"I am title",
"title-loc-key":"XXXXX", // 搭配多國語言檔使用
"title-loc-args":"XXXXX", // 可以成為 title-loc-key 的 %@ 變數值
"subtitle":"I am subtitle",
"body":"I am body",
"loc-key" : "GAME_PLAY_REQUEST_FORMAT", // 搭配多國語言檔使用
"loc-args" : [ "Jenna", "Frank"] // 可以成為 loc-key 的 %@ 變數值
},
"category":"saySomething", // 對應一個 category 的 identify (按鈕與自定UI需要)
"sound":"default",
"badge":1,
"mutable-content":1 // for Service Extension
}
"file1" : "https://xxxx" // 可以作為顯示 Attachment 的路徑
}
取消和更新
利用 identifier(遠端 apns-collapse-id)來針對發送過的訊息進行處理
// 本地端
// 針對已傳送
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [identifier])
// 針對等待中
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [identifier])
目前因為公司的 Server 使用 Amazon SNS,而 apns-collapse-id 是在 header,可能需要 Amazon 支援。
對訊息做出對應的動作的 delegate
// Swift
UNUserNotificationCenterDelegate
userNotificationCenter(_:didReceive:withCompletionHandler:)
userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
因為涉及打開APP的反應,所以必須在 applicationDidFinishLaunching: 之前就要設定好 delegate。
// 設定 delegate 範例
class AppDelegate: UIResponder, UIApplicationDelegate {
let notificationHandler = NotificationHandler()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UNUserNotificationCenter.current().delegate = notificationHandler
return true
}
}
利用 response: UNNotificationResponse 可以接收由訊息來的一些資料。
// 發送時
let content = UNMutableNotificationContent()
content.title = "Time Interval Notification"
content.body = "My first notification"
content.userInfo = ["name": "onevcat"]
// 接收時
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if let name = response.notification.request.content.userInfo["name"] as? String {
print("I know it's you! \(name)")
}
completionHandler()
}
Actionable Notification 訊息按鈕
針對有自定按鈕的訊息,需利用 Categories 來做設計。
Local的使用 CategoryIdentifier 來指定,Remote的使用 category 來指定。
透過建立Notification Category來自定一個 Action:
// Swift
UNNotificationCategory(
identifier:"saySomethingCategory", // 標示
actions: [inputAction, goodbyeAction, cancelAction], // 動作設定,此為一個Text Input Action
intentIdentifiers: [],
options: [.customDismissAction]
)
UNUserNotificationCenter.current().setNotificationCategories([傳入UNNotificationCategory變數]);
// Objective-C
UNNotificationCategory* categoryDEMO = [UNNotificationCategory categoryWithIdentifier:@"SomeID" actions:@[Action1, Action2] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
[center setNotificationCategories:@[categoryDEMO,categoryDEMO2]];
使用者點選後,觸發 userNotificationCenter:didReceiveNotificationResponse:
// Swift
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
//response.notification.request.content 可以得到 content
// content.title
// content.userInfo
//response.actionIdentifier 可以得到 被選擇的Action的identifier
}
// Objective-C
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void(^)())completionHandler {
NSString* actionIdentifier = response.actionIdentifier;
DLog(@"Tapped in notification by %@", actionIdentifier);
// Must be called when finished
completionHandler();
}
Notification Extension
Notification extension 有兩種:
Service Extension:前者可以在收到 Remote Push 時,可以先做處理(30s)
Content Extension:可以用来自定通知的樣式
Service Extension
當我們想要對遠端訊息做一些操作,例如:加入 attachments、加解密,我們必須先對訊息進行計算的時候,我們可以使用 Service Extension來達到目的。
訊息必須符合:
- 需要顯示 alert 的遠端訊息
- aps 訊息中包含 mutable-content : 1
利用新增內建的樣板設計步驟如下:
- 新增 Target 並使用 Notification Service Extension當做樣板。(當初在這卡很久!)
- 即可發現xcode新增好一個資料夾與程式檔案
- 新增的Template已經幫你寫好,將title多加一個 [modified]
- 在將 push message 加入
"mutable-content" : "1"
- 原則上就會看到接收到的訊息被改變了!
- Push Message 中在 apns:{} 外的值,可以在程式中使用
[xxx.userInfo objectForKey:@"image"]
取得 Push 過來的值。
必須要實作的 delegate
didReceiveNotificationRequest:withContentHandler: // 訊息進入後的觸發點
serviceExtensionTimeWillExpire // 如果在didReceive的執行時間到達限制時,則會啟動這個函式,讓你在顯示訊息前做最後修改。
Info.plist file 會自動建立,基本上不需要多做修改即可使用。以下有兩個比較關鍵的值:
NSExtensionPointIdentifier key to com.apple.usernotifications.service
NSExtensionPrincipalClass key to the name of your UNNotificationServiceExtension subclass
PS. 遇到的問題:
- 原本是用 iPhone5 做開發,雖然有出現
[modified]
,但是隨後的修改都沒有效果。 後來改用 iPhone6 來開發,就可以成功了。 - 下載的連結檔案需要符合 https
Content Extension
利用 Xcode 的模板建立 UNNotificationContentExtension 的 UIViewController 子類別。
一樣也是利用類似 Service Extension 的建立方式,加入新的 Target。
範例會自動建立兩個method:
- (void)viewDidLoad;
- (void)didReceiveNotification:(UNNotification *)notification;
一樣的也有 Info.plist 但是相較於 Service Extension,Content Extension可以做的變化比較多,有三項如下:
UNNotificationExtensionCategory // 設定 Category 名稱,需要與 aps 中的設定一樣
UNNotificationExtensionInitialContentSizeRatio // 系統在載入時等待畫面,預設的長寬比例
UNNotificationExtensionDefaultContentHidden // 當顯示出 Content UI時,是否要隱藏原本的"title, body"
PS. 如何在 extension 部分做 debug?
在 Run 時,選擇你要跑的 extension,xcode會詢問你要 choose An app,然後再選你的 app,即可有 log 與 breakpoint。
(雖然記得剛開始使用過這樣的作法,但是不成功,可是後來查到這個作法後,的確可行!)
PS. 在 extension 使用 App 現有的圖片資源
可能是因為 Extension Bundle 與 main Bundle 的不同,所以需要設定 Copy Bundle Resource。
可以新增一個 Asset Catagory,加入需要的圖片再加入 Bundle Resource
UNNotificationAttachment
讓訊息可以夾帶 聲音檔(Audio 5MB)、圖片(Image 10MB)、影片(Movie 50MB),但是限制使用手機中的檔案。
本地端使用時只要 UNMutableNotificationContent 中的 attachments 設定好物件 UNNotificationAttachment 即可。
遠端的通知訊息則需要靠 UNNotificationServiceExtension 來做下載動作,再放入 attachments。
NOTE:
- extension bundle 與 main bundle是不同的!
- UNNotificationAttachmentOptionsThumbnailClippingRectKey 設定的預覽圖 UNNotificationAttachmentOptionsThumbnailTimeKey 設定 gif 或是影片的預覽圖
- attachments 為一個陣列,但是只會顯示第一個。 在要客製訊息UI時,則可以顯示多個attachment
- 在建立 UNNotificationAttachment 時,如果 URL 的檔案還沒有準備好,會直接有 Error (Code:100)
UNNotificationAttachment
identifier 物件的ID URL 物件的位置 type 檔案類型
使用 Amazon SNS 做實驗
登入SNS並且完成閒置步驟後(未實際操作過),從
- (void)application: didRegisterForRemoteNotificationsWithDeviceToken:
取得device toen
- 在 SNS/Applications/Endpoints 中搜尋出 Toekn
- 選擇 Publish to endpoint
- 選擇 JSON
- 輸入 Message (需要加入 \",不可換行)
另外一個工具 Knuff Knuff可以使用正常的格式,從 {"aps":"xxxxx"}開始,無需加"\"{"default":"This is the default Message","APNS_SANDBOX":"{ \"aps\" : { \"alert\" : {\"title\":\"You have got title.\",\"body\":\"You have got email.\"}, \"badge\" : 9,\"catgory\":\"FF01|25\",\"mutable-content\":1,\"sound\" :\"default\"}}"}
原文閱讀來自 Determine the Root Cause: 5 Whys
在 6-sigma 分析中,透過詢問「為什麼」來找出問題的真癥結,它不涉及數據分割(Data segmentation),假設檢驗(hypothesis testing),回歸(regression)或其他高級統計工具,在很多情況下可以在沒有收集數據之下完成。
透過詢問 Why 讓你一層一層剝開問題,有時候一個問題引發另一個問題,雖然此為 5 whys,但是可能實際使用上,會需要更多或是較少的問題,讓你找出問題癥結。
5 Ways 的優點
- 幫助你辨認問題的 root cause
- 定義不同的 root case 間的關係
- 最簡單的工具之一,不需要統計學
5 ways 的使用時機
- 當問題關係到人的因素或是反應
- 當是日常的業務範疇,可搭配 6-Sigma
如何完成 5 ways
- 「寫下問題 Problem Statement」將問題寫出來,可以幫助你定義出完整的問題,也可以讓團隊聚焦在一樣的問題上。
- 「討論這個問題 為何 Why 會發生」將問題發生的 原因 Beacuse,寫在問題的下方。
- 如果提出來的答案,還未能夠定義出原本問題的 root cause,那麼再提出下一個問題,並且討論問題的成因(why/because)。
- 循環檢視 1~3 項,直到團隊同意問題的 root cause 已經被定義出來。
5 Ways 範例
問題: 因為收到的商品不符合他們的規格,造成客戶不滿意。
第一個 Why:為什麼客戶收到錯誤商品?
因為 製造出貨的商品,不同於客戶與銷售部門同意的。
第二個 Why:為什麼製造的商品的規格不同於要銷售的?
因為 銷售員直接聯繫製造部主管來加速出貨。在傳達時發生了錯誤。
第三個 Why:為什麼銷售員直接聯繫製造部建立訂單,來取代公司建立的流程?
因為 訂單建立表格需要銷售主管同意,才能繼續後續工作,拖慢了製造的流程(或是因為主管不在辦公室而停滯)。
第四個 Why:為什麼訂單建立表格需要銷售主管同意?
因為 銷售主管需要向CEO持續報告銷售情況
在這個範例中,使用了四次 Whys,指出沒有價值的簽核造成程序效率降低。因此團隊可以針對這個原因來做改善。
與魚骨圖一起使用
5 Whys 可以獨自使用,也可以為魚骨圖分析的一部分。魚骨圖分析可以讓你針對一個問題,展開所有的可能性。當所有可能已經建立在魚骨圖後,即可利用 5 Whys 在釐清出問題的癥結。
Take-away Quotation
If you don’t ask the right questions, you don’t get the right answers. A question asked in the right way often points to its own answer. Asking questions is the ABC of diagnosis. Only the inquiring mind solves problems. – Edward Hodnett
原文閱讀來自 Dr. BJ Fogg's Blog http://www.behaviormodel.org/
Dr. BJ Fogg提出的行為模型,以三個關鍵要點,來決定使用者是否會執行。
- Motivation
- Ability
- Triggers
透過這三個要點,可以檢視自己所設計產品,是否容易吸引使用者使用。
Fogg教授在三大項中,又各自有明確的定義初小項目。
Motivation
pleasure/pain, hope/fear, acceptance/rejection
你讓使用者動機越強,越能驅動他們去做一件困難的事,反之亦然。
由內而外分別是:這件事情帶給人們內心是「充滿希望/充滿恐懼」,在執行的時候帶來「樂意/痛苦」的感覺,最後擴大的社會層面是這件事情讓社會「接受的/拒絕的」。
Ability
Simplicity
使用者的能力是可以被訓練的,但是訓練使用者絕對不是一件容易的事,除非只剩下這一條否則不要這麼做。
因此,Fogg教授推薦以「簡單化」作為增加Ability的方法(Easy to do)。
具體舉例是「時間」與「金錢」。(我想不只這兩個,但是卻是最容易改變的)
Triggers
cue, prompt, call to action, request, and so on...
三種Triggers的形態,分別是 Facilitator, Signal, and Spark。
- Facilitator輔助:以FB為例,在你許久未使用之際,FB會主動提醒你,並且有一個大大的Sign In,讓你「輕鬆」的點擊即可。Facilitator使用在「需要高動機、低能力」。
- Signal信號:在「需要中等動機、中等能力」的情況。
- Spark刺激:在「需要低動機、高能力」的情況。
Triggers的設計必須要考慮將我們預期的行為能夠串連起來。
以FB為例,面對許久未使用的用戶,FB並不只是提供一個方便的「Sign In」,因為對初期用戶看到一個空空的塗鴨牆沒有任何意義。FB提供一連串的從登入、尋找好友、信任好友,以達到使用FB的目的。
這是第二次參加 UI/UX Taipei。
雖然並非UI/UX的從業人員,但是設計師與工程師畢竟是相輔相成,知己知彼百戰百勝!?
這場其中一位分享者是「UX策略」的譯者,很巧的事幾個禮拜前剛從博客來買來這本書,是目前正在閱讀的書籍。
當初會選擇這本的書的原因是:
- 想要進一步了解UX。這本書是歐萊禮出版的,相信應該有他的品質,從介紹中也可以知道作者是實際從業人員。
- 這本書才3百多頁,不像其他歐禮萊的都像字典。體積重量好帶,也符合隨身攜帶的需求。 譯者一言以蔽之「UX策略 就是 做產品」。 因為目前我連第一章(討論商業策略、價值創新、實證使用者經驗、殺手級UX)都還沒看完,但是的確是油然而生的覺得這些跟UX有什麼關係。後來想想這好像呼應了做產品的開端。
=================
延伸閱讀一些在會議中相關的資訊:
。商業+技術+使用者經驗:好的產品缺一不可,也同時闡述到,如果身為「技術」者,那麼下一步可以往哪個方面加強之。
。價值儲存: 用戶可以看到實際被幫助了多少。例如:網路流量控制APP中,明顯提示出為用戶阻擋多少次背景使用網路。
。Chatbot interface
。5 whys and root cause analysis #RCA
。Foggbehaviormodel 法格行為模型(http://www.hansshih.com/post/85896187075/%E8%A1%8C%E7%82%BA%E6%A8%A1%E5%9E%8B-behavior-model)
原文閱讀自 5 things I do to keep up with latest iOS development trends
每年的Apple的重頭戲-WWDC,除了新產品發表,也帶來許多技術相關的消息。
作者建議5件事情,讓你保持掌握最新趨勢。
觀看WWDC影片
想要了解最新公布的趨勢技術,那就是直接看Apple提供的影片。 通常一段影片約20~60分鐘,需要找個空檔時間消化他們,還有可能要練習英聽就是。
Apple videos https://developer.apple.com/videos 請用Safari看閱讀Blog
透過閱讀別人的blog可以知道其他開發者的想法、正在做什麼研究,或是知道該怎麼正確的做事。無論自己已經多麼厲害,總是還是有更強的人。
作者分享兩個blog:
。Ray Wenderlich ios開發技術相關的文章。
。Realm Apple 科技相關的演講影片。
我會開始嘗試寫部落格,也是希望可以養成閱讀,並且分享的習慣。希望未來我可以在增加一些自己常看的blog在這裡。使用Twitter
剛看到這個標題的時候,嚇了一跳,因為我最近才剛加入Twitter,主要的目的除了使用一下現在全球也是前幾大的社群之外,因為多半都是歪國人在使用,所以想說可以看看一些英文語句。
如同作者說的,我很久以前有使用,但是沒有任何朋友在上面幾乎,所以又離開了。
作者分享他的使用心得是:
。簡短、較頻繁的推文風格
。關注一些名人,之後你就可以在你的牆上看到許多有趣的事 (嗯,我決定取消關注蘋果日報,因為那跟FB重複太大)
我想要「關注」關於:工作(ios, android, web)、科普、衝浪、棒球。使用Github
難過的表示,我才剛開始用Git幾個月,因為新公司有使用,而以前都是使用SVN。
目前換到Git後也算是漸漸習慣,並且可以應付日常操作。那麼,Github更重要的價值,應該就是「open source」吧!
因此挑選有興趣的、相關的repo或是作者,給他一顆星,追蹤他們,讓自己可以得到最新的消息,也是漸漸要建立起來的。
目前對repo的經驗還太少,暫時不追蹤任何專案或是作者。自己實作
所謂讀萬卷書、行萬里路,能夠實作一些tiny project,對於你正在學習的新知識,是最有幫助的!
如果有了tiny的實驗後,也要試著把它放在現實生活中,因為有些問題是要在複雜才能顯現出來的。
對我來說,這應該是值得紀念的一件事。
國小就有上英語教室、國中~高中都不是太有興趣學習英文,
到了大學一年級必須要分級上課,考到了個F班...最後還是以60分劃過,應該是大學成績最差的一科。
出了社會英文就不是老師逼你的,而是自身不得不加強學習。
一直對「商業、生活實用」英文有興趣(不會也不行),所以在工作期間就試著考考看TOEIC。
2010年的時候,買了一本國際學村的TOEIC實戰題庫,他的內容是標準的考試題型,總共有三回合,並且每題還有詳解,說明一些文法觀念或是如何分析題目。
記得我是用每天早晨,大約30分鐘左右,做做題目練習聽力。
雖然這個分數大概在一個唸到碩士畢業的人不是很好,但是我知道對我自己來說...已經是運氣很好。
當時公司規定,如果是RD主管要650分,我當時年資很淺,離主管還很遠,所以在一般的RD標準中是很好的~哈哈
後來離職,創業,忙忙碌碌過了六年,這期間沒有持續補強英文。直到又「回到」職場,當個上班族,每天有多出些時間可以安排,就想說是不是K一下書,再來考一次TOEIC。
英文這種不會跟時間演進的東西,不像資訊相關的書,可能會推陳出新。因此,我又翻出六年前的國際學村題庫本,當做是練習的工具。因為從確定報名到考試,這次只有一個多月的時間,所以我直接看了兩個回合的試題解說,力求可以記得每一題目所要考的文法、單字或是觀念,心理打著唸多少算多少。最後一週則是完整花了兩個小時,做一次模擬試題。
模擬試題做完,按照分數表計算一下,總共五百多分...我想說看來這次1500元是要浪費了,但是隔天就要考試,也只能以平常心去面對他。
考完後我就沒有太掛心這件事,想說算是先給自己一個評量,之後再繼續學習,再持續考試。
一個月後,成績單寄來,打開前心中已經想著看到5xx的失望準備...
嚇到自己看到的數字,不僅沒有退步比上次差,還越過了700分大關,查了一下730好像是第二級證書的最低分,我想金色證書我是不可能啦,但是能有個藍色好像也不錯!
這次考試的心得:
1. 準備期間不斷的背單字,因為大家都覺得語言最重要的還是單字
2. 文法克漏字力求抓到題目的關鍵點,例如關鍵介係詞、時態,以及對應前後文必定是名詞或是副詞
3. 聽力考試因為是背時間追著跑,所以盡量能在開始唸題目前,看一下已經有選項的單字,以增加自信
4. 閱讀測驗這次也是先做最後一部分的短文閱讀,因為短文需要推敲,如果最後才寫會心慌意亂
閱讀測驗最後填完後,還有回到短文閱讀檢查幾題自己沒有看的很懂得的文章,或許因此救回幾分吧!