iOS CocoaAsyncSocket長連接DEMO(可以在鎖屏狀態(tài)本地推送)

DEMO :https://github.com/ZackKingS/AsyncSocketDemo

WechatIMG2237.jpeg

一.引入 CocoaAsyncSocket

# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'

target 'AsyncSocketDemo' do
  # Uncomment this line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!
  pod 'CocoaAsyncSocket'  
  pod 'Masonry'
  # Pods for AsyncSocketDemo
end

二.TCP開始建立長連接

-(void)tcpTest:(UIButton*)sender
{
    NSLog(@"tcpTest");
    self.myTcpSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    [self tcpConnetwithData:[NSString stringWithFormat:@"%d",(int)sender.tag]];
    [self.mySocketArray addObject: self.myTcpSocket];
}

-(void)tcpConnetwithData:(NSString*)userData
{
    [self.myTcpSocket setUserData:userData];
    
    NSError *error = nil;
    if (![ self.myTcpSocket connectToHost:@"hudongdong.com" onPort:80 withTimeout:2.0f error:&error]) {
        NSLog(@"error:%@",error);
    }

}

3. didConnectToHost鏈接成功,成功之后就可以定時去發(fā)送消息了,為了能在鎖屏情況下發(fā)出發(fā)出消息报腔,寫了好幾個定時器

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
    NSLog(@"didConnectToHost");
    
    //////****  1      ****////
    //連上之后可以每隔30s發(fā)送一次心跳包
//        self.mytime =[NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(heartbeatFunc) userInfo:nil repeats:YES];
//        [self.mytime fire];
    
    
      //////****  2      ****////
//    NSRunLoop *currentRunloop = [NSRunLoop currentRunLoop];
//    [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(runn) userInfo:nil repeats:YES];
//    [currentRunloop run];
    
    
    
      //////****  3      ****////
    
  
//    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
//    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
//    dispatch_source_set_event_handler(timer, ^{
//        NSLog(@"GCD---%@",[NSThread currentThread]);
//        
//        //心跳包的內(nèi)容是前后端自定義的
//        NSString *heart = @"Damon";
//        NSData *data= [heart dataUsingEncoding:NSUTF8StringEncoding];
//        [self.myTcpSocket writeData:data withTimeout:10.0f tag:0];
//    });
//    
//    //4.啟動執(zhí)行
//    dispatch_resume(timer);
//    
//    //5.用強(qiáng)指針引用 定時器(保證其不被銷毀)
//    self.timer = timer;
    
    
    
      //////****  4     ****////
    
    [self startTime];
    
    UIApplication*   app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    });
    
    
    
    
    
}




- (void)startTime{
  
    
    __block int timeout = 60; //倒計時時間
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),3.0*NSEC_PER_SEC, 0); //每秒執(zhí)行
   
    dispatch_source_set_event_handler(_timer, ^{
        
        if(timeout<=0){ //倒計時結(jié)束株搔,關(guān)閉
            dispatch_source_cancel(_timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                //定時結(jié)束后的UI處理
            });
        }else{
            
            //心跳包的內(nèi)容是前后端自定義的
            NSString *heart = @"Damon";
            NSData *data= [heart dataUsingEncoding:NSUTF8StringEncoding];
            [self.myTcpSocket writeData:data withTimeout:10.0f tag:timeout];
            
            
            NSLog(@"時間 = %d",timeout);
            NSString *strTime = [NSString stringWithFormat:@"發(fā)送驗(yàn)證碼(%dS)",timeout];
            NSLog(@"strTime = %@",strTime);
            dispatch_async(dispatch_get_main_queue(), ^{
                //定時過程中的UI處理
            });
            
            timeout--;
        }
    });
    dispatch_resume(_timer);
    
}

4.向服務(wù)器發(fā)送完數(shù)據(jù)之后回調(diào)

//向服務(wù)器發(fā)送完數(shù)據(jù)之后回調(diào)
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
    NSLog(@"have send");
    
    //本地推送
    [self run:(long)tag];
    
    if (tag == 1) {
        NSLog(@"first send");
    }
    else if (tag ==2){
        NSLog(@"second send");
    }
}






-(void)run:(long)tag
{
    
    
    
    
    UILocalNotification* localNotification = [[UILocalNotification alloc] init];
    
    localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:0];  //30秒后推送
    
    //        localNotification.fireDate = [NSDate date];  //30秒后推送
    localNotification.timeZone = [NSTimeZone localTimeZone];
    localNotification.userInfo = @{
                                   @"name":@"the Name",
                                   @"id":@"0",
                                   };
    localNotification.alertBody = @"alertBody";
    localNotification.alertTitle = [NSString stringWithFormat:@"%ld",tag];
    
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; //注入系統(tǒng)
    
    
    
    [self playVibration];
    
    [self playNewMessageSound];
    
    //后臺播放聲音
    
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];
    
    
}





最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纯蛾,隨后出現(xiàn)的幾起案子纤房,更是在濱河造成了極大的恐慌,老刑警劉巖翻诉,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炮姨,死亡現(xiàn)場離奇詭異,居然都是意外死亡碰煌,警方通過查閱死者的電腦和手機(jī)舒岸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芦圾,“玉大人蛾派,你說我怎么就攤上這事「錾伲” “怎么了碍脏?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稍算。 經(jīng)常有香客問我典尾,道長,這世上最難降的妖魔是什么糊探? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任钾埂,我火速辦了婚禮,結(jié)果婚禮上科平,老公的妹妹穿的比我還像新娘褥紫。我一直安慰自己,他們只是感情好瞪慧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布髓考。 她就那樣靜靜地躺著,像睡著了一般弃酌。 火紅的嫁衣襯著肌膚如雪氨菇。 梳的紋絲不亂的頭發(fā)上儡炼,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音查蓉,去河邊找鬼乌询。 笑死,一個胖子當(dāng)著我的面吹牛豌研,可吹牛的內(nèi)容都是我干的妹田。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼鹃共,長吁一口氣:“原來是場噩夢啊……” “哼鬼佣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霜浴,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤沮趣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坷随,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體房铭,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年温眉,在試婚紗的時候發(fā)現(xiàn)自己被綠了缸匪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡类溢,死狀恐怖凌蔬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闯冷,我是刑警寧澤砂心,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站蛇耀,受9級特大地震影響辩诞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纺涤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一译暂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撩炊,春花似錦外永、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春祭衩,著一層夾襖步出監(jiān)牢的瞬間灶体,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工汪厨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愉择。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓劫乱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锥涕。 傳聞我的和親對象是個殘疾皇子衷戈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評論 25 707
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 23,794評論 8 183
  • "哇哇哇层坠,小凌殖妇。你知道嗎?我們被玫瑰皇家學(xué)院錄取了破花,哈哈哈谦趣,你知道嗎?進(jìn)入這個學(xué)院是我們的夢想誒座每,今天居然成真了前鹅。...
    a3a7668b171e閱讀 184評論 3 1
  • 八點(diǎn)半,踩著點(diǎn)到房管局峭梳,其實(shí)是不愿起床舰绘。冷,特意穿件厚衣服葱椭,還好是晴天捂寿。 上次的騎行路線忘記了,再次用地圖查下孵运,一...
    流浪癡人閱讀 240評論 0 0
  • 這兩年來秦陋,一直在斷斷續(xù)續(xù)地讀英語專業(yè)文獻(xiàn),不是崇洋媚外治笨、外國的月亮就是圓的踱侣、妄自菲薄,而是想找到表象之上的東西大磺,感...
    高甸閱讀 374評論 0 0