鸿蒙HarmonyOS 2.0与安卓/ios的区别

描述

近日,鸿蒙系统再受质疑,外媒表示:华为鸿蒙OS系统和安卓没区别。

外媒对此给出的理由是,尽管是搭载鸿蒙OS系统设备,若是连续几年不更新手机硬件,同样也会出现无法带动APP软件、不兼容、系统超负荷、越用越卡顿的情况。这也是安卓和苹果同样面临的问题,只不过在整体的体验感上,苹果表现的更好一点。

87382d2a7191c4344f2a72e470c2a0e9.png

安卓和ios都是大家比较熟悉的系统,鸿蒙作为新生代操作系统,一开始就不是应用在移动设备上面,主要针对物联网而开发的,所以会有质疑是毋庸置疑的。

鸿蒙系统的发布是由于美方的巨大压力而发布的无奈之举。鸿蒙系统是不同于安卓与苹果系统的,鸿蒙系统不仅仅可以应用在手机领域,在电器乃至汽车等智能领域都可以适用,并且互相之间可以使用鸿蒙系统作为媒介进行一体控制,实现“万物互联”。

鸿蒙与安卓的区别:

1、构建理念不同:谷歌的安卓系统主要出于移动终端以及智能电视、智能穿戴设备所考虑。华为的鸿蒙系统主要出于未来万物互联的角度,囊括了所有能够接入物联网的设备。并不仅仅局限于基于ARM架构的设备,甚至是基于X86或者其他更新架构的设备。

2、理念不同:导致系统复杂度、难易度不同,华为鸿蒙系统综合性要高于安卓系统。

3、资源获取的能力不同:华为的生态系统建设而困扰,物联网将会为华为带来大量的内容资源。短期内华为系统的生态建设将会被安卓系统所压制,毕竟两者不在同一个数量级。

华为宣布在4月24日的华为开发者大会上,鸿蒙系统正式进行发布推送,鸿蒙的发布,打破了安卓和苹果垄断局面,未来鸿蒙是否实现全球第三大操作系统,我们拭目以待。

[IOS]——模糊搜索的实现

模糊搜索的实现(支持拼音搜索,汉字搜索,首字母搜索)
搜索是要用到UISearchBar
我做出的UISearchBar的效果

UISearchBar的代码实现
1.//首先要遵守协议
@interface weiboViewController ()<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate>
2.//代码的实现
//搜索框
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@”sousuo”] style:0 target:self action:@selector(setUpsearch)];
_search = [[UISearchBar alloc] init];
//显示搜索框的cancel按钮
_search.showsCancelButton = YES;
//设置代理
_search.delegate = self;
//[UIApplication sharedApplication].statusBarFrame.size.height这是获取状态栏的高度
//self.navigationController.navigationBar.frame.size.height这是获取导航栏的高度
_search.frame = CGRectMake(0,[UIApplication sharedApplication].statusBarFrame.size.height+self.navigationController.navigationBar.frame.size.height-35, [UIScreen mainScreen].bounds.size.width, 35);
//把搜索框隐藏在navigationBar的后面
[self.navigationController.view insertSubview:_search belowSubview:self.navigationController.navigationBar];
//动画下拉搜索框的关键代码
//因为一开始搜索框是隐藏在navigationBar背后的,当时距离底部为35,那么我设置search下滑35就能完全地将search显示出来
[UIView animateWithDuration:1.0 animations:^{
self.search.transform = CGAffineTransformMakeTranslation(0, 35);
}];

 

