這兩天好好的研究了下推送這功能,關於它我將分成兩部分來講,一、IOS手機端,二、Servlet服務端,今天先講下IOS端一、感受下麵講下我對推送這個功能在IOS下的感受,這個算是我做了服務端的功能和手機端的功能後的一個體會吧, 這功能在IOS上是多少給我帶來了點雞肋的感覺,首先很多時候收到推送有延時...
這兩天好好的研究了下推送這功能,關於它我將分成兩部分來講,一、IOS手機端,二、Servlet服務端,今天先講下IOS端
一、感受
下麵講下我對推送這個功能在IOS下的感受,這個算是我做了服務端的功能和手機端的功能後的一個體會吧, 這功能在IOS上是多少給我帶來了點雞肋的感覺,首先很多時候收到推送有延時現象,還有如果連續推送兩條消息給一個Iphone手機,如果遇到延時這個問題,那麼第一條推送就會被覆蓋。(這裡我用的是友盟的推送,這個推送暫時感覺還不錯,大多數推送能及時收到,至少我暫時測試是如此,所以我這裡也選擇了它,以前遇到過兩小時後才到的第三方推送.....甚至根本就收不到。),再一個,即使延遲這個問題解決了,關於推送消息的管理也是一個麻煩事,如果想好好管理,我覺得資料庫裡面首先得創建一張對應的通知管理表,今天在IOS上面我是認真的測試了這功能,當應用從後臺移除後,接受到的推送消息,是不會進入通知代理的,這一點是個麻煩事,(也就是這一點,讓我想到了資料庫中創建對應的表。),應為用戶不可能一直把手機拿手上,即使拿手上,就看那通知在手機上的短暫停留時間,也可能導致用戶沒看明白後臺推送的什麼,而且這時候應用處於被移出後臺的狀態,由於這個原因,接受到的通知就不能進入通知代理,所以導致這條通知無法保存到本地。所以說創建一張表我覺得是必要的。 但我發現很多應用都沒這樣做。 如果這樣做了,對推送來說是一個很大的優化,至少在IOS上是,因為IOS暫時無法完全避免接受不到通知這個揪心的問題,而且我覺得發送的消息內容都不重要了。感覺可以把通知的語音修改一下,這一點才重要.....改成這樣:你有新消息請在通知表中去查看....
二、下載友盟推送SDK集成到應用
這裡註冊我就不說了,下麵我主要以截圖的方式講解。
1、下麵的截圖點擊"SDK下載及文檔"
2、上一步執行後,進入新頁面,找到消息推送。
3、上一步執行後,進入新頁面,點擊SDK下載。
4、將下載的SDK推送包COPY到項目中。
三、導出推送證書上傳友盟,創建應用
1、友盟的推送只需要導出P12證書即可,不需要生成pem證書,這裡需要導出兩個證書,一個是開發者證書,一個是產品證書,下麵截圖。
你如果還不知道怎麼製作Ios推送證書,可以去 http://www.cnblogs.com/xiaoliao/p/4928873.html 查看,講得非常詳細。
2、下麵是友盟創建IOS應用的步驟截圖
首先進入帳號管理後臺,可以從首頁右上角點擊 我的產品進入。
進入後點擊頁面左下角的 +增加新應用
進入創建應用界面,創建應用,這裡由於我是演示給各位看,所以隨便填的。
上面步驟執行完畢後,拖動瀏覽器滾動條就會看到下麵的截圖
下麵的截圖我要說下,當你執行完上面截圖的步驟之後,你就給選擇的應用創建了推送的功能,然後你在看這個應用的就是下麵截圖的
的樣式,下麵這個截圖是可以隨意修改的,即使你上一步傳錯了證書,或則其他操作有誤,創建完畢後也可以修改。下麵是截圖,這裡
要說一個重點:就是伺服器IP的增加,如果這裡不增加伺服器IP,WEB服務端是無法將通知推送到你手機的。這裡的IP就是Servlt架設到伺服器的IP,我這裡由於
是在本機上做的servlet介面推送,所以就是我本機的IP了,如果架設到伺服器之後,這個IP就是要修改成伺服器的IP。
四、IOS上實現推送功能的代碼
1、只貼通知部分代碼,Appdelegate.m裡面授權。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//asdf;lajksdfl;asdfl;
/*友盟推送*/
[UMessage startWithAppkey:@"568f2ccbe0f55a3e05?" launchOptions:launchOptions];
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= _IPHONE80_
if(UMSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
action1.identifier = @"action1_identifier";
action1.title=@"Accept";
action1.activationMode = UIUserNotificationActivationModeForeground;//當點擊的時候啟動程式
UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init]; //第二按鈕
action2.identifier = @"action2_identifier";
action2.title=@"Reject";
action2.activationMode = UIUserNotificationActivationModeBackground;//當點擊的時候不啟動程式,在後臺處理
action2.authenticationRequired = YES;//需要解鎖才能處理,如果action.activationMode = UIUserNotificationActivationModeForeground;則這個屬性被忽略;
action2.destructive = YES;
UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];
categorys.identifier = @"category1";//這組動作的唯一標示
[categorys setActions:@[action1,action2] forContext:(UIUserNotificationActionContextDefault)];
UIUserNotificationSettings *userSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert
categories:[NSSet setWithObject:categorys]];
[UMessage registerRemoteNotificationAndUserNotificationSettings:userSettings];
} else{
//register remoteNotification types (iOS 8.0以下)
[UMessage registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert];
}
#else
//register remoteNotification types (iOS 8.0以下)
[UMessage registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert];
#endif
//for log
[UMessage setLogEnabled:YES];
}
2、註冊設備Token
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
//下麵這個token是將獲取的nsdata轉換成String,應為指定推送時我們需要將這個傳給服務端。
NSString *token=[NSString stringWithFormat:@"%@",[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @""]];
//註冊token
[UMessage registerDeviceToken:deviceToken];
}
3、接收推送
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
//接受服務端推送通知傳來的值,全部在userinfo裡面。
[UMessage didReceiveRemoteNotification:userInfo];
[UIApplication sharedApplication].applicationIconBadgeNumber=5;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
UIUserNotificationType myType = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
UIUserNotificationSettings *mySetting = [UIUserNotificationSettings settingsForTypes:myType categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySetting];
}else{
UIRemoteNotificationType myType = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myType];
}
}
四、管理後臺測試,手動發送推送。(截圖)
下麵的截圖要說一下,4的一步,增加測試設備,由於我這裡使用的是開發者模式,所以這裡我們需要將
測試是被的TOKEN增加到進去,獲取TOKEN的方法就是上一個步驟的( 2、註冊設備Token,的第一句代碼)
明天會增加服務端servlet的實現。