iOS藍(lán)牙4.0硼莽,后臺(tái)監(jiān)聽(tīng)來(lái)電

在上一篇文章《iOS藍(lán)牙4.0收發(fā)數(shù)據(jù)設(shè)計(jì)》,有簡(jiǎn)單的介紹收發(fā)數(shù)據(jù)設(shè)計(jì)。
在iOS藍(lán)牙4.0開發(fā)過(guò)程中褐捻,肯定還有許多伙伴痪宰,會(huì)遇到監(jiān)聽(tīng)后臺(tái)來(lái)電的需求。
那么iOS下匆光,如果監(jiān)聽(tīng)后臺(tái)來(lái)電呢套像?
其實(shí)蘋果官方CoreTelephony.framework中已經(jīng)提供了相應(yīng)監(jiān)聽(tīng)來(lái)電方法。

來(lái)看看系統(tǒng)提供的方法:

CTCallCenter *center = [[CTCallCenter alloc] init];
    center.callEventHandler = ^(CTCall *call) {
        if ([call.callState isEqualToString:CTCallStateIncoming]) {
            //來(lái)電
        }else if ([call.callState isEqualToString:CTCallStateConnected]) {
            //接通
        }else if ([call.callState isEqualToString:CTCallStateDisconnected]) {
            //掛斷
        }else if ([call.callState isEqualToString:CTCallStateDialing]) {
            //正在通話
        }else {
            //其他
        }
    };

如果你照搬上面的代碼终息,會(huì)發(fā)現(xiàn)不能監(jiān)聽(tīng)來(lái)電夺巩,因?yàn)樵贏RC模式下,center創(chuàng)建后周崭,就要被釋放了柳譬。所以,如果要監(jiān)聽(tīng)來(lái)電续镇,必須把center對(duì)象定義為全局或者被某個(gè)對(duì)象引用美澳,不要被釋放掉,或者再不需要監(jiān)聽(tīng)來(lái)電后磨取,再釋放掉人柿。

好,即使你采用了我上面的建議忙厌,最后還是發(fā)現(xiàn)有些不太完美凫岖。
上面的方法的確能夠監(jiān)聽(tīng)來(lái)電了,但是只能在APP運(yùn)行時(shí)逢净,才能夠正常監(jiān)聽(tīng)哥放;如果APP進(jìn)入后臺(tái),就再也監(jiān)聽(tīng)不到了爹土。尷尬I瘛!胀茵!

重點(diǎn)來(lái)了社露,我怎么才能讓后臺(tái)監(jiān)聽(tīng)來(lái)電呢?

我們先把問(wèn)題分解琼娘,上面的需求可以分解為兩個(gè)峭弟。一個(gè)是后臺(tái)運(yùn)行附鸽;另一個(gè)是監(jiān)聽(tīng)來(lái)電。

一瞒瘸、怎么才能后臺(tái)運(yùn)行呢坷备?

蘋果官方給出以下可以申請(qǐng)后臺(tái)運(yùn)行:

1.Audio and AirPlay(音頻播放)
2.Location updates(位置更新)
3.Voice over IP(voip)
4.Newsstand downloads
5.External accessory communication
6.Uses Bluetooth LE accessories
7.Acts as a Bluetooth LE accessory
8.Background fetch
9.Remote notifications

以上9種,都可以申請(qǐng)后臺(tái)運(yùn)行情臭。很好省撑,因?yàn)槲覀兊乃{(lán)牙4.0開發(fā),也可以申請(qǐng)后臺(tái)運(yùn)行俯在。

那么怎么才能做到我們藍(lán)牙4.0相關(guān)的APP能夠后臺(tái)運(yùn)行呢竟秫?我給出的做法,是使用定時(shí)器朝巫。

1鸿摇、定義一個(gè)屬性變量定時(shí)器。定義成屬性變量劈猿,方便我們?cè)诓皇褂脮r(shí)拙吉,進(jìn)行銷毀。比如APP進(jìn)入前臺(tái)時(shí)揪荣。

@property (nonatomic, strong) NSTimer *phoneTimer;

2筷黔、定時(shí)器

if (self.phoneTimer == nil) {
    self.phoneTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(commTimer:) userInfo:nil repeats:YES];
}

3、發(fā)送藍(lán)牙數(shù)據(jù)仗颈。(如果實(shí)際當(dāng)中佛舱,我們并不需要后臺(tái)發(fā)送數(shù)據(jù)時(shí),可以發(fā)送一些無(wú)意義的數(shù)據(jù)挨决,只是達(dá)到后臺(tái)運(yùn)行的目的)

- (void)commTimer:(NSTimer *)timer {
   //發(fā)送藍(lán)牙數(shù)據(jù)
}

好啦请祖,上面三步就可以完成藍(lán)牙4.0后臺(tái)運(yùn)行。當(dāng)然不要忘記了在plist文件中申請(qǐng)相應(yīng)的權(quán)限脖祈。如下圖:

申請(qǐng)藍(lán)牙權(quán)限.png

二肆捕、怎樣在后臺(tái)時(shí),監(jiān)聽(tīng)來(lái)電呢盖高?

如果你在定時(shí)執(zhí)行的commTimer方法中慎陵,執(zhí)行callEventHandler監(jiān)聽(tīng)方法,會(huì)發(fā)現(xiàn)依然監(jiān)聽(tīng)不到來(lái)電喻奥。
仔細(xì)看蘋果提供的CTCallCenter類席纽,會(huì)發(fā)現(xiàn)還有一個(gè)屬性變量currentCalls

/*
 *  CTCallCenter.h
 *  CFTelephony
 *
 *  Copyright 2010 Apple, Inc. All rights reserved.
 *
 */