重点来了!模糊搜索的实现(我已经将方法封装好,可以直接复制去测试!)
这是将搜索范围内的文本全部转成不带声调的拼音
//将汉字转变为拼音
– (NSString *)transformToPinyin:(NSString *)searchtext
{
//转成了可变字符串
NSMutableString *str = [NSMutableString stringWithString:searchtext];
//将汉字转变为拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
//再转换为不带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
//转变后的str每个字是旁边是有空格分开的
NSArray *pinyinArray = [str componentsSeparatedByString:@” “];
NSMutableString *allString = [NSMutableString new];
int count = 0;
//这是把汉字的拼音全部拼接起来
for (int i = 0; i < pinyinArray.count; i++)
{
for(int i = 0; i < pinyinArray.count;i++)
{
if (i == count) {
[allString appendString:@”#”];
//区分第几个字母
}
[allString appendFormat:@”%@”,pinyinArray[i]];
}
[allString appendString:@”,”];
count ++;
}
NSMutableString *initialStr = [NSMutableString new];
//这是把汉字的首字母拼接起来
for (NSString *s in pinyinArray)
{
if (s.length > 0)
{
[initialStr appendString: [s substringToIndex:1]];
}
}
[allString appendFormat:@”#%@”,initialStr];
[allString appendFormat:@”,#%@”,searchtext];
return allString;
}

由于上面方法是有局限性的,因为把搜索范围内的文本都转成的拼音都是小写的,因此我再提供一个方法来将你在搜索框输入的大写字母都转成小写字母
-(NSString *)changetoLower:(NSString *)str
{
for (NSInteger i=0; i<str.length; i++) {
if ([str characterAtIndex:i]>=’A’&&[str characterAtIndex:i]<=’Z’) {
char temp=[str characterAtIndex:i]+32;
NSRange range=NSMakeRange(i, 1);
str=[str stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@”%c”,temp]];
}
}
return str;
}

App跟踪透明度是什么意思

就在今天,苹果发布了iOS14.5/iPadOS14.5,正式带来“App跟踪透明度”功能。该功能可让用户选择是否允许App跟踪您在其他公司的App和网站上的活动,以便用于广告投放或与数据代理商共享。

 

在iOS14.5、iPadOS14.5和AppletvOS14.5中,App必须先请求权限,然后才能跟踪您在其他公司的App和网站上的活动。当App收集能够识别您身份或您设备的信息,并且将这类信息与归第三方所有的App、网站和其他位置上收集的同等信息相关联,从而用于定向广告投放或广告效果评估,或者与数据代理商共享这类收集的信息时,即发生了跟踪。

 

如果App要求跟踪您的活动:

 

App跟踪透明度是什么意思 App跟踪透明度是干嘛的

 

当您将设备升级到*新的iOS14.5版本,看到希望跟踪您活动的请求时,您可以轻点“允许”或“要求App不跟踪”。无论您是否允许App跟踪您的活动,都仍然可以使用对应App的全部功能。

 

App开发者可以自定所示信息的部分内容,向您说明App为什么要求跟踪您的活动。您还可以在AppStore上访问对应App的产品页面,以详细了解App开发者如何使用您的数据。

 

App跟踪透明度是什么意思 App跟踪透明度是干嘛的

 

如果您选取“要求App不跟踪”,对应的App开发者便无法访问系统广告标识符(IDFA),这个标识符通常用于跟踪。此外,对应的App也不能使用能识别您身份或您设备的其他信息(例如您的电子邮件地址)来跟踪您的活动。

 

管理活动跟踪权限:

 

您可以随时改变主意,为App授予或撤销活动跟踪权限:

 

1.前往“隐私”设置,查看已请求跟踪您活动的App列表。在iPhone、iPad或iPodtouch上,请前往“设置”-“隐私”-“跟踪”。

 

2.轻点来为特定App关闭或打开跟踪权限。

 

App跟踪透明度是什么意思 App跟踪透明度是干嘛的

 

如果您在隐私设置中关闭“允许App请求跟踪”,您将不再收到App希望跟踪您活动的提示。在关闭这项设置后,每当有App请求跟踪权限时,系统都会默认按照您轻点“要求App不跟踪”来处理。您还可以选择要求之前您允许的所有App停止跟踪您的活动。您也可以选择仅允许之前授予权限的App继续跟踪您的活动。

iOS 蓝牙设备名称缓存问题总结

1. 问题背景
当设备已经在 App 中连接成功后
修改设备名称
App 扫描到的设备名称仍然是之前的名称
App 代码中获取名称的方式为(perpheral.name)
2. 问题分析
当 APP 为中心连接其他的蓝牙设备时。

首次连接成功过后,iOS系统内会将该外设缓存记录下来。

下次重新搜索时,搜索到的蓝牙设备时,直接打印 (peripheral.name),得到的是之前缓存中的蓝牙名称。

如果此期间蓝牙设备更新了名称,(peripheral.name)这个参数并不会改变,所以需要换一种方式获取设备的名称,在广播数据包内有一个字段为 kCBAdvDataLocalName,可以实时获取当前设备名称。

3. 问题解决
下面给出OC 和 Swift 的解决方法:

OC

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{
NSString *localName = [advertisementData objectForKey:@”kCBAdvDataLocalName”];
}

Swift

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
let localName = advertisementData[“kCBAdvDataLocalName”]
}

iOS 平台 TestFlight 外部测试邀请码优化方案

1 背景

iOS 应用版本灰度测试是一个越来越令人头疼的一件事。

在 iOS9.0 之后,iOS 越狱设备越来越少,想要找到参与灰度测试的越狱用户越来越难。现在苹果企业签名的包外发控制越来越严格,这条路也很难走了。

因此,只能走苹果官方推荐的方式,通过 TestFlight 进行邀请测试。

关于 TestFlight 使用方法,已经有很多人总结过了,这里不赘述。比如:

iOS 平台如何使用 TestFlight 进行 Beta 测试

TestFlight 的测试分为“内部测试”和“外部测试”,“内部测试”能邀请的人数比较少,只有 25 人,适用于内部测试人员测试功能,“外部测试”可以邀请 2000 人,适用于发布正式版之前进行灰度测试。本文主要描述的是“外部测试”的方案。

 

2 TestFlight 标准流程

收集外部测试用户的邮箱(这个邮箱不一定是 Apple ID 邮箱)。

提交 TestFlight 测试版本,等待审核通过。

审核通过后,在 TestFlight 中导入灰度用户名单。

等待用户接收邀请测试的邮件,并预先到 AppStore 安装 TestFlight。

用户点击邮件中的 Start Testing 打开有“邀请码”的页面,复制 8 位大写英文字母的“邀请码”。。

用户打开 TestFlight(需要登录 Apple ID),点击下方的 Redeem ,将“邀请码”粘贴到输入框中,点击右上角的 Redeem ,即可开始下载测试的 App 。

流程中一个很重要的点是“邮箱”,这是苹果连接用户的唯一媒介。在现实中,收集用户邮箱不是一件很容易的事情,很难在短时间内联系到大量的用户,并提供邮箱,或者有些人很少打开邮箱,或者在手机上不方便打开邮箱。导致灰度测试效果不好,即使费时费力搜集了用户的邮箱,转化率也可能不高。

思考:有没有办法简化“邮箱”这一步呢?

3 TestFlight 优化流程

从上述流程中可知,邮箱不一定是 Apple ID 邮箱,只要能接受苹果发出的 TestFlight 的邮件就可以,用户收到邮件后,是通过点击邮件中的链接来获取到“邀请码”的,为这个优化留下了可能性。

优化目标:用户可以直接拿到“邀请码”,直接在 TestFlight 输入邀请码后下载 App。

3.1 准备 2000 个内部邮箱,用来接收 TestFlight 的邀请邮件

可以通过某些途径,在内部准备好 2000 个邮箱,什么 QQ邮箱、163邮箱、126邮箱、新浪邮箱、hotmail、gmail 等等一批免费邮箱,而且每个邮箱都还能设置几个不同名的账户,比如一个 QQ 号排除手机号之外就可以有 4 个邮箱名(123456@qq.com, xyz@qq.com, xyz@vip.qq.com, xyz@foxmail.com)。所以要准备 2000 个邮箱账号也不是特别难的事情。不过为了方便自动化,*好还是申请单独某个类型的邮箱好一点,后面会说到。

3.2 提取邀请邮件中的邀请链接

收到的“邀请邮件”中有个 Start Testing 的按钮,点击之后打开一个有“邀请码”的页面。

如果要一封一封邮件点开来查看邀请码,那确实也太费人力了,这里能否开发一个自动化工具来查看邮件呢?应该也不是特别难的事情,苹果的邮件格式基本上是固定的,这个自动化工具开发好之后是一劳永逸的事情。

Start Testing 打开的链接格式大概是这样的:

https://beta.itunes.apple.com/v1/invite/1ae8b3e5f47847d7a6a798222e2a2ef96fd24005bce24ff8a4de5bd41c5dc882460c5711?ct=TencentTechnologyShanghaiCoLtd&advp=10000&platform=ios

打开链接之后,Chrome 可以通过开发者工具查看页面元素,如此可以开发一个自动化提取“邀请码”的工具。

3.3 优化后的流程

提交 TestFlight 测试版本,等待审核通过。

审核通过后,在 TestFlight 中导入事先准备的 2000 个邮箱账号。

等待接收邀请测试的邮件,待接收到之后,通过自动化工具提取邀请链接,并保存。

通过自动化工具打开邀请链接提取“邀请码”。

将邀请码直接发放给灰度测试用户。

用户打开 TestFlight(需要登录 Apple ID),点击下方的 Redeem ,将“邀请码”粘贴到输入框中,点击右上角的 Redeem ,即可开始下载测试的 App 。

3.4 优化后的流程优点分析

免去了前期收集用户邮箱的困难,而且每次的版本灰度测试,每个 App 的版本灰度测试,都要做一遍这个事情,消耗大量的运营精力,而且效果可能还不是很好。

有时候可能不一定一开始就能收集到那么多的用户,可能是一批一批地邀请用户,也免去了每次去 iTunes Connect 添加邮箱的麻烦。

2000 个测试名额,可以*大化地利用,按需分配邀请码,而不是添加了一堆不参与测试的用户邮箱。

一套方案,可以多个项目使用,甚至可以推广至全公司。*终做出一个自动化的工具或框架,任意App可以接入,也不需要理解太多细节。

上面优化后的流程中的第 4 点,是打开邀请链接之后提取“邀请码”出来,*后直接分配“邀请码”给用户,但是这里有一个坑,“邀请码”只有两个小时有效期,如果我们把邀请码提取出来了,必须在两个小时之内,发放给用户,并且在 TestFlight 中激活使用,否则“邀请码”会过期。不过过期之后,重新打开邀请链接,会生成新的“邀请码”。

另一个方案是直接把“邀请链接”发放给用户,让用户在开始体验 App 时,点开链接提取“邀请码”。

这两种方案各有利弊,发放“邀请码”给用户的方式,减少用户的学习成本。而且可以更加*大化地利用测试名额,*次发放“邀请码”之后,如果两个小时之内用户没有使用。那么该邮箱的名额不会浪费,可以重新通过自动化工具提取“新的邀请码”,发放给第二批用户。

Ad_Hoc方式打包iOS应用程序

如果想要将做的iOS应用程序安装到自己的iOS设备上测试、或者安装到别人的iOS设备上,或者想发布到App Store中,先要给应用签名。签名就要有证书,这就需要申请证书的过程了。
把自己的应用程序安装到设备中,主要有一下几种方式:
1、 把iOS设备与电脑连接起来,如果Xcode中已经添加了包含这个设备的Profile文件且在工程中已经选择了该文件,那么在Xcode左上角便可以选择这个设备,之后点击RUN,程序就被安装在这个iOS设备中了。这个主要用于在真机上测试程序。
2、 使用Xcode将应用程序以Ad Hoc方式打包,到处ipa文件,然后用iTunes等工具将应用程序安装到iOS中。这种方式的Profile文件主要是Ad Hoc类型,并且包含制定的设备信息。导出的ipa也只能安装到制定的设备中。
3、将应用程序发布到App Store上,待苹果审核通过后,其他人就可以下载安装了。
本文主要讲第二种方法。
制作Profile文件需要经过“添加证书—添加App ID—添加设备—制作Profile文件”四个步骤,下面将分别进行介绍。

**

一、添加证书

%title插图%num

%title插图%num

%title插图%num

%title插图%num

**

接下来要制作一个CSR文件

首先打开钥匙串

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num
证书制作完成

**

二、添加App ID
**

%title插图%num

%title插图%num

%title插图%num

%title插图%num
**

三、添加设备
**

%title插图%num

%title插图%num

%title插图%num
**

四、制作Profile文件
**

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num
**

五、Ad_Hoc方式打包
**

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

%title插图%num

 

iOS 开发 入门:使用Ad Hoc 进行用户测试

在完成iOS开发,准备进行发布之前,我们都希望App能在周围的朋友之间先进行测试,提提意见,修改完善之后再发布到App Store上。Apple考虑到这一点,因此通过Ad Hoc来实现发布前的用户测试。从另一个角度讲也就是通过Ad Hoc 将未发布的App 给其他人提前免费使用。

关于Ad Hoc的使用其实很简单,在Apple Developer官网的页面上也有详细的介绍。首先要注意的是我们的App只能通过Ad Hoc分享给绑定我们账号的设备上,所以至是一百台。然后看一下官方说明的步骤。

Step 1:创建并下载一个iOS 发布证书。这个一般我们在创建iOS开发证书后都会顺便创建。
Step 2:创建并下载一个Ad Hoc Distribution Provisioning Profile ,就是Ad Hoc 发布配置文件。这个很好办,在网站中点击Provisioning选项,点击new profile创建,要填写的信息如下:
Distribution method

Ad Hoc

Profile name

<App_Name> User Testing Profile

App ID

Appropriate app ID for the app being tested

Devices

Tester’s device identifier

这些信息想必谁都会填,就是在Devices上选中要分享的设备。创建完之后下载。

Step 3:这一步其实就是在Xcode中创建我们的软件的App文件。具体一共算三步:

(1)打开Xcode;
(2)点击工具栏上的Product ->Archive,对App进行打包;
(3)在Organizer的Archives中就有你打包的App了,点击Distribute,选择 Ad Hoc,如下图

%title插图%num

之后保存,就得到.ipa 文件。

Step 4:这一步就是把ipa文件和配置文件通过各种方式发送给要测试的朋友的电脑上,打开itunes,将配置文件先拉进itunes,然后将ipa文件也拉进去,同步就OK了。

 

深度学习之在iOS上运行CNN

1 引言
作为曾经的iOS开发者,在研究深度学习的时候,总有一个想法就是在iPhone上运行深度学习,不管是在手机上训练还是利用训练好的数据进行测试。
因为iOS的开发环境支持C++,因此,只要你的代码是C/C++,本质上就可以在iOS上运行。
怎么才能更快更好地在iOS上运行CNN呢?

2 方法1:通过Matlab转码
Matlab自带转成c的工具,如果你研究过UFLDL的深度学习教程,就知道如何在Matlab上使用CNN,那么,转换成c后,放到iOS的开发环境中,然后将参数存成txt格式再读取分割,也就是可以实现。
如下图就是已经将matlab代码转换为c后导入的结果:

%title插图%num

打开predict.h文件,可以看到可以调用的接口:

/* Function Declarations */
extern real_T predict(const real_T Theta1[10025], const real_T Theta2[260], const real_T X[400]);
1
2
3
这是训练MNIST的一个神经网络,我这边用了测试手写数字的识别。

因此,接下来需要对图片进行处理,从而转换为x[400]的向量格式。

这个只要能读取图片的像素,进行转换就可以。可以考虑用opencv来实现。

%title插图%num
这里我的方法是在用手画出数字之后,将图片转换为20*20像素的图片,如右下角所示,再将右下角的图片转换为400的数组,输入predict得到的结果。

3 方法2:使用DeepBeliefSDK
https://github.com/jetpacapp/DeepBeliefSDK
这个是别人专门写的一个用于iOS的深度学习的SDK。可以使用,但是存在的问题就是如果要自己训练的话很受限制。

4 方法3:使用tinyCNN
https://github.com/nyanp/tiny-cnn
这个很不错,它对比Caffe,Theano等框架*大的特点就是不需要安装,只要能用C++ 11.然后里面的例子使用了boost库。因此,为了运行它,我们需要在xcode安装ios的boost库。

网上找到了一个编译好的boost库:
https://github.com/danoli3/ofxiOSBoost

导入boost库的方法非常简单:

In Xcode Build Settings for your project:

Add to Library Search Paths ( LIBRARY_SEARCH_PATHS ) $(SRCROOT)/../../../addons/ofxiOSBoost/libs/boost/lib/ios
Add to Header Search Paths ( HEADER_SEARCH_PATHS )
$(SRCROOT)/../../../addons/ofxiOSBoost/libs/boost/include
In the Target under Build Phases

Add to ‘Link Binary With Libraries’ the boost.a found in the ofxiOSBoost/libs/boost/lib/ios directory.
If not openFrameworks just add the libs/boost/include to Header Search Paths and the libs/boost/ios to Library Search Paths

那么具体在创建iOS应用的时候,这里使用作者提供的训练MNIST的例子,那么要注意在使用数据时,要更改路径:

NSString *trainLabels = [[NSBundle mainBundle] pathForResource:@”train-labels” ofType:@”idx1-ubyte”];
NSString *trainImages = [[NSBundle mainBundle] pathForResource:@”train-images” ofType:@”idx3-ubyte”];
NSString *t10kLabels = [[NSBundle mainBundle] pathForResource:@”t10k-labels” ofType:@”idx1-ubyte”];
NSString *t10kImages = [[NSBundle mainBundle] pathForResource:@”t10k-images” ofType:@”idx3-ubyte”];

parse_mnist_labels([trainLabels cStringUsingEncoding:NSUTF8StringEncoding], &train_labels);
parse_mnist_images([trainImages cStringUsingEncoding:NSUTF8StringEncoding], &train_images);
parse_mnist_labels([t10kLabels cStringUsingEncoding:NSUTF8StringEncoding], &test_labels);
parse_mnist_images([t10kImages cStringUsingEncoding:NSUTF8StringEncoding], &test_images);

基本上这样就可以运行开始训练了。

如果想在Mac上训练,同样需要安装boost库。这个只要在官网下载boost,我用的是1.58版本。然后在terminal中安装,cd到路径,然后./boostrap.sh 然后./b2 安装就可以。然后在xcode引入路径:

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

/Users/…/…/…/boost

The following directory should be added to linker library paths:

/Users/…/…/…/boost/stage/lib

路径初始为自己boost的文件夹地址。

4 小结
上面说了一些很方便的方法来实现在iOS下运行CNN。当然,我们更多需要就是进行图像的识别。相信大家自己测试会觉得很有趣。

iOS-EKEventEditViewController踩坑记录

一、EKEventEditViewController是什么?
EKEventEditViewController是添加日历事件的一个ViewController
通过设置event,然后push到这个VC 就展示出来这个事件的便捷页面。

%title插图%num

二、部分iOS系统上的问题

%title插图%num
stackoverflow上这个问题的解决方案

在iOS12.2.0–13.3beta版本中,这个问题一直存在,直到13.3beta苹果才修复了这个问题。

三、解决方案一,使用继承
stackoverflow上这个问题的解决方案

继承EKEventEditViewController这个类,在子类中进行修复。
原理就是在出现这个问题的iOS版本中,设置event的时候,先设置event.title = nil,将真正的title存放到变量中。
在viewWillAppear方法中把真正测title重新赋值给event.title ;
在viewDidAppear将键盘收起,这样就规避了苹果的这个bug。

四、解决方案二,使用分类
使用继承的方式解决这个问题会有个小问题,就是在点击取消按钮的时候,会发现actionsheet提示变成英文

%title插图%num

所以第二种解决方案是使用分类的方式,进行hook
在viewWillAppear方法中把真正测title重新赋值给event.title ;
在viewDidAppear将键盘收起。

iOS相机和麦克风是否可用监测

摄像头监测

//获取摄像设备
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//创建输入流
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (!input) {
UIAlertView *alerView = [[UIAlertView alloc]initWithTitle:@”无法使用相机” message:@”请在iPhone的\”设置-隐私-相机\”中允许访问相机” delegate:self cancelButtonTitle:@”确定” otherButtonTitles:nil, nil];
[alerView show];
return NO;
}

麦克风监测

if ([[[UIDevice currentDevice] systemVersion] compare:@”7.0″] != NSOrderedAscending)//系统大于等于7.0
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {
[audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {
if (!granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[[[UIAlertView alloc] initWithTitle:@”无法使用麦克风”
message:@”请在iPhone的\”设置-隐私-麦克风\”中允许访问麦克风”
delegate:self
cancelButtonTitle:@”确认”
otherButtonTitles:nil] show];
});
}
}];
}
}