UI界面


iOS 10 開(kāi)始對(duì)隱私權(quán)限更加嚴(yán)格, 如需使用隱私權(quán)限需要在工程的info.plist文件中聲明,如果不聲明程序在調(diào)用隱私權(quán)限(如相機(jī))時(shí)應(yīng)用程序會(huì)崩潰

離線(xiàn)打包用戶(hù)需要手動(dòng)添加權(quán)限到打包工程的info.plist文件中,只添加話(huà)筒就可以了 ..

key可從以下表中獲取,value為彈框提示文字用戶(hù)可隨意添加,類(lèi)型String
權(quán)限名稱(chēng)????????????????????????Key值
通訊錄????????????????????????????NSContactsUsageDescription
麥克風(fēng)????????????????????????????NSMicrophoneUsageDescription
相冊(cè)????????????????????????????????NSPhotoLibraryUsageDescription????????
相機(jī)????????????????????????????????NSCameraUsageDescription
添加圖片到相冊(cè) ? ? ? ????? NSPhotoLibraryAddUsageDescription
持續(xù)獲取地理位置 ? ? ? ? NSLocationAlwaysUsageDescription
使用時(shí)獲取地理位置 ? ? NSLocationWhenInUseUsageDescription
藍(lán)牙????????????????????????????????NSBluetoothPeripheralUsageDescription
語(yǔ)音轉(zhuǎn)文字????????????????????NSSpeechRecognitionUsageDescription
日歷????????????????????????????????NSCalendarsUsageDescription
蘋(píng)果最新的審核規(guī)范要求申請(qǐng)隱私權(quán)限彈框必須要詳細(xì)說(shuō)明獲取該權(quán)限的目的,配置時(shí)請(qǐng)?jiān)敿?xì)說(shuō)明應(yīng)用中使用該權(quán)限的目的
```
//
//? ViewController.m
//? 百度語(yǔ)音
//
//? Created by 裴鐸 on 2018/6/29.
//? Copyright ? 2018年 peiDuo. All rights reserved.
//
#import "ViewController.h"
#import "BDRecognizerViewController.h"
#import "BDRecognizerViewDelegate.h"
#import "BDVoiceRecognitionClient.h"
#import "QRCodeGenerator.h"
@interface ViewController ()
{
? ? //語(yǔ)音界面
? ? BDRecognizerViewController *bdrv;
? ? NSMutableData*allData;
? ? //參數(shù)設(shè)置 key 秘鑰
? ? BDRecognizerViewParamsObject *bdvp;
? ? UILabel*label;
? ? UIImageView *imgV;
}
@end
@implementation ViewController
- (void)viewDidLoad {
? ? [super viewDidLoad];
? ? BDTheme *me = [BDTheme lightGreenTheme];
? ? bdrv = [[BDRecognizerViewController alloc]initWithOrigin:CGPointMake(20, 180) withTheme:me];
? ? bdrv.enableFullScreenMode = YES;
? ? bdrv.delegate = self;
? ? bdvp = [[BDRecognizerViewParamsObject alloc]init];
? ? bdvp.apiKey = @"ANQLQINhgf2TL0gVP5xhNCxm";
? ? bdvp.secretKey = @"c3d5f5f8ac5478e87802431389b2cba7";
? ? // 創(chuàng)建圖片框
? ? imgV= [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2-100,380,200,200)];
? ? // 添加到主界面
? ? [self.view addSubview:imgV];
? ? //初始化label
? ? [self label];
}
- (void)label{
? ? //初始化label
? ? label = [[UILabel alloc]initWithFrame:CGRectMake(0, 44, self.view.frame.size.width, 100)];
? ? //添加到主視圖
? ? [self.view addSubview:label];
}
- (void)onRecordDataArrived:(NSData*)recordData sampleRate:(int)sampleRate{
? ? [allData appendData:recordData];
}
- (void)onPartialResults:(NSString*)results
{
? ? label.text= results;
}
- (IBAction)shibie:(id)sender {
? ? allData = [[NSMutableData alloc]init];
? ? [bdrv startWithParams:bdvp];
}
- (IBAction)clier:(id)sender {
? ? label.text=nil;
}
- (IBAction)sheng:(id)sender {
? ? // 生成二維碼
? ? UIImage *img = [QRCodeGenerator qrImageForString:label.text imageSize:imgV.frame.size.width];
? ? // 將生成的二維碼賦值給圖片框
? ? imgV.image= img;
}
- (void)didReceiveMemoryWarning {
? ? [super didReceiveMemoryWarning];
? ? // Dispose of any resources that can be recreated.
}
@end
```
錯(cuò)誤信息:unrecognized selector sent to instance
在編寫(xiě)程序的過(guò)程中,即使編譯通過(guò),但是在運(yùn)行的過(guò)程中,偶爾會(huì)有類(lèi)似 unrecognized selector sent to instance 的錯(cuò)誤。該錯(cuò)誤的意思是不能識(shí)別的實(shí)例方法,造成該錯(cuò)誤的原因可能是該實(shí)例的類(lèi)中并沒(méi)有定義要調(diào)用的方法,或者是在調(diào)用該方法前,這個(gè)實(shí)例所在的內(nèi)存空間被釋放而后分配給了其他類(lèi)的實(shí)例變量。
除此之外,在使用第三方靜態(tài)庫(kù)時(shí),也可能導(dǎo)致該問(wèn)題,這是由 OC 的動(dòng)態(tài)性與 UNIX 庫(kù)的靜態(tài)性造成的。對(duì)于 C 程序而言,當(dāng)源代碼經(jīng)過(guò)編譯器編譯后,會(huì)生成許多個(gè)目標(biāo)文件,目標(biāo)文件中可能使用了其他目標(biāo)文件中的類(lèi)及方法,便會(huì)在目標(biāo)文件中產(chǎn)生一個(gè)未定義的符號(hào),而之后,鏈接程序會(huì)根據(jù)這些未定義符號(hào)找到相應(yīng)的目標(biāo)文件,將需要的類(lèi)及方法鏈接到同一個(gè)文件中,這樣最終得到一個(gè)可以執(zhí)行的程序。為了減小執(zhí)行程序的大小,鏈接程序只會(huì)鏈接目標(biāo)文件中未定義的符號(hào),可是在 Objective-C 語(yǔ)言中,其方法是在方法被調(diào)用時(shí)才會(huì)確定,所以編譯程序只會(huì)確定一個(gè)目標(biāo)文件中未定義的類(lèi)符號(hào),而不去生成未定義的方法符號(hào),故而,編譯程序也不會(huì)將需要的方法鏈接到目標(biāo)文件中。
所以,在使用靜態(tài)庫(kù)中的分類(lèi)方法時(shí),因?yàn)槠漕?lèi)已經(jīng)定義過(guò)了,鏈接程序不會(huì)去進(jìn)行鏈接,最終程序在運(yùn)行的過(guò)程中,找不到分類(lèi)中的方法,導(dǎo)致了該錯(cuò)誤的發(fā)生。
為了避免該錯(cuò)誤,需要到 target -> Build Settings 中修改 Other Linker Flags 的值,將其設(shè)置為 -ObjC,該值意在將靜態(tài)庫(kù)中所有的Objective-C 類(lèi)和分類(lèi)都加載到最后的可執(zhí)行文件中。
另外,Other Linker Flags 還可以設(shè)置其他的值:
-all_load 會(huì)將庫(kù)中所有的的目標(biāo)文件都加入到可執(zhí)行文件中,這樣做會(huì)導(dǎo)致一個(gè)問(wèn)題,如果引用了兩個(gè)靜態(tài)庫(kù),而這兩個(gè)靜態(tài)庫(kù)恰好都引用了同一個(gè)第三發(fā)庫(kù),那么會(huì)報(bào)重復(fù)定義的錯(cuò)誤 duplicate symbol。
-force_load 該值與 -all_load 相同,只是其后面需要指定具體要全部加載的庫(kù)的路徑,而其他庫(kù)仍按需加載。