> 首先明確:**此處的推送通知跟咱們的」NSNotification」沒有半毛錢關係 > 能夠理解爲: 向用戶推送一條信息來通知用戶某件事情 > 做用: 能夠在APP退到後臺,或者關閉時;繼續推送一條消息告訴用戶某件事情
(1) 一些任務管理APP,會在任務時間即將到達時,通知你作該任務; (2) 健身App定時提醒你應該健身了; (3) 買過電影票後,提早半小時告訴你,電影即將開場; (4) 當你QQ或者微信收到消息時,即便退到後臺,或者關閉APP,也能夠收到信息通知告訴咱們; (5) 電商APP,推送一條消息通知咱們有新品上架等等
(1) 在屏幕頂部顯示一塊橫幅(顯示具體內容) (2) 在屏幕中間彈出一個UIAlertView(顯示具體內容) (3) 在鎖屏界面顯示一塊橫幅(鎖屏狀態下,顯示具體內容) (4) 更新app圖標的數字(說明新內容的數量) (5) 播放音效(提醒做用) * 注意:以上樣式只能是用戶本身設置,咱們沒法經過代碼控制*
本地推送通知數組
「本地」能夠理解爲」不聯網」;即便沒有網絡狀況下,也能夠推送通知消息 應用場景: 肯定知道將來某個時間點應該提醒用戶什麼
遠程推送通知服務器
概念: 與「本地」相對,表示,必須在聯網狀況下才會向用戶推送通知消息 遠程推送服務,又稱爲APNs(Apple Push Notification Services) 應用場景: 1. 不肯定將來某個時間點應該提醒用戶什麼,臨時性的 2. 當APP完全退出時也想繼續讓用戶獲取一些最新消息
使用原則: 誰能肯定通知時間和內容, 誰就能夠發送(開發人員在APP內部經過代碼發送=本地通知; 服務器能夠肯定通知時間和內容=遠程通知)微信
建立UILocalNotification 對象網絡
設置一些必要屬性app
// 推送通知的觸發時間(什麼時候發出推送通知) @property(nonatomic,copy) NSDate *fireDate; // 推送通知的具體內容 @property(nonatomic,copy) NSString *alertBody;
開始推送通知測試
- 根據fireDate設定的時間進行推送 [[UIApplication sharedApplication] scheduleLocalNotification:ln]; - 當即推送 presentLocalNotificationNow:(UILocalNotification *)notification;
監聽用戶點擊通知fetch
- app處於前臺 此時不會彈框通知用戶通知的到達,可是仍是會調用對應的代理方法 - app並無關閉,一直隱藏在後臺時 此時用戶點擊通知信息後,會讓app進入前臺,並會調用AppDelegate的下面方法 application: didReceiveLocalNotification: - app已經被關閉(進程已死) 此時用戶點擊通知信息後,會啓動app,啓動完畢會調用AppDelegate的下面方法 application: didFinishLaunchingWithOptions: launchOptions參數經過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對象
額外設置atom
// 每隔多久重複發一次推送通知 @property(nonatomic) NSCalendarUnit repeatInterval; // 點擊推送通知打開app時顯示的啓動圖片 @property(nonatomic,copy) NSString *alertLaunchImage; // 附加的額外信息 @property(nonatomic,copy) NSDictionary *userInfo; // 時區 @property(nonatomic,copy) NSTimeZone *timeZone; (通常設置爲[NSTimeZone defaultTimeZone] ,跟隨手機的時區) // 在鎖屏時顯示的動做標題(完整標題:「滑動來」 + alertAction) @property(nonatomic,copy) NSString *alertAction; // 音效文件名 @property(nonatomic,copy) NSString *soundName; // app圖標數字 @property(nonatomic) NSInteger applicationIconBadgeNumber;
其餘操做url
- 得到被調度(定製)的全部本地推送通知 @property(nonatomic,copy) NSArray *scheduledLocalNotifications; 已經發出且過時的推送通知就算調度結束,會自動從這個數組中移除 - 取消調度本地推送通知 - (void)cancelLocalNotification:(UILocalNotification *)notification; - (void)cancelAllLocalNotifications;
注意事項代理
- 在iOS 8.0+,若是要使用本地通知,須要獲得用戶的許可 在didFinishLaunchingWithOptions方法中添加以下代碼 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil]; [application registerUserNotificationSettings:settings];
額外補充
- 在iOS8.0以後,能夠設置推送通知帶操做行爲 在註冊設置時,設置categories:參數 監聽通知操做行爲的點擊
遠程推送的原理
> 全部蘋果設備, 在聯網狀態下,都會與蘋果服務器創建一個長鏈接 「長鏈接」: 相對的一個概念是」短鏈接」 「長鏈接」優點: 服務器能夠向客戶端發送信息,保證數據即時性 劣勢: 佔用客戶和服務器資源 「短鏈接」優點: 節省資源,一個會話結束後,當即釋放資源 劣勢: 服務器沒法主動向客戶端發信息 > 蘋果設備「長鏈接」做用: 時間校準 系統升級 查找個人iPhone 推送通知... > 原理就是藉助蘋果設備與APNs服務器之間的長鏈接, 藉助APNs服務器將消息發送給客戶端
遠程推送通知實現的條件
> 真有真機能夠調試推送通知 由於只有真機具有UDID, 纔可以生成deviceToken > 須要真機調試證書, 推送測試證書
遠程推送通知實現, 客戶端須要作的事
1. 請求蘋果得到deviceToken /** * 請求通知受權,以及請求遠程通知 */ - (void)registerRemoteNotification { if (isIOS(8.0)) { // 1. 請求通知受權 UIUserNotificationSettings *notificationSet = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSet]; // 2. 註冊遠程通知 [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { // iOS8.0以前請求遠程推送通知 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound ]; } } 2. 獲得蘋果返回的deviceToken,發送deviceToken給公司的服務器 /** * 當遠程通知註冊後,APNs會經過調用這個方法,返回對應的deviceToken */ -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"%@", deviceToken); } 3. 監聽用戶對通知的點擊 實現APP代理方法 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"%@", userInfo); } 或者: /** * 當接收到遠程通知時調用(iOS7.0以後使用) * * 當前在前臺時; 或者app在後臺\app被完全退出狀態下,點擊通知打開app進入前臺; 均可以執行如下方法 * * * 執行completionHandler 做用 * * 1> 系統會估量App消耗的電量,並根據傳遞的UIBackgroundFetchResult 參數記錄新數據是否可用 * 2> 調用完成的處理代碼時,應用的界面縮略圖會自動更新 * * 若是想要接收到通知後,不要用戶點擊通知, 就執行如下代碼, 那麼必須有三個要求: 1> 必須勾選後臺模式Remote Notification ; 2> 告訴系統是否有新的內容更新(執行完成代碼塊) 3> 設置發送通知的格式("content-available":"隨便傳") */ -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { }
遠程推送測試
> PushMeBaby 1. 編譯會出現錯誤, 直接把錯誤行註釋便可; 2. 須要填寫對應的deviceToken; 3. 須要將推送測試證書更名爲aps.cer 拖入項目中;
第三方推送
極光推送(JPush) 個推 信鴿 具體集成步驟以及使用方法, 請查看對應的官方文檔, 很是詳細; 第三方服務合集: [http://mdsa.51cto.com/services/]
- 應用場景 1. 使用第三方用戶登陸,須要用戶受權,還須要"返回到調用的程序,同時返回受權的用戶名" 2. 應用程序推廣,網易彩票,設置-推薦應用-有不少應用程序圖標若是本機已經安裝過,會直接跳轉到另一個應用程序, 軟件的廣告,推廣結果,後續會有一些列的金錢上的結算 3. 支付寶,第三方支付,淘寶,電話費充值。。。
直接打開對應APP的scheme便可
概念須知
> URL : 統一資源定位符 scheme(協議頭) : 決定經過什麼方式查找資源 http:// ftp:// tel:// file:// path(路徑) : 資源路徑 www.baidu.com 192.168.1.1/資源 110 /User/Desktop
設置方式
> 默認狀況下應用程序是沒有本身的URL的,若是想要擁有本身的URL,須要設置URL 項目 -> info -> URL Types -> URL Scheme
打開方式
代碼: [[UIApplication shareApplication] openURL:appURL];
跳轉到對方APP, 對方APP執行的代理方法
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { }
iOS9.0跳轉適配
在info.plist文件中添加LSApplicationQueriesSchemes 字段 ,是數組類型
- 經過用戶的分享,讓更多的人去了解和使用這個App - 目前移動互聯網應用程序推廣的最重要手段之一 - 屬於口碑營銷的範疇,經典成功案例是《瘋狂猜圖》
系統自帶社交分享
1. 導入Social.framework 2. 判斷服務是否可用 [SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo]; 3. 彈出分享內容輸入界面 SLComposeViewController *cc = \[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo]; [self presentViewController:cc animated:YES completion:nil]; 4. 額外設置 [cc setInitialText:@"測試文字"]; // 初始化文字 [cc addImage:[UIImage imageNamed:@"lufy"]]; // 配圖
第三方SDK實現(友盟分享)
下載地址: [http://www.umeng.com/] 1. 申請帳號,建立應用 2. 下載SDK 3. 參照集成文檔