天天看點

iOS 推送背景語音播報

推送通知

  • 注意:這裡說的推送通知跟NSNotification有所差別
  • NSNotification是抽象的,不可見的
  • 推送通知是可見的(能用肉眼看到)
  • iOS中提供了2種推送通知
  • 本地推送通知(Local Notification)
  • 遠端推送通知(Remote Notification)
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報

推送通知的呈現效果總結

  • 總結一下,推送通知有5種不同的呈現效果
  • 在螢幕頂部顯示一塊橫幅(顯示具體内容)
  • 在螢幕中間彈出一個UIAlertView(顯示具體内容)
  • 在鎖屏界面顯示一塊橫幅(鎖屏狀态下,顯示具體内容)
  • 更新app圖示的數字(說明新内容的數量)
  • 播放音效(提醒作用)
iOS 推送背景語音播報
iOS 推送背景語音播報

 推送通知的使用細節

  • 發出推送通知時,如果目前程式正運作在前台,那麼推送通知就不會被呈現出來
  • 點選推送通知後,預設會自動打開發出推送通知的app
  • 不管app打開還是關閉,推送通知都能如期發出

本地推送通知

  • 什麼是本地推送通知
  • 顧名思義,就是不需要聯網就能發出的推送通知(不需要伺服器的支援)
  • 本地推送通知的使用場景
  • 常用來定時提醒使用者完成一些任務,比如
  • 清理垃圾、記賬、買衣服、看電影、玩遊戲

如何發出本地推送通知

  • 建立本地推送通知對象

UILocalNotification *ln = [[UILocalNotification alloc] init];

  • 設定本地推送通知屬性
  • 推送通知的觸發時間(何時發出推送通知)

@property(nonatomic,copy) NSDate *fireDate;

  • 推送通知的具體内容

@property(nonatomic,copy) NSString *alertBody;

  • 在鎖屏時顯示的動作标題(完整标題:“滑動來” + alertAction)

@property(nonatomic,copy) NSString *alertAction;

  • 音效檔案名

@property(nonatomic,copy) NSString *soundName;

  • app圖示數字

@property(nonatomic) NSInteger applicationIconBadgeNumber;

如何發出本地推送通知

  • 排程本地推送通知(排程完畢後,推送通知會在特地時間fireDate發出)

[[UIApplication sharedApplication] scheduleLocalNotification:ln];

  • 獲得被排程(定制)的所有本地推送通知

@property(nonatomic,copy) NSArray *scheduledLocalNotifications;

(已經發出且過期的推送通知就算排程結束,會自動從這個數組中移除)

  • 取消排程本地推送通知

- (void)cancelLocalNotification:(UILocalNotification *)notification;

- (void)cancelAllLocalNotifications;

  • 立即發出本地推送通知

- (void)presentLocalNotificationNow:(UILocalNotification *)notification;

本地推送通知的其他屬性

  • 每隔多久重複發一次推送通知

@property(nonatomic) NSCalendarUnit repeatInterval;

  • 點選推送通知打開app時顯示的啟動圖檔

@property(nonatomic,copy) NSString *alertLaunchImage;

  • 附加的額外資訊

@property(nonatomic,copy) NSDictionary *userInfo;

  • 時區

@property(nonatomic,copy) NSTimeZone *timeZone;

(一般設定為[NSTimeZone defaultTimeZone] ,跟随手機的時區)

點選本地推送通知

  • 當使用者點選本地推送通知,會自動打開app,這裡有2種情況
  • app并沒有關閉,一直隐藏在背景
  • 讓app進入前台,并會調用AppDelegate的下面方法(并非重新啟動app)

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;

  • app已經被關閉(程序已死)
  • 啟動app,啟動完畢會調用AppDelegate的下面方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

  • launchOptions參數通過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對象

遠端推送通知(難)

  • 什麼是遠端推送通知
  • 顧名思義,就是從遠端伺服器推送給用戶端的通知(需要聯網)
  • 遠端推送服務,又稱為APNs(Apple Push Notification Services)
  • 為什麼需要遠端推送通知?
  • 傳統擷取資料的局限性
  • 隻要使用者關閉了app,就無法跟app的伺服器溝通,無法從伺服器上獲得最新的資料内容
  • 遠端推送通知可以解決以上問題
  • 不管使用者打開還是關閉app,隻要聯網了,都能接收到伺服器推送的遠端通知 
iOS 推送背景語音播報

遠端推送通知使用須知

  • 所有的蘋果裝置,在聯網狀态下,都會與蘋果的伺服器建立長連接配接
  • 什麼是長連接配接
  • 隻要聯網了,就一直建立連接配接
  • 長連接配接的作用
  • 時間校準
  • 系統更新
  • 查找我的iPhone
  • .. ...
  • 長連接配接的好處
  • 資料傳輸速度快
  • 資料保持最新狀态
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報

一.開發iOS程式的推送功能, iOS端需要做的事

1.請求蘋果獲得deviceToken

2.得到蘋果傳回的deviceToken

3.發送deviceToken給公司的伺服器

4.監聽使用者對通知的點選

二.調試iOS的遠端推送功能, 必備條件:

1.真機

2.調試推送需要的證書檔案

1> aps_development.cer : 某台電腦就能調試某個app的推送服務

2> ios_development.cer : 讓電腦具備真機調試的能力(調試裝置)

3> iphone5_qq.mobileprovision : 某台電腦就能利用某台裝置調試某個程式

三.釋出具有推送服務的app

