中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS 消息推送

發布時間:2020-06-30 00:00:17 來源:網絡 閱讀:461 作者:Im劉亞芳 欄目:移動開發

APNS的推送機制

與Android上我們自己實現的推送服務不一樣,Apple對設備的控制非常嚴格,消息推送的流程必須要經過APNs:
 iOS 消息推送

這里 Provider 是指某個應用的Developer,當然如果開發者使用AVOS Cloud的服務,把發送消息的請求委托給我們,那么這里的Provider就是AVOS Cloud的推送服務程序了。上圖可以分為三步:
第一步:AVOS Cloud推送服務程序把要發送的消息、目的設備的唯一標識打包,發給APNs。
第二步:APNs在自身的已注冊Push服務的應用列表中,查找有相應標識的設備,并把消息發送到設備。
第三步:iOS系統把發來的消息傳遞給相應的應用程序,并且按照設定彈出Push通知

為了實現消息推送,有兩點非常重要:
1,App的推送證書
要能夠完整實現一條消息推送,需要我們在App ID中打開Push Notifications,需要我們準備好Provisioning Profile和SSL證書,并且一定要注意Development和Distribution環境是需要分開的。最后,把SSL證書導入到AVOS Cloud平臺,就可以嘗試遠程消息推送了。具體的操作流程可以參考我們的使用指南:iOS推送證書設置指南。
2,設備標識DeviceToken
知道了誰要推送,或者說要推送給哪個App之后,APNs還需要知道推到哪臺設備上,這就是設備標識的作用。獲取設備標識的流程如下:

 iOS 消息推送

第一步:App打開推送開關,用戶要確認TA希望獲得該App的推送消息
第二步:App獲得一個DeviceToken
第三步:App將DeviceToken保存起來,這里就是通過[AVInstallation saveInBackground]將DeviceToken保存到AVOS Cloud
第四步:當某些特定事件發生,開發者委托AVOS Cloud來發送推送消息,這時候AVOS Cloud的推送服務器就會給APNs發送一則推送消息,APNs最后消息送到用戶設備

推送相關的幾個概念

消息類型

一條消息推送過來,可以有如下幾種表現形式:

  • 顯示一個alert或者banner,展現具體內容


  • 在應用icon上提示一個新到消息數


  • 播放一段聲音


開發者可以在每次推送的時候設置,在推送達到用戶設備時開發者也可以選擇不同的提示方式。

本地消息通知

iOS上有兩種消息通知,一種是本地消息(Local Notification),一種是遠程消息(Push Notification,也叫Remote Notification),設計這兩種通知的目的都是為了提醒用戶,現在有些什么新鮮的事情發生了,吸引用戶重新打開應用。
本地消息什么時候有用呢?譬如你正在做一個To-do的工具類應用,對于用戶加入的每一個事項,都會有一個完成的時間點,用戶可以要求這個To-do應用在事項過期之前的某一個時間點提醒一下TA。為了達到這一目的,App就可以調度一個本地通知,在時間點到了之后發出一個Alert消息或者其他提示。
我們在處理推送消息的時候,也可以綜合運用這兩種方式。

代碼里面如何實現推送

首先,我們要獲取DeviceToken。

App需要每次啟動的時候都去注冊遠程通知——通過調用UIApplication的registerForRemoteNotificationTypes:方法,傳遞給它你希望支持的消息類型參數即可,例如:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    // do some initiale working
    ...
    
    [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];    return YES;
}

如果注冊成功,APNs會返回給你設備的token,iOS系統會把它傳遞給app delegate代理——application:didRegisterForRemoteNotificationsWithDeviceToken:方法,你應該在這個方法里面把token保存到AVOS Cloud后臺,例如:

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {    NSLog(@"Receive DeviceToken: %@", deviceToken);
    AVInstallation *currentInstallation = [AVInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    [currentInstallation saveInBackground];
}

如果注冊失敗,application:didFailToRegisterForRemoteNotificationsWithError:方法會被調用,通過NSError參數你可以看到具體的出錯信息,例如:

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {    NSLog(@"注冊失敗,無法獲取設備ID, 具體錯誤: %@", error);
}

請注意,注冊流程需要在app每次啟動時調用,這并不不會帶來額外的負擔,因為iOS操作系統在第一次獲得了有效的device token之后,會本地緩存起來,以后app再調用registerForRemoteNotificationTypes:的時候會立刻返回,并不會再進行網絡請求。另外,app層面不應該對device token進行緩存,因為device token也有可能變化——如果用戶重裝了操作系統,那么APNs再次給出的device token就會和之前的不一樣,又或者是,用戶restore了原來的backup到新的設備上,那么原來的device token也會失效。

其次,我們要處理收到消息之后的回調

我們可以設想一下消息通知的幾種使用場景:
1,在app沒有被啟動的時候,接收到了消息通知。這時候操作系統會按照默認的方式來展現一個alert消息,在app icon上標記一個數字,甚至播放一段聲音。
2,用戶看到消息之后,點擊了一下action按鈕或者點擊了應用圖標
如果action按鈕被點擊了,系統會通過調用application:didFinishLaunchingWithOptions:這個代理方法來啟動應用,并且會把notification的payload數據傳遞進去。
如果應用圖標被點擊了,系統也一樣會調用application:didFinishLaunchingWithOptions:這個代理方法來啟動應用,唯一不同的是這時候啟動參數里面不會有任何notification的信息。
示例代碼如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    // do initializing works
    ...    
    if (launchOptions) {        // do something else
        ...
    
        [AVAnalytics trackAppOpenedWithLaunchOptions:launchOptions];
    }
    
    [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];    return YES;
}

