總結(jié)一下藍(lán)牙開(kāi)發(fā)相關(guān)的知識(shí)點(diǎn)和注意事項(xiàng),做個(gè)筆記,也希望你們能少踩坑

成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、成都小程序開(kāi)發(fā)、集團(tuán)成都企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:iso認(rèn)證等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時(shí)也獲得了客戶的一致贊揚(yáng)!
(公司部分藍(lán)牙項(xiàng)目為混編項(xiàng)目,藍(lán)牙相關(guān)處理均采用了Objective-C,故本文????均采用OC,Swift處理相同)
藍(lán)牙4.0包含兩個(gè)藍(lán)牙標(biāo)準(zhǔn),它是一個(gè)是 雙模 的標(biāo)準(zhǔn),它包含 傳統(tǒng)藍(lán)牙部分(也稱經(jīng)典藍(lán)牙) 和 低功耗藍(lán)牙部分(BLE) , 二者適用于不同的應(yīng)用場(chǎng)景和應(yīng)用條件。他們的特點(diǎn)如下
所以藍(lán)牙4.0是集成了傳統(tǒng)藍(lán)牙和低功耗藍(lán)牙兩個(gè)標(biāo)準(zhǔn)的,并不只是低功耗藍(lán)牙
藍(lán)牙4.0支持兩種部署方式: 雙模式 和 單模式 ,雙模同時(shí)支持經(jīng)典藍(lán)牙和低功耗藍(lán)牙,而單模則只支持其中一種。
二者更多細(xì)節(jié)詳見(jiàn): 傳統(tǒng)藍(lán)牙和低功耗藍(lán)牙的區(qū)別
iOS中藍(lán)牙相關(guān)功能都封裝進(jìn)了 CoreBluetooth 類中,其中有幾個(gè)常見(jiàn)的參數(shù)和概念
具體API參考 CoreBluetooth藍(lán)牙開(kāi)發(fā)
保存到數(shù)組中的設(shè)備可通過(guò) UUID 來(lái)進(jìn)行區(qū)分。從 iOS7之后蘋(píng)果不提供外設(shè)的mac地址,外設(shè)的唯一標(biāo)識(shí)換成了由mac封裝加密后的UUID,需要注意的是不同的手機(jī)獲取同一個(gè)外設(shè)的UUID是不同的,所以在不同手機(jī)之間UUID不是唯一的,但在本機(jī)上可以作為唯一標(biāo)識(shí)(特殊情況手機(jī)刷機(jī)后也會(huì)改變UUID)。
如何獲取Mac地址
一般使用場(chǎng)景是根據(jù)Mac地址區(qū)分某個(gè)外設(shè)
注意點(diǎn):
寫(xiě)入數(shù)據(jù)時(shí)可能會(huì)遇到需要分包發(fā)送的情況,我們可以通過(guò)下面的API或許當(dāng)前特征支持的最大的單條寫(xiě)入長(zhǎng)度
maxLength 一般取決于藍(lán)牙模塊內(nèi)部接收 緩沖區(qū) 的大小,很多硬件設(shè)備這個(gè)緩沖區(qū)的大小是 20 字節(jié), 這個(gè)大小也和特征的寫(xiě)入權(quán)限有關(guān),像具有寫(xiě)入權(quán)限 withResponse 類的特征其大小一般為 512 字節(jié),當(dāng)然這些都是取決于設(shè)備測(cè)的設(shè)置;
當(dāng)我們單次發(fā)送的數(shù)據(jù)字節(jié)長(zhǎng)度大于 maxLength 時(shí),我們就需要采用分包的方式來(lái)發(fā)送數(shù)據(jù)了,
分包發(fā)送的邏輯類似于下面
這邊延時(shí)主要是設(shè)備側(cè)的接收模塊接收數(shù)據(jù)以及處理能力有限
外圍設(shè)備測(cè)和中心設(shè)備(大部分情況下是手機(jī))保持藍(lán)牙連接的狀態(tài)下,如果長(zhǎng)時(shí)間不產(chǎn)生交互,藍(lán)牙就會(huì)斷開(kāi),所以為了保持兩者持續(xù)的連接狀態(tài),需要做保活處理,也就是需要持續(xù)的發(fā)送心跳包(watchdog)。相應(yīng)的處理是使用一個(gè)定時(shí)器定時(shí)向設(shè)備側(cè)發(fā)送符合設(shè)備協(xié)議格式的心跳包。
斷開(kāi)連接很簡(jiǎn)單,只需要調(diào)用 [self.centralManager cancelPeripheralConnection:peripheral] 傳入需要斷開(kāi)連接的設(shè)備對(duì)象就行了。斷開(kāi)連接時(shí)會(huì)自動(dòng)調(diào)用 centralManager:didDisconnectPeripheral:error: 代理方法。
按照之前的慣例,當(dāng)error為nil時(shí)表示斷開(kāi)成功,error不為nil時(shí)斷開(kāi)失敗。這種理解是錯(cuò)誤的。
當(dāng)你調(diào)用 cancelPeripheralConnection: 方法(主動(dòng)斷開(kāi))斷開(kāi)連接時(shí)error為nil ; 沒(méi)有調(diào)用這個(gè)方法(異常斷開(kāi))而斷開(kāi)時(shí)error返回的是異常斷開(kāi)的原因。也可以理解為主動(dòng)調(diào)用斷開(kāi)連接方法一定會(huì)斷開(kāi)
接下來(lái)就是斷開(kāi)重連的問(wèn)題了,對(duì)藍(lán)牙功能進(jìn)行封裝時(shí)肯定少不了斷開(kāi)重連。首先斷開(kāi)時(shí)可通過(guò)上面的代理方法的error是否為nil判斷是否是異常斷開(kāi),一般情況下異常斷開(kāi)時(shí)是需要重連的
原因就是當(dāng)設(shè)備斷開(kāi)連接后 peripheral.services 為nil了,當(dāng)然 service.characteristics 也是nil,所以需要在斷開(kāi)連接時(shí)把保存這個(gè)設(shè)備對(duì)應(yīng)的服務(wù)和特征全部清除,然后在連接成功時(shí)重新過(guò)一遍發(fā)現(xiàn)服務(wù)和發(fā)現(xiàn)特征的流程就好了。
iOS7 開(kāi)始,Apple加入了Beacon圍欄檢測(cè)的API, ( iBeacon-維基百科 ), 其工作方式是,配備有低功耗藍(lán)牙(BLE)通信功能的設(shè)備使用 BLE 技術(shù)向周?chē)l(fā)送自己特有的 ID,接收到該 ID 的應(yīng)用軟件會(huì)根據(jù)該 ID 采取一些行動(dòng)。比如,在店鋪里設(shè)置 iBeacon 通信模塊的話,便可讓 iPhone 和 iPad 上運(yùn)行一資訊告知服務(wù)器,或者由服務(wù)器向顧客發(fā)送折扣券及進(jìn)店積分, 或者公司的手機(jī)打卡,只要手機(jī)靠近打卡器一定范圍,手機(jī)測(cè)就向打開(kāi)器發(fā)送打卡信息,從而自動(dòng)打卡。這種場(chǎng)景還有很多。 其中一個(gè)最重要的功能就是App的喚醒功能(殺死后也能喚醒)
舉一個(gè)我們的例子,我們的產(chǎn)品業(yè)務(wù)場(chǎng)景就是在進(jìn)入車(chē)輛以后,需要使用藍(lán)牙連接我們的后裝車(chē)載設(shè)備以采集車(chē)輛信息和駕駛行為行程等,這里有一個(gè)問(wèn)題就是在App被殺死的情況下如何喚醒App, 因?yàn)椴豢赡芤笥脩裘看味贾鲃?dòng)去打開(kāi)App,這樣體驗(yàn)太差。我們的做法是通過(guò)iBeacon,當(dāng)我們的車(chē)輛點(diǎn)火以后,設(shè)備測(cè)通電,發(fā)出 iBeacon廣播 ,App實(shí)現(xiàn)監(jiān)聽(tīng)iBeacon相關(guān)功能后就可以喚醒我們App,然后在相應(yīng)的回調(diào)的處理一些事情,比如通過(guò)藍(lán)牙連接設(shè)備。這里的前提條件是我們的硬件設(shè)備測(cè)包含iBeacon模塊,具有iBeacon功能,而且對(duì)iBeacon的廣播頻率也有一定的要求,長(zhǎng)了可能喚醒的功能會(huì)不穩(wěn)定,官方建議的好像是100ms,頻率超高越耗電,但可以讓手機(jī)或其它監(jiān)聽(tīng)設(shè)備越快地發(fā)現(xiàn)iBeacon。標(biāo)準(zhǔn)的BLE廣播距離是100m,這使Beacon在室內(nèi)位置跟蹤場(chǎng)景下的效果更理想。
關(guān)于iBeacon更多的使用及介紹請(qǐng)參考
蘋(píng)果核 - iOS端近場(chǎng)圍欄檢測(cè)(一) ——iBeacon
iBeacon技術(shù)初探
1、統(tǒng)一收鍵盤(pán)的方法
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
2、提示框
BBAlertView *alert = [[BBAlertView alloc] initWithStyle:BBAlertViewStyleDefault
Title:@"刪除訂單"
message:@"是否刪除訂單,"
customView:nil
delegate:self
cancelButtonTitle:L(@"取消")
otherButtonTitles:L(@"確認(rèn)")];
[alert setCancelBlock:^{
}];
[alert setConfirmBlock:^{
[self orderDidRemovePressDown:tempDic Index:index.section];
}];
[alert show];
3、圖片的自適應(yīng)功能
self.brandImage.contentMode = UIViewContentModeScaleAspectFit;
4、cocoaPods清除緩存問(wèn)題
$ sudo rm -fr ~/.cocoapods/repos/master
$ pod setup
5、設(shè)置顯示鍵盤(pán)的樣式
textView.keyboardType =UIKeyboardTypeDefault;
//設(shè)置鍵盤(pán)右下角為完成(中文輸入法下)
textView.returnKeyType=UIReturnKeyDone;
6、輸出當(dāng)前時(shí)間
NSDateFormatter * dateFormatter=[[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
NSLog(@"當(dāng)前毫秒時(shí)間1==%@",[dateFormatter stringFromDate:[NSDate date]]);
7、顯示兩秒然后消失
UILabel * lab=[[UILabel alloc]initWithFrame:CGRectMake(60,Main_Screen_Height-64-49-60, Main_Screen_Width-120, 50)];
lab.backgroundColor=[UIColor grayColor];
ViewRadius(lab, 20);
lab.textAlignment=NSTextAlignmentCenter;
lab.text=@"請(qǐng)先進(jìn)行實(shí)名制驗(yàn)證";
[self.view addSubview:lab];
[UILabel animateWithDuration:2 animations:^{
lab.alpha=0;
}completion:^(BOOL finished) {
[lab removeFromSuperview];
}];
8、設(shè)置placeholder屬性的大小和顏色
[_phoneFie setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
[_phoneFie setValue:[UIFont boldSystemFontOfSize:15] forKeyPath:@"_placeholderLabel.font"];
_phoneFie.returnKeyType=UIReturnKeyDone;
9、設(shè)置cell的交互完全不可以使用
//[cellTwo setUserInteractionEnabled:NO];
//設(shè)置cell不可以點(diǎn)擊,但是上面的子控件可以交互
cellTwo.selectionStyle=UITableViewCellSelectionStyleNone;
10、將textField的placeholder 屬性的字體向右邊移動(dòng)5
_field.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10*Width_375, _field.frame.size.height)];
_field.leftViewMode = UITextFieldViewModeAlways;
11、開(kāi)新線程使按鈕上的時(shí)間變化
-(void)startTime{
__block int timeout=60; //倒計(jì)時(shí)時(shí)間
UIButton * btn=(UIButton *)[self.view viewWithTag:1000];
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),1.0*NSEC_PER_SEC, 0); //每秒執(zhí)行
dispatch_source_set_event_handler(_timer, ^{
if(timeout=0){
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[btn setTitle:@"發(fā)送驗(yàn)證碼" forState:UIControlStateNormal];
btn.enabled = YES;
});
}else{
//? int minutes = timeout / 60;
int miao = timeout % 60;
if (miao==0) {
miao = 60;
}
NSString *strTime = [NSString stringWithFormat:@"%.2d", miao];
dispatch_async(dispatch_get_main_queue(), ^{
[btn setTitle:[NSString stringWithFormat:@"剩余%@秒",strTime] forState:UIControlStateNormal];
btn.enabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
}
12、隱藏TableView 中多余的行
UIView * view=[[UIView alloc]initWithFrame:CGRectZero];
[_tabelView setTableFooterView:view];
13、UIView添加背景圖片
UIImage * image=[UIImage imageNamed:@"friend750"];
headSeV.layer.contents=(id)image.CGImage;
14、UITableView取消選中狀態(tài)
[tableView deselectRowAtIndexPath:indexPath animated:YES];// 取消選中
15、帶屬性的字符串
NSFontAttributeName? 字體
NSParagraphStyleAttributeName? 段落格式
NSForegroundColorAttributeName? 字體顏色
NSBackgroundColorAttributeName? 背景顏色
NSStrikethroughStyleAttributeName 刪除線格式
NSUnderlineStyleAttributeName? ? ? 下劃線格式
NSStrokeColorAttributeName? ? ? ? 刪除線顏色
NSStrokeWidthAttributeName 刪除線寬度
NSShadowAttributeName? 陰影
1.? 使用實(shí)例
UILabel *testLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 320, 30)];
testLabel.backgroundColor = [UIColor lightGrayColor];
testLabel.textAlignment = NSTextAlignmentCenter;
NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:@"今天天氣不錯(cuò)呀"];
[AttributedStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:16.0]
range:NSMakeRange(2, 2)];
[AttributedStr addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(2, 2)];
testLabel.attributedText = AttributedStr;
[self.view addSubview:testLabel];
16、加大按鈕的點(diǎn)擊范圍
把UIButton的frame 設(shè)置的大一些,然后給UIButton設(shè)置一個(gè)小些的圖片
[tmpBtn setImageEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
// 注意這里不能用setBackgroundImage
[tmpBtn setImage:[UIImage imageNamed:@"testBtnImage"] forState:UIControlStateNormal];
17、//避免self的強(qiáng)引用
__weak ViewController *weakSelf = self;
18、//類別的創(chuàng)建
command +n ——Objective-C File———(File Type? 選擇是類別還是擴(kuò)展)———(Class? 選擇為哪個(gè)控件寫(xiě)類別)
19、修改UITableview 滾動(dòng)條顏色的方法
self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;
20、利用UIWebView顯示pdf文件
webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
[webView setDelegate:self];
[webView setScalesPageToFit:YES];
[webViewsetAutoresizingMask:UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight];
[webView setAllowsInlineMediaPlayback:YES];
[self.view addSubview:webView];
NSString *pdfPath = [[NSBundle mainBundle]pathForResource:@"ojc" ofType:@"pdf"];
NSURL *url = [NSURLfileURLWithPath:pdfPath];
NSURLRequest *request = [NSURLRequestrequestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:5];
[webView loadRequest:request];
21、將plist文件中的數(shù)據(jù)賦給數(shù)組
NSString *thePath = [[NSBundle mainBundle]pathForResource:@"States" ofType:@"plist"];
NSArray *array = [NSArrayarrayWithContentsOfFile:thePath];
22、隱藏狀態(tài)欄
[[UIApplication shareApplication]setStatusBarHidden: YES animated:NO];
23、給navigation? Bar? 設(shè)置title顏色
UIColor *whiteColor = [UIColor whiteColor];
NSDictionary *dic = [NSDictionary dictionaryWithObject:whiteColor forKey:NSForegroundColorAttributeName];
[self.navigationController.navigationBar setTitleTextAttributes:dic];
24、使用AirDrop 進(jìn)行分享
NSArray *array = @[@"test1", @"test2"];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:array applicationActivities:nil];
[self presentViewController:activityVC animated:YES
completion:^{
NSLog(@"Air");
}];
25、把tableview里面Cell的小對(duì)勾的顏色改成別的顏色
_mTableView.tintColor = [UIColor redColor];
26、UITableView去掉分割線
_tableView.separatorStyle = NO;
27、正則判斷手機(jī)號(hào)碼地址格式
- (BOOL)isMobileNumber:(NSString *)mobileNum {
//? ? 電信號(hào)段:133/153/180/181/189/177
//? ? 聯(lián)通號(hào)段:130/131/132/155/156/185/186/145/176
//? ? 移動(dòng)號(hào)段:134/135/136/137/138/139/150/151/152/157/158/159/182/183/184/187/188/147/178
//? ? 虛擬運(yùn)營(yíng)商:170
NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[06-8])\\d{8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
return [regextestmobile evaluateWithObject:mobileNum];
}
28、控制交易密碼位數(shù)
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if (textField.text.length =6){
[MBProgressHUD showMessage:@"密碼為6位" afterDelay:1.8];
return NO;
}
return YES;
}
29、判斷是不是空
if ([real_name isKindOfClass:[NSNull class]] ) {
return NO;}
30、點(diǎn)擊號(hào)碼撥打電話
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://400966220"]];
31、控制UITabbar的選擇哪一個(gè)
[self.tabBarController setSelectedIndex:1];
32、獲取當(dāng)前App的版本號(hào)
NSDictionary?*infoDictionary?=?[[NSBundle?mainBundle]?infoDictionary];
CFShow(infoDictionary);
//?app名稱
NSString?*app_Name?=?[infoDictionary?objectForKey:@"CFBundleDisplayName"];
//?app版本
NSString?*app_Version?=?[infoDictionary?objectForKey:@"CFBundleShortVersionString"];
//?app?build版本
NSString?*app_build?=?[infoDictionary?objectForKey:@"CFBundleVersion"];
33、蘋(píng)果app權(quán)限NSPhotoLibraryUsageDescriptionApp需要您的同意,才能訪問(wèn)相冊(cè)NSCameraUsageDescriptionApp需要您的同意,才能訪問(wèn)相機(jī)NSMicrophoneUsageDescriptionApp需要您的同意,才能訪問(wèn)麥克風(fēng)NSLocationUsageDescriptionApp需要您的同意,才能訪問(wèn)位置NSLocationWhenInUseUsageDescriptionApp需要您的同意,才能在使用期間訪問(wèn)位置NSLocationAlwaysUsageDescriptionApp需要您的同意,才能始終訪問(wèn)位置NSCalendarsUsageDescriptionApp需要您的同意,才能訪問(wèn)日歷NSRemindersUsageDescriptionApp需要您的同意,才能訪問(wèn)提醒事項(xiàng)NSMotionUsageDescriptionApp需要您的同意,才能訪問(wèn)運(yùn)動(dòng)與健身NSHealthUpdateUsageDescriptionApp需要您的同意,才能訪問(wèn)健康更新NSHealthShareUsageDescriptionApp需要您的同意,才能訪問(wèn)健康分享NSBluetoothPeripheralUsageDescriptionApp需要您的同意,才能訪問(wèn)藍(lán)牙NSAppleMusicUsageDescriptionApp需要您的同意,才能訪問(wèn)媒體資料庫(kù)
34、控件設(shè)置邊框
_describText.layer.borderColor = [[UIColor colorWithRed:215.0 / 255.0 green:215.0 / 255.0 blue:215.0 / 255.0 alpha:1] CGColor];
_describText.layer.borderWidth = 1.0;
_describText.layer.cornerRadius = 4.0;
_describText.clipsToBounds = YES;
35、//隱藏電池條的方法
-(BOOL)prefersStatusBarHidden{
return YES;
}
36、延時(shí)操作
[NSThread sleepForTimeInterval:2];
方法二:
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.5];
37、系統(tǒng)風(fēng)火輪:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; //隱藏
38、//didSelectRowAtIndexPath:方法里面找到當(dāng)前的Cell
AssessMentCell * cell = [tableView cellForRowAtIndexPath:indexPath];
39、navigation上返回按鈕的顏色以及返回按鈕后面文字去掉
//返回按鈕后邊文字去掉
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
forBarMetrics:UIBarMetricsDefault];
//設(shè)置左上角返回按鈕的顏色
self.navigationController.navigationBar.tintColor = UIColorFromRGB(0x666666);
40、lineBreakMode //設(shè)置文字過(guò)長(zhǎng)時(shí)的顯示格式
label.lineBreakMode = NSLineBreakByCharWrapping;以字符為顯示單位顯
示,后面部分省略不顯示。
label.lineBreakMode = NSLineBreakByClipping;剪切與文本寬度相同的內(nèi)
容長(zhǎng)度,后半部分被刪除。
label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字
以……方式省略,顯示尾部文字內(nèi)容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle;中間的內(nèi)容
以……方式省略,顯示頭尾的文字內(nèi)容。
label.lineBreakMode = NSLineBreakByTruncatingTail;結(jié)尾部分的內(nèi)容
以……方式省略,顯示頭的文字內(nèi)容。
label.lineBreakMode = NSLineBreakByWordWrapping;以單詞為顯示單位顯
示,后面部分省略不顯示。
創(chuàng)建文件夾TestBundle,并改名為T(mén)estBundle.bundle。然后再把資源文件放入該Bundle就可以了。
使用此方式的目的:可通過(guò)Xcode管理資源文件,且可多Target管理。
在 Build Settings 中修改 Base SDK 為 iOS
在 Build Settings 中修改 Versioning System 為 None
此處需要特別注意,一定要確認(rèn),如果設(shè)置不對(duì),會(huì)導(dǎo)致Bundle中包含了可執(zhí)行文件,會(huì)導(dǎo)致上架AppStore被拒。
在 Build Settings 中刪除 Installation Directory 后面對(duì)應(yīng)的路徑。
在 Build Settings 中刪除 Code Signing Identity 后面對(duì)應(yīng)的路徑。(先選擇Other,再刪除即可)
在 Build Settings 中設(shè)置 iOS Deployment Target 為 iOS9.0
一般情況下設(shè)置為最小的即可。
在 Build Settings 中設(shè)置 Skip Install 為 NO
在 Build Settings 中設(shè)置 COMBINE_HIDPI_IMAGES 為 NO
在 Info.plist 中刪除 Executable file
確認(rèn)生成的Bundle的 Info.plist , Bundle OS Type code 值是否為 BNDL ,如不是,手動(dòng)修改為 BNDL
網(wǎng)站名稱:ios開(kāi)發(fā)注意,ios注意事項(xiàng)
當(dāng)前地址:http://chinadenli.net/article37/dsgdssj.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站收錄、動(dòng)態(tài)網(wǎng)站、微信公眾號(hào)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)