iOS 8 pushkit使用總結(jié)

最近項(xiàng)目要做關(guān)于voip業(yè)務(wù),我們都知道蘋果后臺是一個(gè)假后臺,當(dāng)程序退出到后臺時(shí),socket是會斷開連接,程序是被掛起的。我們要做的就是類似QQ 微信那種,在程序退到后臺時(shí),有電話來時(shí)彈出一個(gè)通知。要了解pushkit概述請參考下面連接

百度某大神的博客http://blog.csdn.net/openglnewbee/article/details/44807191

  • 1.證書創(chuàng)建
    首先創(chuàng)建voip證書
    0AF8B321-63B9-40CD-88D0-8D782603CB5E.png

    67DAF714-175D-4BB6-A390-258869E22ACF.png

    一步一步往下創(chuàng)建,最后生成下載證書雙擊安裝到鑰匙串。
    當(dāng)安裝到鑰匙串完成后, 注意:我們還需要另外創(chuàng)建一個(gè)配置文件
7D841F9B-4B15-4809-A7A6-D9149C075538.png
![Uploading CBD67474-28EC-412D-94DD-7F2DD75E1071_112078.png . . .]

創(chuàng)建完成后下載 雙擊安裝就行了。

  • 2.接下來上代碼
  1. 需要導(dǎo)入push kit框架#import <PushKit/PushKit.h>
  2. 注冊通知與pushkit,pushkit要ios8 及以后才可以使用
 if (CurrentSystemVersion.floatValue >= 8.0) {
            UIUserNotificationSettings *userNotifiSetting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
            [[UIApplication sharedApplication] registerUserNotificationSettings:userNotifiSetting];
            PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:nil];
            pushRegistry.delegate = self;
            pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
        }

3.實(shí)現(xiàn)代理方法1

- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{
  NSString *str = [NSString stringWithFormat:@"%@",credentials.token];
  _tokenStr = [[[str stringByReplacingOccurrencesOfString:@"<" withString:@""]
               stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];
} //這個(gè)代理方法是獲取了設(shè)備的唯tokenStr,是要給服務(wù)器的

與apns推送不同,pushjit的token獲取跟apnstoken的獲取方法不同,apps在

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
    [application registerForRemoteNotifications];//必須先實(shí)現(xiàn)這個(gè)方法,才會走下面的方法
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    NSLog(@"%@",[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]                  stringByReplacingOccurrencesOfString: @">" withString: @""]                 stringByReplacingOccurrencesOfString: @" " withString: @""]);
    
    NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
    //獲取終端設(shè)備標(biāo)識,這個(gè)標(biāo)識需要通過接口發(fā)送到服務(wù)器端,服務(wù)器端推送消息到APNS時(shí)需要知道終端的標(biāo)識,APNS通過注冊的終端標(biāo)識找到終端設(shè)備
    NSLog(@"%@",token);
}

獲取設(shè)備的token,這兩個(gè)token的值是不同的,注意不要搞混了。

實(shí)現(xiàn)代理方法2

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pancal) name:@"precancel" object:nil];
    NSDictionary *dic = [self jsonToDictionary:[[payload.dictionaryPayload objectForKey:@"aps"] objectForKey:@"alert"]];
    if ([[dic objectForKey:@"cmd"] isEqualToString:@"precall"]) {
        UIUserNotificationType theType = [UIApplication sharedApplication].currentUserNotificationSettings.types;
        if (theType == UIUserNotificationTypeNone)
        {
            UIUserNotificationSettings *userNotifySetting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
            [[UIApplication sharedApplication] registerUserNotificationSettings:userNotifySetting];
        }
        UILocalNotification *backgroudMsg = [[UILocalNotification alloc] init];
        if (backgroudMsg) {
            backgroudMsg.timeZone = [NSTimeZone defaultTimeZone];
            backgroudMsg.alertBody = @"門口機(jī)來電";
            backgroudMsg.alertAction = @"查看";
            //設(shè)置通知的相關(guān)信息,這個(gè)很重要,可以添加一些標(biāo)記性內(nèi)容,方便以后區(qū)分和獲取通知的信息
            NSDictionary *infoDic = [NSDictionary dictionaryWithObject:@"name" forKey:@"key"];;
            backgroudMsg.userInfo = infoDic;
            [[UIApplication sharedApplication] presentLocalNotificationNow:backgroudMsg];
            [self cerateAVAudioPlayer];
        }
    }else if ([[dic objectForKey:@"cmd"] isEqualToString:@"precancel"]){
        [[NSNotificationCenter defaultCenter] postNotificationName:@"precancel"
                                                            object:nil];
        [self pancalStopSound];
}

