先申明一下,我是碼農,不是一個產品經理,但我覺得現有市面上的很多App,在設計“升級提示功能”都有問題。在此分享一下我的想法,歡迎大家討論。
這些有問題的App包括:新浪微博、網易微博、網易新聞客戶端以及大部分帶有升級提示功能的App,所以我覺得這個問題還是挺普遍的。對於該問題,一句話描述起來就是:“這些App都會在用戶剛剛使用它的時候,提示有新版本,讓用戶去AppStore上下載最新的版本”。下面是某個應用的升級提示截圖:
為什麼我認為這是一個糟糕的設計呢?因為用戶剛剛打開你的App,明顯就是想使用你的功能。例如剛剛打開新浪微博,可能就是想看一下最新的消息或回復。剛剛打開網易新聞客戶端,可能就是想看看最新的新聞。這個時候,你告訴用戶有新版本,是想讓用戶暫時放棄使用該App嗎?我不知道有多少用戶會去點“升級”這個按鈕,反正我每次看到這個提示都很郁悶,因為我如果點了,我就暫時不能使用該應用了(升級時原版本的App是無法使用的)。所以我在想,這個提示升級的時間能不能做得更友好一些?
有一次在地鐵上我想到了一個好辦法,就是讓升級提示不是出現在軟件剛剛打開的時候,而是用戶剛剛退出App的時候,我們可以在用戶剛剛退出App的時候,向iOS設備發一個本地的通知(Local Notification),在本地通知上顯示升級提示。當用戶點擊這個升級提示時,我們的App在啟動後跳轉到AppStore,這樣就達到的提示升級的效果。
這樣做相比以前的好處有以下幾點:
用戶退出App的時刻,是一個訪問這個App活動的結束。在這個時候提示,用戶更有理由接受升級。
即便用戶當前不接受升級,但這個升級提示都會存在用戶的通知中心中,用戶想升級時,點擊這個通知,就可以方便地一鍵跳到AppStore的下載頁面。而之前的方法在用戶取消後,用戶就不方便取獲下載地址了。
另外,本地通知的使用只需要iOS4.0以上版本即可,而在中國,iOS4.0以上比例達到了99%。本地通知也不需要向用戶申請發送通知的DeviceToken,所以該方案很少被用戶禁止(用戶只能專門去通知中心將該應用的所有通知關閉)。當然,這個升級提示也不應該每次都出現,以免對用戶產生太多打撓,象我在粉筆網客戶端上設置的策略是最多半個月出現一次。
在我在粉筆網iPhone端實現該方案後,有一次我發現支付寶的iOS客戶端也采用通知的方式來提示用戶升級,看來大家都想到一塊兒了。不過從通知的發送時間來看,他們應該不是使用的本地通知,而是通過服務器發送Push通知的方式。這種方式的好處是即使用戶安裝後一次也沒有使用你的App,你還是可以通過通知來喚醒他,可能的壞處是:
可能用戶已經升完級了,你還把升級通知的信息發給用戶了。象我就是,支付寶都升完級了,還發通知提示我有新版可以使用。
用戶如果禁止了應用的Push通知,你就沒辦法發送升級提醒了。
技術實現
再簡單說一下技術實現,我寫了一個VersionAgent類,每24小時最多向服務器請求一次最新的App版本,如果版本有更新,則在AppDelegate的applicationDidEnterBackgroundl回調中,發送一個本地通知,示例代碼如下:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
if ([[VersionAgent sharedInstance] shouldShowLocalNotification]) {
dispatch_async(dispatch_get_main_queue(), ^{
UILocalNotification * localNotification = [[UILocalNotification alloc] init];
if (localNotification) {
localNotification.fireDate= [[[NSDate alloc] init] dateByAddingTimeInterval:3];
localNotification.timeZone=[NSTimeZone defaultTimeZone];
localNotification.alertBody = @"粉筆網客戶端有新的版本,點擊到App Store升級。";
localNotification.alertAction = @"升級";
localNotification.soundName = @"";
[application scheduleLocalNotification:localNotification];
}
});
}
}
然後通過AppDelegate的回調函數,判斷App的啟動方式是否是通過用戶點擊通知中心的升級提示來啟動,如果是,則跳轉到AppStore,示例代碼如下:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// open app store link
NSString * url = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/app/id%@", APP_STORE_ID];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
題外話
最新微博上有一個新聞很火,一個技術男,給女友發彈窗通知求愛。有些人回復說這樣做太麻煩,需要在服務器上記DeviceToken,否則所有用戶都發的話,會讓很多不相關的人收到。
其實這完全可以用本地通知來做,完全不需要服務器配合,相當簡單。 具體做法是:你自己寫一個發本地求愛通知的小應用,然後記下女友手機的UDID,將女友的手機設置成開發者設備,然後抓住一次機會在其手機上安裝好開發者證書和你寫的這個小App即可。可以把這個App隱藏在某個文件夾下面,然後打開一次,設置好本地通知的發出時間即可。
我的很多文章最後結尾都是Have fun,不過最近很難高興起來啊。因為0x12 Big,今天google的全線產品都無法訪問了。想起我每天的工作都是用google搜技術貼,用gmail收郵件,用gtalk聊天,我的聯系人信息,備忘錄也是同步在google contact上,我真的無法fun起來了。本博客是架設在github上的,我也很擔心該博客可能也會因為是境外IP而被禁止訪問。
有時候,我很氣憤,而有時候,我會樂觀地想,這些都是負能量的積累,黎明前的黑暗。不管怎麼樣,誰也無法阻止大家對自由的向往,希望有朝一日,所有人都能自由地獲取信息。