#import <Foundation/Foundation.h>
#import <CoreTelephony/CoreTelephonyDefines.h>

@class CTCall;

NS_ASSUME_NONNULL_BEGIN

CORETELEPHONY_CLASS_AVAILABLE(4_0)
@interface CTCallCenter : NSObject

/*
 * currentCalls
 *
 * Discussion:
 *   An array containing CTCall objects for all calls that are currently
 *   in progress. If no calls are active, this will be nil.
 *
 */
@property(readonly, retain, nullable) NSSet<CTCall*> *currentCalls __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_NA, __MAC_NA, __IPHONE_4_0, __IPHONE_10_0, "Replaced by <CallKit/CXCallObserver.h>");

/*
 * callEventHandler
 *
 * Discussion:
 *   A block that will be dispatched on the default priority global dispatch
 *   queue when a new call event occurs. Set this property to a block
 *   that is defined in your application to handle call events.
 */
@property(nonatomic, copy, nullable) void (^callEventHandler)(CTCall*) __OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_NA, __MAC_NA, __IPHONE_4_0, __IPHONE_10_0, "Replaced by <CallKit/CXCallObserver.h>");

@end

NS_ASSUME_NONNULL_END

對(duì)撞蚕,我們就從這個(gè)變量入手润梯。來(lái)重寫commTimer方法。代碼示意如下:

/**
 后臺(tái)發(fā)送藍(lán)牙數(shù)據(jù)、監(jiān)聽(tīng)來(lái)電
 */
- (void)commTimer:(NSTimer *)timer {
    //發(fā)送藍(lán)牙數(shù)據(jù)
    if ([[BTManager shareManager] isConnect]) {
        [[BTManager shareManager] sendBackgroudData];
        //監(jiān)聽(tīng)來(lái)電
        CTCallCenter *center = [[CTCallCenter alloc] init];
        if (center.currentCalls) {
                CTCall *call = [center.currentCalls anyObject];
                if ([call.callState isEqual:CTCallStateIncoming]) {
                    isPhone = YES;
                    [[BTManager shareManager] phoneCallIn];
                }else if ([call.callState isEqual:CTCallStateDisconnected]) {
                    if (isPhone) {
                        isPhone = NO;
                        [[BTManager shareManager] phoneCallEnd];
                    }
                }else {
                    
                }
         }
    }
}

BTManager是我設(shè)計(jì)的一個(gè)藍(lán)牙管理類仆救,用來(lái)管理收發(fā)藍(lán)牙數(shù)據(jù)的抒和。
isConnect方法是判斷當(dāng)前是否有藍(lán)牙連接,當(dāng)然你也可以設(shè)計(jì)中彤蔽,當(dāng)藍(lán)牙斷開連接時(shí),就停止定時(shí)器庙洼。
sendBackgroudData發(fā)送是數(shù)據(jù)顿痪,保持藍(lán)牙后臺(tái)長(zhǎng)連接。

以上就是我在iOS藍(lán)牙4.0后臺(tái)監(jiān)聽(tīng)來(lái)電的解決方案油够。希望對(duì)藍(lán)牙4.0開發(fā)的伙伴們有所幫助蚁袭,有幫助的點(diǎn)個(gè)贊吧!哈哈JА揩悄!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鬼悠,隨后出現(xiàn)的幾起案子删性,更是在濱河造成了極大的恐慌,老刑警劉巖焕窝,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬挺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡它掂,警方通過(guò)查閱死者的電腦和手機(jī)巴帮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)虐秋,“玉大人榕茧,你說(shuō)我怎么就攤上這事】透” “怎么了用押?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)起愈。 經(jīng)常有香客問(wèn)我只恨,道長(zhǎng),這世上最難降的妖魔是什么抬虽? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任官觅,我火速辦了婚禮,結(jié)果婚禮上阐污,老公的妹妹穿的比我還像新娘休涤。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布功氨。 她就那樣靜靜地躺著序苏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捷凄。 梳的紋絲不亂的頭發(fā)上忱详,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音跺涤,去河邊找鬼匈睁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桶错,可吹牛的內(nèi)容都是我干的航唆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼院刁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糯钙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起退腥,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤任岸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后阅虫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體演闭,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年颓帝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了米碰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡购城,死狀恐怖吕座,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘪板,我是刑警寧澤吴趴,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站侮攀,受9級(jí)特大地震影響锣枝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兰英,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一撇叁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畦贸,春花似錦陨闹、人聲如沸楞捂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寨闹。三九已至,卻和暖如春君账,著一層夾襖步出監(jiān)牢的瞬間繁堡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工杈绸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帖蔓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓瞳脓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親澈侠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劫侧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • Guide to BluetoothSecurity原文 本出版物可免費(fèi)從以下網(wǎng)址獲得:https://doi.o...
    公子小水閱讀 7,902評(píng)論 0 6
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,516評(píng)論 25 707
  • 1、
    王響閱讀 84評(píng)論 0 0
  • 想象著你現(xiàn)在的樣子 是否還是曾經(jīng)的相遇 夢(mèng)中出現(xiàn)對(duì)你的幻想 可不及憂傷來(lái)的猛烈 不舍你離去幼稚如我 所有遺憾難的苦...
    念江子閱讀 488評(píng)論 0 0
  • 故事大綱:高中女生沈小舒哨啃,一次在公交車上拾到一個(gè)小熊鑰匙扣烧栋。于是把它帶回了家,小熊鑰匙扣竟然轉(zhuǎn)化成一個(gè)小男孩拳球。小男...
    茹心閱讀 280評(píng)論 0 1