3,如果遠程消息發送過來的時候,app正在運行,這時候會發生什么呢?
app代理的application:didReceiveRemoteNotification:方法會被調用,同時遠程消息中的payload數據會作為參數傳遞進去。
示例代碼如下:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {    if (application.applicationState == UIApplicationStateActive) {        // 轉換成一個本地通知,顯示到通知欄,你也可以直接顯示出一個alertView,只是那樣稍顯aggressive:)
        UILocalNotification *localNotification = [[UILocalNotification alloc] init];
        localNotification.userInfo = userInfo;
        localNotification.soundName = UILocalNotificationDefaultSoundName;
        localNotification.alertBody = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];
        localNotification.fireDate = [NSDate date];
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    } else {
        [AVAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo];
    }
}

常見問題FAQ

我能推送長消息嗎

不能,APNs限制了每個notification的payload最大長度是256字節,超長的消息是不能發送的。

推送怎么加聲音提醒

消息推送是可以指定聲音的。譬如你可以對正面的反饋使用歡快的聲音,對負面的反饋使用低沉一點的聲音,都可以達到別出心裁讓人眼前一亮的目的。
你需要先放一些aiff、wav或者caf音頻文件到app的資源文件中,然后在推送的時候指定不同的音頻文件名就可以了。
 iOS 消息推送

推送的Badge是怎么回事

推送并不一定會導致應用圖標上紅色數字增加,是否顯示這一數字,顯示成多少,都取決于開發者自己。
在發送推送消息的時候,我們可以選擇是否遞增這一數字;如果不選擇這一項,那么消息推送并不會導致應用圖標上紅色數字的出現。
 iOS 消息推送
好,現在問題來了,這個數字如果搞出來了,怎么讓它消失掉呢?
其實我們只需要在任何時候設置 UIApplication.applicationIconBadgeNumber 屬性為0,就可以讓這個數字消失掉。
一般我們會選擇在應用啟動的時候(application:didFinishLaunchingWithOptions:方法中),或者干脆一點,在應用每次被切換到前臺的時候(applicationWillEnterForeground:方法中),調用這一行代碼,即可立刻清除掉Badge數字了。

AVOS Cloud平臺發出去的通知格式究竟是什么樣子的

對于每一條推送消息,都包含一個payload,通常是組成了一個JSON的Dictionary,這其中必不可少的是aps屬性,它對應的value也是一個Dictionary,包含下面一些內容:

alert消息(文本或Dictionary)
應用圖標上的紅色數字
播放的聲音文件名
在由推送激活的app打開事件中,application:didFinishLaunchingWithOptions:的options參數就是這個大的Dictionary對象。
{
    aps =     {
        alert = "hello, everyone";
        badge = 2;
        sound = default;
    };
}

這里要注意的時alert部分,它的值可以是一個String(文本消息),也可以是一個JSON的Dictionary。當它是文本消息的時候,系統就會把這些文字顯示到一個alertview中;如果它也是由一個JSON Dictionary組成的話,其格式如下:

body
action-loc-key
loc-key
loc-args
launch-p_w_picpath
body部分就是alertView中將要展現出來的文本消息,loc-屬性主要是用來實現本地化消息,launch-p_w_picpath只是app主bundle里的一個圖片文件的名稱,一般來說我們不指定這一屬性。

如何顯示本地化的消息

有兩種辦法可以實現推送消息的本地化:
1,在推送的payload中使用loc-key和loc-args來指定進行本地化,這樣Provider方只需要按照統一的格式來發送即可,消息的解析和組裝則由客戶端來完成。
2,如果推送的payload里面不包含loc-key/loc-args信息,那么Provider方就需要自己做本地化處理,然后給不同的device發送不同的消息,為了做到這一點,還需要app在上傳device token的時候也把用戶的語言設置信息傳回來。
目前,因為AVOS Cloud主要就是瞄準中國大陸市場和海外中文用戶,所以我們在推送上還不提供多語言支持。

應用該怎么響應推送消息

上面說的處理流程,只能簡單展示一下遠程消息,激活用戶讓他們重新回到app中來。但是有時候,我們希望帶給用戶更好的使用體驗,譬如如果我們告訴用戶:張三剛剛評論了你的照片。這時候用戶如果點擊action按鈕進入app,我們是展示具體的評論頁面為好,還是展示通常的啟動頁面然后讓用戶自己去找張三的評論好?我想負責任的開發者都會選擇前者:)

要做到靈活響應不同類型的通知消息,我們需要在通知的payload中增加更多信息,而不能僅僅只有alert出來的文字信息。對于AVOS Cloud消息推送平臺來講,就需要開發者使用更高級功能的JSON格式。譬如我們發送這樣的json字符串
{"action":{"type":4},"alert":"hello, everyone”} 最終在app內會收到這樣的UserInfo Dictionary:

{
    action =     {        type = 4;
    };
    aps =     {
        alert = "hello, everyone";
        badge = 4;
    };
}

“hello, everyone”會顯示到alertView中,但是整個Dictionary會通過launchOptions傳遞給application: didFinishLaunchingWithOptions: 方法,這樣我們在程序里面就可以對不同的消息實現不同的跳轉了。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海林市| 光泽县| 资讯| 临湘市| 沅陵县| 昌图县| 海林市| 正镶白旗| 山阴县| 旅游| 昌宁县| 驻马店市| 什邡市| 康定县| 荣成市| 鄄城县| 平陆县| 临沧市| 濮阳县| 镇原县| 玉山县| 海兴县| 禹城市| 方正县| 湖北省| 永定县| 封开县| 石首市| 咸宁市| 五华县| 蕉岭县| 邵阳县| 望城县| 井冈山市| 衡山县| 鄄城县| 清新县| 蒙阴县| 丹阳市| 阿克| 新丰县|