iOS開發實用技術之推送-應用間跳轉-社交分享

實用補充

---

一. 推送通知

1. 什麼是推送通知?

> 首先明確:**此處的推送通知跟咱們的」NSNotification」沒有半毛錢關係
    > 能夠理解爲: 向用戶推送一條信息來通知用戶某件事情
    > 做用: 能夠在APP退到後臺,或者關閉時;繼續推送一條消息告訴用戶某件事情

2. 推送通知的應用場景?

(1) 一些任務管理APP,會在任務時間即將到達時,通知你作該任務; 
    (2) 健身App定時提醒你應該健身了; 
    (3) 買過電影票後,提早半小時告訴你,電影即將開場; 
    (4) 當你QQ或者微信收到消息時,即便退到後臺,或者關閉APP,也能夠收到信息通知告訴咱們;
    (5) 電商APP,推送一條消息通知咱們有新品上架等等

3. 推送通知的展示樣式?

(1) 在屏幕頂部顯示一塊橫幅(顯示具體內容)
    (2) 在屏幕中間彈出一個UIAlertView(顯示具體內容)
    (3) 在鎖屏界面顯示一塊橫幅(鎖屏狀態下,顯示具體內容)
    (4) 更新app圖標的數字(說明新內容的數量)
    (5) 播放音效(提醒做用)
* 注意:以上樣式只能是用戶本身設置,咱們沒法經過代碼控制*

4. 推送通知的分類

  1. 本地推送通知數組

    「本地」能夠理解爲」不聯網」;即便沒有網絡狀況下,也能夠推送通知消息
     應用場景: 肯定知道將來某個時間點應該提醒用戶什麼
  2. 遠程推送通知服務器

    概念:
         與「本地」相對,表示,必須在聯網狀況下才會向用戶推送通知消息
         遠程推送服務,又稱爲APNs(Apple Push Notification Services)
     應用場景: 
         1. 不肯定將來某個時間點應該提醒用戶什麼,臨時性的
         2. 當APP完全退出時也想繼續讓用戶獲取一些最新消息

     使用原則: 誰能肯定通知時間和內容, 誰就能夠發送(開發人員在APP內部經過代碼發送=本地通知; 服務器能夠肯定通知時間和內容=遠程通知)微信

5. 推送通知的實現

1. 本地推送通知

  1. 建立UILocalNotification 對象網絡

  2. 設置一些必要屬性app

    // 推送通知的觸發時間(什麼時候發出推送通知)
         @property(nonatomic,copy) NSDate *fireDate;
         // 推送通知的具體內容
         @property(nonatomic,copy) NSString *alertBody;
  3. 開始推送通知測試

    - 根據fireDate設定的時間進行推送
         [[UIApplication sharedApplication] scheduleLocalNotification:ln];
     - 當即推送
         presentLocalNotificationNow:(UILocalNotification *)notification;
  4. 監聽用戶點擊通知fetch

    - app處於前臺
             此時不會彈框通知用戶通知的到達,可是仍是會調用對應的代理方法 
         - app並無關閉,一直隱藏在後臺時
             此時用戶點擊通知信息後,會讓app進入前臺,並會調用AppDelegate的下面方法
             application: didReceiveLocalNotification: 
         - app已經被關閉(進程已死)
             此時用戶點擊通知信息後,會啓動app,啓動完畢會調用AppDelegate的下面方法
             application: didFinishLaunchingWithOptions: 
             launchOptions參數經過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對象
  5. 額外設置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;
  6. 其餘操做url

    - 得到被調度(定製)的全部本地推送通知
             @property(nonatomic,copy) NSArray *scheduledLocalNotifications;
                 已經發出且過時的推送通知就算調度結束,會自動從這個數組中移除
     - 取消調度本地推送通知
         - (void)cancelLocalNotification:(UILocalNotification *)notification;
         - (void)cancelAllLocalNotifications;
  7. 注意事項代理

    - 在iOS 8.0+,若是要使用本地通知,須要獲得用戶的許可
             在didFinishLaunchingWithOptions方法中添加以下代碼
             UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
             [application registerUserNotificationSettings:settings];
  8. 額外補充

    - 在iOS8.0以後,能夠設置推送通知帶操做行爲
             在註冊設置時,設置categories:參數
             監聽通知操做行爲的點擊

