1. 程式啟動時每次收到推送 或 程式未啟動通過推送訊息啟動程式時,都將會觸發appdelegate裡面的方法(注意要跟伺服器的認證一直,比如開發環境,伺服器也要用開發認證的pem才行):
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
//////////這裡是收到推送後的邏輯代碼
// 需要 #import
AudioServicesPlaySystemSound(1007); //系統的通知聲音
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);//震動
//自訂聲音
NSString *path = [[NSBundle mainBundle] pathForResource:@"message" ofType:@"wav"];
//組裝並播放音效
SystemSoundID soundID;
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)filePath, &soundID);
AudioServicesPlaySystemSound(soundID);
//聲音停止
AudioServicesDisposeSystemSoundID(soundID);
}
userInfo預設包含以下內容:
aps = {
alert = "";//推送顯示的問題資訊在這裡
badge = 0;//app的icon右上方的推送數字 在這裡設定
sound = "";
};
如果需要添加自訂的欄位,就讓伺服器的小夥伴們 跟aps同一層級添加一個數組(以Json為例):
{
"aps" : { "alert" : "This is the alert text", "badge" : 1, "sound" : "default" },
"server" : { "serverId" : 1, "name" : "Server name")
}
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
launchOptions中會有推送訊息的userInfo資訊,此時我們可以通過 NSDictionary* remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
獲得推送訊息內容。如果remoteNotification不為空白,則說明使用者通過推送訊息進入,那麼可以聲明一個屬性 @property (nonatomic) BOOL isLaunchedByNotification;
用於標識使用者是否通過點擊通知訊息進入本應用。
此時, - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
一定會被調用,iOS7可以使用 - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
因為此方法的調用時,MainViewController已經被初始化,所以我們已經可以在MainViewController註冊推送訊息的監聽,用於展示對應的視圖,如下: //訂閱展示視圖訊息,將直接開啟某個分支視圖[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentView:) name:@"PresentView" object:nil];//彈出訊息框提示使用者有訂閱通知訊息。主要用於使用者在使用應用時,彈出提示框[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showNotification:) name:@"Notification" object:nil];
所以在AppDelegate的didReceiveRemoteNotification中可以通過判斷isLaunchedByNotification來通知不同的展示方法。
退出登入後使用[[UIApplication sharedApplication] unregisterForRemoteNotifications];//登出推送訊息
友盟詳細解釋: 如果 App 狀態為未運行,此函數將被調用,如果launchOptions包含UIApplicationLaunchOptionsLocalNotificationKey表示使用者點擊apn 通知導致app被啟動運行;如果不含有對應索引值則表示 App 不是因點擊apn而被啟動,可能為直接點擊icon被啟動或其他。
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions; // apn 內容擷取:NSDictionary *remoteNotification = [launchOptionsobjectForKey: UIApplicationLaunchOptionsRemoteNotificationKey] |
如果 App狀態為正在前台或者後台運行,那麼此函數將被調用,並且可通過AppDelegate的applicationState是否為UIApplicationStateActive判斷程式是否在前台運行。此種情況在此函數中處理:
- ( void )application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo; // apn內容為userInfo |
如果是使用 iOS 7 的 Remote Notification 特性那麼處理函數需要使用--該特性見博文4
- ( void )application:(UIApplication*)application didReceiveRemoteNotification: (NSDictionary *)userInfofetchCompletionHandler:( void (^)(UIBackgroundFetchResult))completionHandler; // apn內容為userInfo |