上一篇 主要介紹了部分ESC/POS指令集,包括一些常用的排版指令,打印位圖指令等。另外,還介紹了將圖片轉(zhuǎn)換成點(diǎn)陣圖的方法。在這篇文章中,將主要介紹通過藍(lán)牙和Socket連接打印機(jī),發(fā)送打印指令相關(guān)知識(shí)。這里將用到 CoreBluetooth.framework 和 CocoaAsyncSocket 。
創(chuàng)新互聯(lián)主營阜康網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),阜康h5成都微信小程序搭建,阜康網(wǎng)站營銷推廣歡迎阜康等地區(qū)企業(yè)咨詢
藍(lán)牙是一種支持設(shè)備間短距離通訊的無線電技術(shù)。iOS系統(tǒng)中,有四個(gè)框架支持藍(lán)牙鏈接:
CoreBluetooth框架有兩個(gè)核心概念,central(中心)和 peripheral(外設(shè)),它們分別有自己對(duì)應(yīng)的API;這里顯然是手機(jī)作為central,藍(lán)牙打印機(jī)作為peripheral;
設(shè)置代理后,會(huì)回調(diào)此方法,確認(rèn)藍(lán)牙狀態(tài),當(dāng)狀態(tài)為 CBCentralManagerStatePoweredOn 才能去掃描設(shè)備,藍(lán)牙狀態(tài)變化時(shí),也會(huì)回調(diào)此方法
調(diào)用此方法開始掃描外設(shè)
注意:第一個(gè)參數(shù)指定一個(gè) CBUUID 對(duì)象數(shù)組,每個(gè)對(duì)象表示外圍設(shè)備正在通告的服務(wù)的通用唯一標(biāo)識(shí)符(UUID)。此時(shí),僅返回公布這些服務(wù)的外設(shè)。當(dāng)參數(shù)為 nil ,則返回所有已發(fā)現(xiàn)的外設(shè),而不管其支持的服務(wù)是什么。
當(dāng)掃描到4.0外設(shè)后會(huì)回調(diào)此方法,這里包含設(shè)備的相關(guān)信息,如名稱、UUID、信號(hào)強(qiáng)度等;
調(diào)用此方法連接外設(shè)
[self.centralManager connectPeripheral:peripheral options:nil];
注意:第一個(gè)參數(shù)是要連接的外設(shè)。第二個(gè)參數(shù) options 是可選的 NSDictionary ,系統(tǒng)定義了一下三個(gè)鍵,它們的值都是NSNumber (Boolean);默認(rèn)為NO。當(dāng)設(shè)置為YES,則應(yīng)用進(jìn)入后臺(tái)或者被掛起后,系統(tǒng)會(huì)用Alert通知藍(lán)牙外設(shè)的狀態(tài)變化,效果是這樣
連接成功或失敗,都有對(duì)應(yīng)的回調(diào)方法
連接成功后設(shè)置代理 peripheral.delegate = self ,調(diào)用 [peripheral discoverServices:nil]; 尋找外設(shè)內(nèi)的服務(wù)。這里的參數(shù)是一個(gè)存放 CBUUID 對(duì)象的數(shù)組,用于發(fā)現(xiàn)特定的服務(wù)。當(dāng)傳nil時(shí),表示發(fā)現(xiàn)外設(shè)內(nèi)所有的服務(wù)。發(fā)現(xiàn)服務(wù)后系統(tǒng)會(huì)回調(diào)下面的方法:
發(fā)現(xiàn)服務(wù)后,調(diào)用 [peripheral discoverCharacteristics:nil forService:service]; 去發(fā)現(xiàn)服務(wù)中包含的特征。和上面幾個(gè)方法一樣,第一個(gè)參數(shù)用于發(fā)現(xiàn)指定的特征。為nil時(shí),表示發(fā)現(xiàn)服務(wù)的所有特征。
當(dāng)掃描到寫入特征時(shí),保存,用于寫入數(shù)據(jù)。
寫入數(shù)據(jù),我們只需要調(diào)用方法
這里的 self.peripheral 就是連接的外設(shè), self.characteristicInfo 就是之前保存的寫入特征;這里最好使用 CBCharacteristicPropertyWrite 特征,并且 type 選擇 CBCharacteristicWriteWithResponse 。當(dāng)寫入數(shù)據(jù)成功后,系統(tǒng)會(huì)通過下面這個(gè)方法通知我們:
由于藍(lán)牙設(shè)備每次可寫入的數(shù)據(jù)量是有限制的,因此,我們需要將之前拼接的打印數(shù)據(jù)進(jìn)行拆分,分批發(fā)送給打印機(jī)
這里的 MAX_CHARACTERISTIC_VALUE_SIZE 是個(gè)宏定義,表示每次發(fā)送的數(shù)據(jù)長度,經(jīng)筆者測試,當(dāng) MAX_CHARACTERISTIC_VALUE_SIZE = 20 時(shí),打印文字是正常速度。但打印圖片的速度非常慢, 應(yīng)該在硬件允許的范圍內(nèi),每次發(fā)盡量多的數(shù)據(jù)。 不同品牌型號(hào)的打印機(jī),這個(gè)參數(shù)是不同的,筆者的藍(lán)牙打印機(jī)該值最多到140。超出后會(huì)出現(xiàn)無法打印問題。 最后筆者將該值定為 MAX_CHARACTERISTIC_VALUE_SIZE = 120 ,測試了公司幾臺(tái)打印機(jī)都沒有問題。
另外iOS9以后增加了方法 maximumWriteValueLengthForType: 可以獲取寫入特診的最大寫入數(shù)據(jù)量,但經(jīng)筆者測試,對(duì)于部分打印機(jī)(比如我們公司的)是不準(zhǔn)確的,因此,不要太依賴此方法,最好還是自己取一個(gè)合適的值。
注意:每個(gè)打印機(jī)都有一個(gè)緩沖區(qū),緩沖區(qū)的大小視品牌型號(hào)有所不同。打印機(jī)的打印速度有限,如果我們瞬間發(fā)送大量的數(shù)據(jù)給打印機(jī),會(huì)造成打印機(jī)緩沖區(qū)滿。緩沖區(qū)滿后,如繼續(xù)寫入,可能會(huì)出現(xiàn)數(shù)據(jù)丟失,打印亂碼。
這里使用 CocoaAsyncSocket 開源框架,與打印機(jī)進(jìn)行 Socket 連接。 CocoaAsyncSocket 中主要包含兩個(gè)類:
這里我們只用到 GCDAsyncSocket ,因此只需要將 GCDAsyncSocket.h 和 GCDAsyncSocket.m 兩個(gè)文件導(dǎo)入項(xiàng)目。
注意:手機(jī)和打印機(jī)必須在同一局域網(wǎng)下,設(shè)置到打印機(jī)的host和port。
連接成功后會(huì)通過代理回調(diào)
Timeout為負(fù),表示不設(shè)置超時(shí)時(shí)間。這里的data就是 上一篇 中拼接的打印數(shù)據(jù)。
寫入完成后回調(diào)
斷開連接有以下幾種方法
連接斷開后回調(diào)
讀取到數(shù)據(jù)會(huì)回調(diào)
網(wǎng)口打印機(jī)一般都支持狀態(tài)查詢,查詢指令如下:
可以通過 上一篇 介紹指令拼接方法,查詢打印機(jī)的狀態(tài)。
本篇只是簡單介紹了,通過藍(lán)牙和Socket連接打印機(jī)的方法。雖然可以初步完成連接和打印,但是,在真正的項(xiàng)目中使用還是遠(yuǎn)遠(yuǎn)不夠的。這里還有很多情況需要考慮,比如連接斷開、打印機(jī)異常、打印機(jī)緩沖區(qū)滿、打印機(jī)缺紙等。我們可以針對(duì)自身的業(yè)務(wù)情況,進(jìn)行相應(yīng)的處理。
Core Bluetooth Programming Guide
Getting the pixel data from a CGImage object
Core Bluetooth Programming Guide
你可能這App Store中搜到過很多AI相機(jī)App,提供各種AI變臉特效,這些功能都是怎樣實(shí)現(xiàn)的呢?我們自己能不能開發(fā)一款相近功能的App呢?
出于這樣的想法,就有了“魔法相機(jī)”這個(gè)開源項(xiàng)目。接下來的一段時(shí)間里,我會(huì)不斷更新這個(gè)系列文章,和大家分享開發(fā)過程和各種技術(shù)細(xì)節(jié),希望能對(duì)大家有幫助。
魔法相機(jī)是一款基于SwiftUI和CoreML開發(fā)的 iOS AI 相機(jī)應(yīng)用,實(shí)現(xiàn)了下列功能:
項(xiàng)目地址: william0wang/MagicCamera (github.com)
首先,計(jì)劃未來一段時(shí)間,把開發(fā)過程中的心得和各種技術(shù)細(xì)節(jié)通過文章分享給大家,希望對(duì)大家能用幫助。
在功能方面,當(dāng)前已經(jīng)實(shí)現(xiàn)了AI相機(jī)App最流行的拍照功能。后續(xù)計(jì)劃會(huì)增加更多視頻相關(guān)功能,例如視頻變臉等。
為了更好理解使用用tabbar和切換視圖,我們創(chuàng)建一個(gè)Empty Application。
1、 打開Xcode ,新建項(xiàng)目
2、 創(chuàng)建View Controller
在項(xiàng)目上按花鍵+N創(chuàng)建新文件,創(chuàng)建 Objective-C class 文件,按Next按鈕,subClass 選UIViewController 。勾選上xib選項(xiàng)
以同樣方式創(chuàng)建另外三個(gè)ViewController ,RedViewController ,GreyViewController,YellowViewController。四個(gè)View準(zhǔn)備好了。那么Tabbar呢?
3、 創(chuàng)建TabBarController.xib文件,選擇創(chuàng)建Empty文件
這時(shí)候你發(fā)現(xiàn)創(chuàng)建的xib文件是空白的,不用慌,去右下角控件欄中把TabBar Controller拖過來就Ok了。
4、 關(guān)聯(lián)TabBarController.xib ,tabbarAppDelegate這兩個(gè)文件
在上圖中選擇File’s Owner,打開Identity Inspector,在Class一欄選擇tabbarAppDelegate
這樣,我們就可以創(chuàng)建TabBarController.xib 文件指向tabbarAppDelegate 文件的Outlet映射了。
5、 在Xcode中的工具欄的View菜單找到 打開Assistant Editor,使tabbarAppDelegate.h和TabBarController.xib 同時(shí)打開。
在xib文件上按住control鍵,往tabbarAppDelegate.h,創(chuàng)建Outlet.
彈出窗口輸入 rootController,點(diǎn)connect。
6、 添加代碼
打開tabbarAppDelegate.m,在didFinishLaunchingWithOptions方法中添加代碼:
1.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
2. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
3. // Override point for customization after application launch.
4. [[NSBundle mainBundle] loadNibNamed:@"TabBarController" owner:self options:nil];
5. [self.window addSubview:self.rootController.view];
6. self.window.backgroundColor = [UIColor whiteColor];
7. [self.window makeKeyAndVisible];
8. return YES;
7、 往TabBarController.xib上添加Tab Bar Item,
把控件欄上的Tab Bar Item控件往TabBarController.xib上拖拽即可,一個(gè)放4個(gè)。
8 、關(guān)聯(lián)Tab Bar Item和***ViewController。
選擇其中一個(gè)Tab Bar Item,在右上角打開Identity Inspector,在Class中選擇BlueViewController:
然后,打開Attribute,在NIB Name選擇BlueViewController:
其他3個(gè)tab item重復(fù)類似的操作,選中對(duì)應(yīng)的ViewController,這樣在切換Tab標(biāo)簽時(shí),就可以切換到對(duì)應(yīng)的頁面。
9、 設(shè)置tab item的屬性
選中其中一個(gè)tab item ,會(huì)在右上角的屬性欄里看到如下信息
Badge是紅色圈圈里面有數(shù)字 ,表示有多少條信息的屬性
Identifier 是tab item的樣式,選custom是自定義,下面的是系統(tǒng)的樣式。我選了其中四種。
bar ITem 的title image在custom的樣式下能設(shè)置。
10 、剩下的3個(gè)Tab Item也做類似的設(shè)置即可。
現(xiàn)在基本完工,運(yùn)行看看結(jié)果如何。好吧,其實(shí)和第一第二個(gè)圖是一樣的`,這里就不放了。
11 、在viewDidLoad方法加Log觀察切換View
可以加寫日志看看對(duì)應(yīng)的View是什么時(shí)候運(yùn)行的。第一個(gè)運(yùn)行的View是BlueViewController,點(diǎn)擊其他的tab項(xiàng)時(shí),加載其他的view,加載一次之后下次點(diǎn)擊不再調(diào)用viewDidLoad。
1.- (void)viewDidLoad
2. [super viewDidLoad];
3. NSLog(@"BlueViewController");
4. // Do any additional setup after loading the view from its nib.
開發(fā)一個(gè)簡單的apple app要多少錢?
根據(jù)2020年1月的最新數(shù)據(jù),開發(fā)一個(gè)app大概需要幾萬到幾百萬不等。
互聯(lián)網(wǎng)是個(gè)神奇的大網(wǎng),大數(shù)據(jù)開發(fā)和軟件定制也是一種模式,這里提供最詳細(xì)的報(bào)價(jià),如果你真的想做,可以來這里,這個(gè)手機(jī)的開始數(shù)字是一伍扒中間的是壹壹三三最后的是泗柒泗泗,按照順序組合起來就可以找到,我想說的是,除非你想做或者了解這方面的內(nèi)容,如果只是湊熱鬧的話,就不要來了。
開發(fā)一個(gè)安卓app軟件,需要考慮因素很多。如果是一款功能簡單不是很全面,客戶幾乎沒有什么要求的APP,只需要讓美工對(duì)前臺(tái)ui頁面進(jìn)行一定程度的修改,最短一兩天就能完成的,費(fèi)用大致需要幾千元。
而開發(fā)一個(gè)完整的安卓app,簡單的需要幾萬左右,復(fù)雜的幾十上百萬,安卓難度不比IOS大,很多團(tuán)隊(duì)都可以承包。
擴(kuò)展資料:
軟件維護(hù)
1、安裝App后沒有用的安裝包apk及時(shí)刪除
手機(jī)和個(gè)人計(jì)算機(jī)有很大的相似之處,在維護(hù)方法方面很多是相通的?,F(xiàn)在許多經(jīng)過手機(jī)廠商改進(jìn)過的ROM都十分貼心,一般安裝完某個(gè)App后會(huì)提醒是否刪除安裝包,如果沒有其他用途了就可以立即刪除,如果手機(jī)沒有此項(xiàng)功能,也可手動(dòng)刪除。
2、定期清理緩存
長期使用社交應(yīng)用會(huì)產(chǎn)生非常多的緩存,而且應(yīng)用自己不會(huì)刪除,長時(shí)間會(huì)積累許多的緩存,占用存儲(chǔ)空間且造成卡頓,因此,可以使用手機(jī)設(shè)置里的應(yīng)用程序管理里的清除緩存功能刪除。還可以使用有清理垃圾功能的系統(tǒng)維護(hù)App。也可以卸載后重裝一次。
3、使用時(shí)及時(shí)關(guān)閉不用的程序
雖然安卓系統(tǒng)會(huì)在內(nèi)存緊張時(shí)自動(dòng)結(jié)束一些進(jìn)程,但在實(shí)際的應(yīng)用中,應(yīng)該有未雨綢繆的意識(shí),平時(shí)就隨手在多任務(wù)切換界面結(jié)束當(dāng)前用不到的App,釋放手機(jī)當(dāng)時(shí)的運(yùn)行內(nèi)存,不僅有利于手機(jī)高效的運(yùn)轉(zhuǎn),也防止其后臺(tái)軟件運(yùn)行時(shí)的流量白白流失。
入職新公司,項(xiàng)目完全從頭開始,所以現(xiàn)在整理總結(jié)一下項(xiàng)目的創(chuàng)建實(shí)現(xiàn)過程,之后跟著這個(gè)APP隨時(shí)記錄遇到的問題。
首先有一份可行的商業(yè)計(jì)劃書:在計(jì)劃書里應(yīng)明確規(guī)劃出產(chǎn)品定位(包含市場背景、用戶定位、已有的競品狀態(tài)、產(chǎn)品賣點(diǎn))。
在計(jì)劃通過的情況下對(duì)需求進(jìn)行整理:可以用腦圖根據(jù)用戶需求、當(dāng)前存在的痛點(diǎn)整理出核心功能,通過流程圖對(duì)功能列表進(jìn)行完善,需求和流程都走通的情況下,產(chǎn)品經(jīng)理再去畫原型圖。
此時(shí),作為技術(shù)的重點(diǎn)來了……
此時(shí)項(xiàng)目初始需求和配置基本已經(jīng)完成,接下來就是漫長的頁面開發(fā)和功能實(shí)現(xiàn)了~
名稱欄目:ios開發(fā)小項(xiàng)目,ios開發(fā)小項(xiàng)目亮點(diǎn)
文章分享:http://jinyejixie.com/article10/dsdiggo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站制作、品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)