剛開始作推送的時候原本覺得APNs證書就是主證書里加了個容許推送而已,事實證實我仍是太天真了。ios
首先是建立Provisioning Profile文件時選擇證書列表時是不能選擇APNs證書的,並且在XCode裏Code Signing也是不能選擇的。
APNs證書實際上是隻表示了有推送功能,主證書仍是必不可少的。因此如今只是又添加了兩個證書,其餘的是不用變的,因此如今就有4個證書了。做爲一個有輕微強迫症的人,建立完APNs證書就順手把主證書刪了,在這裏讓我折騰了很久。web
+ (void)setupWithOption:(NSDictionary *)launchingOption
appKey:(NSString *)appKey
channel:(NSString *)channel
apsForProduction:(BOOL)isProduction;
前兩個就沒必要說了。
channel 發佈渠道。我剛開始也不知道要怎麼填,iOS?App Store?Publish channel?其實這只是一個標識而已,不會有什麼具體影響。並且是可選的,因此填nil也是不要緊的。
isProduction 是否生產環境。看起來頗有用的一個參數,但實際發現YES或NO是沒區別的,在框架裏邊應該是另有判斷。但還必須得填,因此在生產和開發環境之間切換時是不必必定要改這個參數的。api
以前的教程文檔是沒有這個的,下載的Demo裏也沒有。可是項目裏確定是要有這個的。bash
別名 alias
爲安裝了應用程序的用戶,取個別名來標識。之後給該用戶 Push 消息時,就能夠用此別名來指定。每一個用戶只能指定一個別名。app
標籤 tag
爲安裝了應用程序的用戶,打上標籤。其目的主要是方便開發者根據標籤,來批量下發 Push 消息。可爲每一個用戶打多個標籤。框架
+ (void) setTags:(NSSet *)tags alias:(NSString *)alias fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler;
call back結果能夠忽略,但最好判斷一下, 返回值爲 0 才設置成功,才能夠向目標推送。我通常是有block就不會用其餘的,但使用block時須要注意循環引用問題。fetch
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
是在iOS7以後的方法,因此以前的方法能夠不用了。ui
- (void)applicationWillEnterForeground:(UIApplication *)application
applicationWillEnterForegroun是在didReceiveRemoteNotification以後運行的,因此在這個方法裏想處數據是不行的。而後[application setApplicationIconBadgeNumber:0];
是偶爾會抽風一下的,因此最好這樣寫:spa
[application setApplicationIconBadgeNumber: 1];
[application setApplicationIconBadgeNumber:0];
固然,不要忘了[application cancelAllLocalNotifications];
code
還有,關於跳轉到特定頁面的問題。反正我是沒找到如何在AppDelegate裏找到當前的頁面,因此只能用self.window.rootViewController
了。返回的話直接self.view.window.rootViewController = vc;
吧。
記得用application.applicationState == UIApplicationStateActive
判斷一下應用處於的狀態。若是用戶正在運行應用,或許還有更好的,但我就是彈一個UIAlertView。