1. 程式人生 > >iOS10本地推送和遠端推送的原理

iOS10本地推送和遠端推送的原理

使用遠端推送首先要在capacity中開啟後推送服務開關,有兩個地方要開啟。

參考:http://www.jianshu.com/p/bb89d636f989

http://www.jianshu.com/p/f6701763f8f2
http://blog.csdn.net/watson2017/article/details/54907289

Notifications 回顧

  • iOS 3 - Apple 引入推送通知

  • iOS 4 - 引入本地通知

  • iOS 5 - 有了通知中心

  • iOS 6 - 通知中心與iCloud同步

  • iOS 7 - 後臺靜默推送

  • iOS 8 - 重新設定了通知許可權,可互動通知

  • iOS 9 - 支援在通知中回覆訊息,Provider API 等等


遠端推送就是蘋果的APNs服務,在手機聯網的情況下,手機會和蘋果的的伺服器建立一個長連線,應用程式處於退出或者在後臺的狀態時,可以接受到遠端推送的訊息.這個服務需要99美金.

聯網的時候,iOS系統會自動的把裝置UDID和app的bundleID傳送給蘋果的伺服器,呼叫蘋果的API生成一個devicetoken,然後蘋果伺服器會吧devicetoken打包成一個NSData物件傳送給蘋果裝置,蘋果裝置把這個devicetoken告訴app應用,app在啟動的時候,

app應用吧devicetoken發給對應的app後臺伺服器.並儲存在伺服器上.此時有了登入賬號ID和對應的devicetoken在伺服器上.

如果app解除安裝了重灌,deviceToken會變;

同一個賬號,更換手機,device token會跟新;

同一個賬號,多點登入會儲存多個device token ;告訴蘋果伺服器幾個devicetoken,就給您推送幾個裝置;

同一個手機,登入有多個賬號時,如果devictoken之前存在,並且對應的賬號ID不是和現在的賬號ID一樣,就清空之前賬號的devicetoken,儲存現在賬號的devicetoken.

當我發訊息給其他使用者時,伺服器會根據對方賬號ID找到對應的deviceToken,告訴蘋果伺服器,蘋果伺服器根據devicetoken傳送訊息;

開發是的token和生產環境 的token是不一樣的,release版本的需要打包成Ahoc測試;

//=======================

//

//  AppDelegate.m

//  iOS10通知使用

//

//  Created by lambo on 2016/11/4.

//  Copyright © 2016 cn.lr. All rights reserved.

//

#import "AppDelegate.h"

@interface AppDelegate ()<UNUserNotificationCenterDelegate>

@end

@implementation AppDelegate

//程式完成啟動

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

//程式進入前臺,角標清零

[UIApplicationsharedApplication].applicationIconBadgeNumber=0;

//註冊通知,本地通知和遠端通知都用這個

UNUserNotificationCenter *center=[UNUserNotificationCentercurrentNotificationCenter];

    center.delegate=self;//設定代理

//請求獲取通知許可權(角標,聲音,彈框)

    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge |UNAuthorizationOptionSound |UNAuthorizationOptionAlert)completionHandler:^(BOOL granted,NSError * _Nullable error) {

if (granted) {

//獲取使用者是否同意開啟通知

NSLog(@"request authorization successed!");

        }else{

           //請開啟通知推送

         }

    }];

// //註冊遠端通知的時候一定加上要這個

//    [[UIApplication sharedApplication]registerForRemoteNotifications];

//********************* 獲取通知授權和設定

[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *_Nonnull settings) {

if (settings.authorizationStatus ==UNAuthorizationStatusNotDetermined)

    {

NSLog(@"未選擇");

    }elseif (settings.authorizationStatus ==UNAuthorizationStatusDenied){

NSLog(@"未授權");

    }elseif (settings.authorizationStatus ==UNAuthorizationStatusAuthorized){

NSLog(@"已授權");

    }

}];

returnYES;

}

//**********************設定本地通知*********************

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

//註冊通知

UNUserNotificationCenter *center = [UNUserNotificationCentercurrentNotificationCenter];

//**************************/設定推送的內容

UNMutableNotificationContent *content = [[UNMutableNotificationContentalloc]init];

    content.title =@"wwwwww";//標題

    content.subtitle =@"wwwwwww 707";//子標題

    content.body =@"Woah!wwwww?";//內容

    content.badge = @3;//數字角標

//***********************本地通知新增聲音*******************

//    UNNotificationSound *sound=[UNNotificationSound soundNamed:@""];

//    content.sound=sound;

//********************************本地通知新增影象附件**********************

NSError *error=nil;

NSString *imagePath=[[NSBundlemainBundle]pathForResource:@"1"ofType:@"jpg"];