1> aps_production.cer : 如果釋出的程式中包含了推送服務,就必須安裝此證書

2> ios_distribution.cer  : 讓電腦具備釋出程式的能力

3> qq.mobileprovision  : 某台電腦就能釋出某個程式

iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報

注冊遠端推送通知

  • 注冊成功後會調用AppDelegate的下面方法,得到裝置的deviceToken

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

{

    NSLog(@"%@", deviceToken);

}

點選遠端推送通知

  • 當使用者點選遠端推送通知,會自動打開app,這裡有2種情況
  • app并沒有關閉,一直隐藏在背景
  • 讓app進入前台,并會調用AppDelegate的下面方法(并非重新啟動app)

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;

  • app已經被關閉(程序已死)
  • 啟動app,啟動完畢會調用AppDelegate的下面方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

  • launchOptions參數通過UIApplicationLaunchOptionsRemoteNotificationKey取出伺服器傳回的字典内容
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報

JPush

  • 什麼是JPush
  • 一套遠端推送解決方案,支援android和iOS兩個平台
  • 它能夠快捷地為iOS App增加推送功能,減少內建APNs需要的工作量、開發複雜度
  • 更多的資訊,可以參考JPush官方網站:https://www.jpush.cn
  • 內建iOS SDK的步驟可以參考
  • http://docs.jpush.cn/pages/viewpage.action?pageId=2621727
iOS 推送背景語音播報
iOS 推送背景語音播報
iOS 推送背景語音播報
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.設定一些必要屬性

 推送通知的觸發時間(何時發出推送通知)

@property(nonatomic,copy) NSDate *fireDate;

 推送通知的具體内容

@property(nonatomic,copy) NSString *alertBody;

3.開始推送通知

- 根據fireDate設定的時間進行推送

[[UIApplication sharedApplication] scheduleLocalNotification:ln];

- 立即推送

presentLocalNotificationNow:(UILocalNotification *)notification;

4.監聽使用者點選通知

- app處于前台

此時不會彈框通知使用者通知的到達,但是還是會調用對應的代理方法

- app并沒有關閉,一直隐藏在背景時

此時使用者點選通知資訊後,會讓app進入前台,并會調用AppDelegate的下面方法

application: didReceiveLocalNotification:

- app已經被關閉(程序已死)

此時使用者點選通知資訊後,會啟動app,啟動完畢會調用AppDelegate的下面方法

application: didFinishLaunchingWithOptions:

launchOptions參數通過UIApplicationLaunchOptionsLocalNotif icationKey取出本推送通知對象

5.額外設定

每隔多久重複發一次推送通知

@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.其他操作

- 獲得被排程(定制)的所有本地推送通知

@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給公司的伺服器

-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

{

    NSLog(@"%@", deviceToken);

}

3. 監聽使用者對通知的點選

實作APP代理方法

接收到通知, 并且在以下場景

當APP在前台時, 可以調用

當APP從背景, 進入到前台, 可以調用

注意:當APP 被徹底退出時, 不調用這個方法, 調用 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

{

    NSLog(@"%@", userInfo);

}

或者:

-(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

  {

  }

  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. 參照內建文檔

  • 遠端推送應用配置過程

1. 建立支援遠端推送功能的App ID

2. 建立調試證書,并選中剛剛建立的App ID

3. 下載下傳CER檔案,并導入鑰匙串管理

4. 建立釋出證書,并選中剛剛建立的App ID

5. 下載下傳CER檔案,并導入鑰匙串管理

6. 檢查App ID,确認證書已經指定

7. 生成描述檔案

格式:{"aps":{"alert":"This is some fancy message.","badge":1,"sound":"default"}}

遠端推送應用程式開發過程

1. 建立應用程式

2. 指定AppID,在developer.apple.com上設定的AppID

if(系統版本 >= 8.0)

{

    注冊接收通知的類型

    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];

    [application registerUserNotificationSettings:settings];

    注冊允許接收遠端推送通知

    [application registerForRemoteNotifications];

}

else

{

    如果是iOS7.0,使用以下方法注冊

    [application registerForRemoteNotificationTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound];

}

當得到蘋果的APNs伺服器傳回的DeviceToken就會被調用

7040f7d5 5a974598 c5cf31b5 3e340b39 68affd25 122f0ce1 3f315226 396c2e5b

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    NSLog(@"deviceToken是:%@", deviceToken);

}

接收到遠端通知,觸發方法和本地通知一緻

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    NSLog(@"%@", userInfo);

}

使用背景的遠端消息推送

1> 在Capabilities中打開遠端推送通知

2> 實作代理方法

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

遠端消息資料格式:

{"aps" : {"content-available" : 1},"content-id" : 42}

執行completionHandler有兩個目的

1> 系統會估量App消耗的電量,并根據傳遞的UIBackgroundFetchResult 參數記錄新資料是否可用

2> 調用完成的處理代碼時,應用的界面縮略圖會自動更新

注意:接收到遠端通知到執行完網絡請求之間的時間不能超過30秒

if (userInfo) {

    int contentId = [userInfo[@"content-id"] intValue];

    ViewController *vc = (ViewController *)application.keyWindow.rootViewController;

    [vc loadDataWithContentID:contentId completion:^(NSArray *dataList) {

        vc.dataList = dataList;

        NSLog(@"重新整理資料結束");

        completionHandler(UIBackgroundFetchResultNewData);

    }];

} else {

    completionHandler(UIBackgroundFetchResultNoData);

 GitHub 項目連結 :

https://github.com/liminting/MTTestPushVoice