2. 遠程推送通知

  1. 遠程推送的原理

    > 全部蘋果設備, 在聯網狀態下,都會與蘋果服務器創建一個長鏈接 
         「長鏈接」: 相對的一個概念是」短鏈接」
             「長鏈接」優點: 服務器能夠向客戶端發送信息,保證數據即時性
                    劣勢: 佔用客戶和服務器資源
             「短鏈接」優點: 節省資源,一個會話結束後,當即釋放資源
                    劣勢: 服務器沒法主動向客戶端發信息 
    
     > 蘋果設備「長鏈接」做用:
         時間校準
         系統升級
         查找個人iPhone
         推送通知... 
    
     > 原理就是藉助蘋果設備與APNs服務器之間的長鏈接, 藉助APNs服務器將消息發送給客戶端
  2. 遠程推送通知實現的條件

    > 真有真機能夠調試推送通知
         由於只有真機具有UDID, 纔可以生成deviceToken
    
     > 須要真機調試證書, 推送測試證書
  3. 遠程推送通知實現, 客戶端須要作的事

    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
         {
    
         }
  4. 遠程推送測試

    > PushMeBaby
         1. 編譯會出現錯誤, 直接把錯誤行註釋便可;
         2. 須要填寫對應的deviceToken;      
         3. 須要將推送測試證書更名爲aps.cer 拖入項目中;
  5. 第三方推送

    極光推送(JPush)
     個推
     信鴿
    
     具體集成步驟以及使用方法, 請查看對應的官方文檔, 很是詳細;
     第三方服務合集: [http://mdsa.51cto.com/services/]

二. 應用程序間跳轉

1. 什麼是應用間跳轉,有什麼做用?

- 應用場景
        1. 使用第三方用戶登陸,須要用戶受權,還須要"返回到調用的程序,同時返回受權的用戶名"
        2. 應用程序推廣,網易彩票,設置-推薦應用-有不少應用程序圖標若是本機已經安裝過,會直接跳轉到另一個應用程序, 軟件的廣告,推廣結果,後續會有一些列的金錢上的結算
        3. 支付寶,第三方支付,淘寶,電話費充值。。。

2. 應用程序間跳轉實現?

直接打開對應APP的scheme便可

  1. 概念須知

    > URL : 統一資源定位符
         scheme(協議頭) : 決定經過什麼方式查找資源 http:// ftp:// tel:// file://
         path(路徑) : 資源路徑 www.baidu.com 192.168.1.1/資源 110 /User/Desktop
  2. 設置方式

    > 默認狀況下應用程序是沒有本身的URL的,若是想要擁有本身的URL,須要設置URL
         項目 -> info -> URL Types -> URL Scheme
  3. 打開方式

    代碼:
         [[UIApplication shareApplication] openURL:appURL];
  4. 跳轉到對方APP, 對方APP執行的代理方法

    -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
     {
    
     }
  5. iOS9.0跳轉適配

    在info.plist文件中添加LSApplicationQueriesSchemes 字段 ,是數組類型

三. 社交分享

1. 什麼是社交分享, 有什麼做用?

- 經過用戶的分享,讓更多的人去了解和使用這個App
- 目前移動互聯網應用程序推廣的最重要手段之一
- 屬於口碑營銷的範疇,經典成功案例是《瘋狂猜圖》

2. 社交分享的實現方案

  1. 系統自帶社交分享

    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"]]; // 配圖
  2. 第三方SDK實現(友盟分享)

    下載地址: [http://www.umeng.com/]
    
     1. 申請帳號,建立應用
     2. 下載SDK
     3. 參照集成文檔
相關文章
相關標籤/搜索