UNNotificationAttachment *imageAttachment=[UNNotificationAttachmentattachmentWithIdentifier:@"imageIdentifier"URL:[NSURLfileURLWithPath:imagePath]options:nilerror:&error];

    content.attachments[email protected][imageAttachment];

//*********************本地通知新增視訊(注意天加視訊的時候預設不是新增到bundle中的,需要手動add target to )**************

//        NSString *videoPath=[[NSBundle mainBundle] pathForResource:@"1" ofType:@"png"];

//    UNNotificationAttachment *videoAttachment=[UNNotificationAttachment attachmentWithIdentifier:@"imageIdentifier" URL:[NSURL fileURLWithPath:videoPath] options:nil error:&error];

//    [email protected][videoAttachment];

//******************************按鈕*********************

//文字互動(iOS10之後支援對通知的文字互動)

/**options

     UNNotificationActionOptionAuthenticationRequired  用於文字

     UNNotificationActionOptionForeground  前臺模式,進入APP

     UNNotificationActionOptionDestructive  銷燬模式,不進入APP

     */

NSMutableArray *mArr=[NSMutableArrayarrayWithCapacity:0];

UNNotificationAction *actionA=[UNNotificationActionactionWithIdentifier:@"needUnlock"title:@"需要解鎖"options:UNNotificationActionOptionForeground];//需要解鎖,不進入app

UNNotificationAction *actionB=[UNNotificationActionactionWithIdentifier:@"red"title:@"紅色文字"options:UNNotificationActionOptionForeground];//點選不會進入app

UNTextInputNotificationAction *actionC=[UNTextInputNotificationActionactionWithIdentifier:@"text"title:@"文字"options:UNNotificationActionOptionForegroundtextInputButtonTitle:@"我的文字"textInputPlaceholder:@"輸入文字"];

    [mArr addObjectsFromArray:@[actionA,actionB,actionC]];

UNNotificationCategory *category=[UNNotificationCategorycategoryWithIdentifier:@"categoryIdentifier"actions:mArrintentIdentifiers:@[]options:UNNotificationCategoryOptionCustomDismissAction];

    [[UNUserNotificationCentercurrentNotificationCenter]setNotificationCategories:[NSSetsetWithObject:category]];

    content.categoryIdentifier=@"categoryIdentifier";

//內容的分類標識,必須和categaryIdentifier一致,和自定義的內容擴充套件中info.plist中的  UNNotificationExtensionCategory 的值一樣

//******************/triger---根據指定的日期和時間來展示本地通知,並且支援迴圈條件

//    UserNotifications提供了三種觸發器:

//    UNTimeIntervalNotificationTrigger:一定時間後觸發

//    UNCalendarNotificationTrigger在某月某日某時觸發

//    UNLocationNotificationTrigger在使用者進入或是離開某個區域時觸發

//3秒鍾後提醒

UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTriggertriggerWithTimeInterval:3 repeats:NO];

//    //每小時重複 1次(迴圈)

//    UNTimeIntervalNotificationTrigger *trigger2 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3600 repeats:YES];

//    //每週一早上 800提醒我

//    NSDateComponents *components = [[NSDateComponents alloc] init];

//    components.weekday = 2;

//    components.hour = 8;

//    UNCalendarNotificationTrigger *trigger3 = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];

//    //#import <CoreLocation/CoreLocation.h>

//    //一到麥當勞就喊我下車

//    CLRegion *region = [[CLRegion alloc] init];

//    UNLocationNotificationTrigger *trigger4 = [UNLocationNotificationTrigger triggerWithRegion:region repeats:NO];

//*****************傳送請求********************************8

NSString *requestIdentifier =@"sampleRequest";//傳送請求識別符號

UNNotificationRequest *request = [UNNotificationRequestrequestWithIdentifier:requestIdentifier

content:contenttrigger:trigger1];

 [center addNotificationRequest:requestwithCompletionHandler:^(NSError *_Nullable error) {

NSLog(@"error001---%@",error);

    }];

//    - 獲取未展示的通知

    [center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {

NSLog(@"未展示的通知%@",requests);

    }];

//    - 獲取展示過的通知

    [center getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> * _Nonnull notifications) {

NSLog(@"展示過的通知%@",notifications);

    }];

//    - 移除還未展示的通知

//        [center removePendingNotificationRequestsWithIdentifiers: @[@"sampleRequest"]];

//    [center removeAllPendingNotificationRequests]; //  - (void)cancelAllLocalNotifications

////    - 移除已經展示過的通知

//    [center removeDeliveredNotificationsWithIdentifiers:@[@"my_notification"]];

//    [center removeAllDeliveredNotifications];