如果一切正常,就算程序殺掉進(jìn)程,重啟,退到后臺,服務(wù)器推送過來的消息都會走代理方法2,在這里我們可以做一些處理,我這里是彈出了一個(gè)本地通知,并且播放提示音效。

使用push kit的優(yōu)點(diǎn)

1.應(yīng)用的voip長連接不保持,在收到呼叫或者發(fā)起呼叫時(shí)再連接;
2.當(dāng)呼叫發(fā)送到voip 服務(wù)器時(shí),對端若不在線,通過voip 服務(wù)器連接到pushserver向?qū)Χ税l(fā)push通知;
3.應(yīng)用收到voip push通知時(shí),迅速完成注冊;
4.呼叫方通過延時(shí)操作等邏輯(復(fù)雜一點(diǎn)對voip服務(wù)器進(jìn)行改造,被叫連接上來以后通知到主叫側(cè)),再次發(fā)起呼叫,通話即成功建立。

java后臺服務(wù)器搭建

public static void main(String[] args) throws Exception 
{
        try
        {
            //從客戶端獲取的deviceToken,在此為了測試簡單,寫固定的一個(gè)測試設(shè)備標(biāo)識。
           String deviceToken = "df779eda 73258894 5882ec78 3ac7b254 6ebc66fe fa295924 440d34ad 6505f8c4"
            System.out.println("Push Start deviceToken:" + deviceToken);
            //定義消息模式
            PayLoad payLoad = new PayLoad();
            payLoad.addAlert("this is test!");
            payLoad.addBadge(1);//消息推送標(biāo)記數(shù),小紅圈中顯示的數(shù)字。
            payLoad.addSound("default");
            //注冊deviceToken
            PushNotificationManager pushManager = PushNotificationManager.getInstance();
            pushManager.addDevice("iPhone", deviceToken);
            //連接APNS
            String host = "gateway.sandbox.push.apple.com";
            //String host = "gateway.push.apple.com";
            int port = 2195;
            String certificatePath = "c:/PushTest.p12";//前面生成的用于JAVA后臺連接APNS服務(wù)的*.p12文件位置
            String certificatePassword = "123456";//p12文件密碼。
            pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
            //發(fā)送推送
            Device client = pushManager.getDevice("iPhone");
            System.out.println("推送消息: " + client.getToken()+"\n"+payLoad.toString() +" ");
            pushManager.sendNotification(client, payLoad);
            //停止連接APNS
            pushManager.stopConnection();
            //刪除deviceToken
            pushManager.removeDevice("iPhone");
            System.out.println("Push End");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
}
}

注意: 用java搭建的后臺服務(wù)器我們需要提供給服務(wù)器.p12文件,用php搭建的服務(wù)器我們需要給服務(wù)器提供.pem文件

.p12文件導(dǎo)出

DA909015-E4C2-479D-A27B-46E700428C7A.png

右鍵導(dǎo)出文件即可。

.pem文件導(dǎo)出稍微復(fù)雜

參考 簡書作者《iOS原生APNS推送之PHP后臺的pem證書制作流程》

pushkit使用就到這里結(jié)束了,是不是很簡單呢,趕緊來一起愉快玩耍吧。附上使用截圖

IMG_0013(2).PNG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 概述 在多數(shù)移動應(yīng)用中任何時(shí)候都只能有一個(gè)應(yīng)用程序處于活躍狀態(tài),如果其他應(yīng)用此刻發(fā)生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,708評論 1 8
  • 原文:http://hechen.info/2015/07/30/iOS-Push-Notification/ 最...
    羊大果閱讀 3,036評論 0 8
  • 前言:現(xiàn)在第三方推送也很多 ,比如極光,融云,信鴿,其原理也是相同利用APNS推送機(jī)制 ,前段公司讓做自己的推送,...
    _方丈閱讀 21,953評論 15 133
  • 老是說別人器材黨,原來我自己才是個(gè)徹底的器材黨,不關(guān)注怎么拍照,而老是去關(guān)注有哪些新機(jī)器,哪些新功能,糾結(jié)什么鏡頭...
    九號咖啡屋閱讀 1,966評論 2 3

友情鏈接更多精彩內(nèi)容