//新增推送成功後的處理!

[center addNotificationRequest:requestwithCompletionHandler:^(NSError *_Nullable error) {

//        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"本地通知" message:@"成功新增推送" preferredStyle:UIAlertControllerStyleAlert];

//        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];

//        [alert addAction:cancelAction];

//        [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];

    }];

}


- (void)applicationWillResignActive:(UIApplication *)application {

}

- (void)applicationDidEnterBackground:(UIApplication *)application {

}

- (void)applicationWillEnterForeground:(UIApplication *)application {

}

- (void)applicationDidBecomeActive:(UIApplication *)application {

}

- (void)applicationWillTerminate:(UIApplication *)application {

}

//本地推送的時候,都是設定好的內容,可以設定推送的時間和是否迴圈推送,

如果沒有新的推送內容,則每次開啟都是以前那個推送內容。哪怕app刪了重新裝上也是一樣推送以前的內容。

程式退出和在後臺都會推送通知。

//在應用內展示通知。App處於前臺時獲取並處理即將觸發的推送:

-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{

NSDictionary *userInfo = notification.request.content.userInfo;

//前臺執行推送顯示紅色Label

    [selfshowLabelWithUserInfo:userInfocolor:[UIColorredColor]];

//可以設定當收到通知後,有哪些效果呈現(聲音/提醒/數字角標);預設App在前臺執行時不會進行彈窗,在程式接收通知呼叫此介面可實現指定的推送彈窗。--iOS10以下還可繼續使用,iOS10以上在[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:]方法中呼叫completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);即可

        completionHandler(UNNotificationPresentationOptionBadge|

UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);

NSLog(@"前臺掉用");

//    //1. 處理通知

//    在傳送通知前,有機會修改通知;(要用到UNNotificationServiceExtension ,提供在遠端推送將要被 push 出來前,處理推送顯示內容的機會)

//    //2. 處理完成後條用 completionHandler,用於指示在前臺顯示通知的形式

//    completionHandler(UNNotificationPresentationOptionAlert);

//

//====================

NSDictionary * userInfo = notification.request.content.userInfo;

UNNotificationRequest *request = notification.request;//收到推送的請求

UNNotificationContent *content = request.content;//收到推送的訊息內容

NSNumber *badge = content.badge//推送訊息的角標

NSString *body = content.body;   //推送訊息體

UNNotificationSound *sound = content.sound//推送訊息的聲音

NSString *subtitle = content.subtitle//推送訊息的副標題

NSString *title = content.title//推送訊息的標題

if([notification.request.triggerisKindOfClass:[UNPushNotificationTriggerclass]]) {

NSLog(@"iOS10前臺收到遠端通知:");

    }

else {

// 判斷為本地通知

NSLog(@"iOS10前臺收到本地通知:{\\\\nbody:%@\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge%@\\\\nsound%@\\\\nuserInfo%@\\\\n}",body,title,subtitle,badge,sound,userInfo);

    }

    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);//需要執行這個方法,選擇是否提醒使用者,有BadgeSoundAlert三種類型可以設定}


}

//在前臺或者點選通知進入app時呼叫,收到通知響應時的處理工作。使用者與你推送的通知進行互動時被呼叫:

//開啟應用程式,刪除通知,選擇通知按鈕

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(

相關推薦

iOS10本地遠端原理

使用遠端推送首先要在capacity中開啟後推送服務開關,有兩個地方要開啟。 參考:http://www.jianshu.com/p/bb89d636f989 http://www.jianshu.com/p/f6701763f8f2 http:

iOS 通知:本地通知(UILocalNotification)遠端通知(APNs)詳解

——本地推送通知 推送通知的作用? 在App退到後臺或者完全退出時,可以使用通知來告訴使用者某件事情,比如推送新的聊天訊息、新聞等 通知對應的效果: 在主螢幕的頂端會出現通知訊息 當手機鎖屏時出現在鎖屏介面,可以通過滑動開啟該App, 在通知中心中

IOS (本地遠端、三方[極光])

Provider是給你手機應用發出推送訊息的伺服器,而APNS(Apple Push Notification Service)則是蘋果訊息推送伺服器。你本地的伺服器當需要給應用推送一條訊息的時候,先要將訊息發出到蘋果推送伺服器,然後再由蘋果推送伺服器將訊息發到安裝了該應用的手機。 接下來再看一張解釋圖

本地遠端(JPUSHService極光例)

本地推送,例:app鬧鐘,定時提醒==     /*     //iOS8以後需要先註冊本地通知,需要經過使用者的同意     if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {

ios (遠端)升級成ios8系統之後有些程式接收不到遠端

維護一個程式,當手機升級到ios8之後就不能接收到遠端推送,顯示註冊失敗,查了下資料,原來是沒有獲取使用者許可,加了個方法試了下,ok if ([[[UIDevice currentDevice]systemVersion ]integerValue] >= 8) {

.net實現手機介面

最近做專案用到手機實時推送和介面實時推送兩種功能,分別用了Fleck和極光推送。 Fleck: Fleck是 C# 實現的 WebSocket 伺服器。比WebSoket更容易配置,開發更為簡單。 官方地址:https://github.com/sta

sftp本地上傳遠端下載

1.  開啟SecureCRT 連線相應的主機 2.  開啟會話後,使用快捷鍵 alt + p,進入 sftp> 介面 3.  檢視 sftp 相應的命令 help 4.  常用命令 (1)檢視遠端機當前路徑(pwd) 和 本地機當前路

SpringBoot檔案(本地虛擬路徑遠端ftp)上傳

一、測試中圖片上傳到本地硬碟      1、配置本地檔案上傳虛擬路徑(二種方式)       (1)方式一:yaml配置檔案 server: port: 8081 #配置檔案上傳的虛擬路徑 web: upload:

sourcetree將已經存在的的本地資料夾遠端倉庫關聯

以github為例 本例中新建的是angular專案,angular專案使用命令生成,只能選擇空的資料夾,但是sourcetree從遠端clone專案也是必須目標是空資料夾,這就要是本文解決

本地私有庫遠端私有庫的升級

以在庫中新增新的類為例子 1.本地私有庫的升級     只需要把新增的類 拖入到 classes 資料夾中 然後在 podfile 檔案目錄中 重新 pod install 即可 2.遠端私有庫的升級     2.1  把新增的類 拖入到 classes 資料夾中  

iOS10 遠端本地

遠端推送 新增新的框架 UserNotifications.framework #import <UserNotifications/UserNotifications.h> #pragma mark 註冊推送 -(void)regis

Git 本地所有分支拉取遠端所有分支

本文是另外一篇博文 Win10 Ubuntu子系統設定Git伺服器和SSH Server 證書登入,實現win10和macOS原始碼同步 的一部分,單獨拿出來說一下: 首先,設定好遠端Git Server的ssh證書登入,假設使用者名稱是git,遠端伺服器Host設定為n

git強制覆蓋原生代碼強制本地遠端倉庫

1.git強制覆蓋本地檔案(與git遠端倉庫保持一致): git fetch --all git reset --hard origin/master git pull git強制覆蓋本地命令(單條執行): git fetch --all &&

git 更新遠端程式碼到本地將原生代碼遠端

我們在多臺電腦上開發一個專案的時候,需要經常修改提交內容並在另一臺電腦上更新遠端最新的程式碼,今天看了一下如何從遠端程式碼倉庫獲取更新到本地。 檢視遠端分支 使用如下命令可以檢視遠端倉庫(

Git for Windows之本地版本庫到遠端倉庫

Git for Windows之基礎環境搭建與基礎操作中介紹了Git基本環境的構建與基本的操作.生成了一個本地git版本庫,本文將介紹如何將這個版本庫推送到遠端倉庫(碼雲,github也可以).   1、註冊碼雲的賬號,建立一個public的專案 點選進入該專案,有如下資訊: (1)、紅

git push 本地專案遠端分支

大家有的時候,會在本地新建專案,這裡說一下在本地專案建立本地GIT中倉庫,然後推到遠端倉庫的步驟 1.在本地專案的資料夾下,GIT中倉庫初始化   初始化本地的Git倉庫    2。 將本地檔案索引新增至混帳庫中 3。 4。

github多人協作本地分支遠端

第一步 把自己的ssk放到你要推送的那個人的電腦上 克隆遠端倉庫  git clone [email protected]:qijinping/XiangMuPing.git 進入專案檔案裡面 去git checkout -b mm //新建分支 git a

Git初始化本地已有專案,並遠端Git倉庫操作

Git初始化本地已有專案,並推送到遠端Git倉庫操作 1. 建立本地專案,在專案根目錄執行git init命令 git init 2. 在git伺服器上建立一個倉庫,這裡使用GitHub建立一個倉庫。 例如這個git倉庫 https://github.com/ios-z

本地分支建立,切換

命令 建立:git checkout -b 分支名 推送:git add 檔名 git commit -m “註釋” git push origin 本地分支名 切換:git checkout 分支名 步驟: 檢視分支 1.輸入git branch回車 注:命令

本地repo映象遠端gerrit伺服器

1、獲取遠端供應商的repo映象 repo init --mirror -u ssh://[email protected]$host_name:29418/manifests -b xx_branch --repo-url=ssh://[email protected]$h