iOS - 权限、二维码、crash、热更新的技术调研

一、权限

1.info.plist 中可以请求的权限

  • 蓝牙 - NSBluetoothPeripheralUsageDescription / Bluetooth Peripheral Usage Description
  • 麦克风 - NSMicrophoneUsageDescription / Microphone Usage Description
  • 媒体资料库 - NSAppleMusicUsageDescription / Media Library Usage Description
  • 定位 - NSLocationUsageDescription / Location Usage Description(iOS 6~iOS 7 使用,iOS 8 以后废弃)
  • 使用时请求定位 - NSLocationWhenInUseUsageDescription / Location When In Use Usage Description(iOS 8 以后使用)
  • 一直获取定位 - NSLocationAlwaysUsageDescription / Location Always Usage Description(iOS 8 ~ iOS 10 使用)
  • 一直获取定位 - NSLocationAlwaysAndWhenInUseUsageDescription / Location Always and When In Usage Description(iOS 11 使用)
  • 相机 - NSCameraUsageDescription / Camera Usage Description
  • 访问相册 - NSPhotoLibraryUsageDescription / Photo Library Usage Description
  • 添加相册照片 - NSPhotoLibraryAddUsageDescription / Photo Libarary Additions Usage Description
  • 通讯录 - NSContactsUsageDescription / Contacts Usage Description
  • 日历 - NSCalendarsUsageDescription / Calendars Usage Description
  • 提醒事项 - NSRemindersUsageDescription / Remiders Usage Description
  • 音乐 - kTCCServiceMediaLibrary / Music Usage Description
  • Face ID - NSFaceIDUsageDescription / Face ID Usage Description
  • 语音识别 - NSSpeechRecognitionUsageDescription / Speech Recognition Usage Description
  • Siri - NSSiriUsageDescription / Siri Usage Description
  • NFC - NFCReaderUsageDescription / NFC Scan Usage Description
  • HomeKit - NSHomeKitUsageDescription / HomeKit Usage Description
  • 运动与健康 - NSMotionUsageDescription / Motion Usage Description
  • 健康更新 - NSHealthUpdateUsageDescription / Health Update Usage Description
  • 健康分享 - Health Share Usage Description / NSHealthShareUsageDescription
  • 电视供应商使用权限 - NSVideoSubscriberAccountUsageDescription / TV Provider Usage Description

2.其他

  • 联网

导入#import <CoreTelephony/CTCellularData.h>//网络权限
说明:只能获取首次进入APP是否允许蜂窝网络权限,其实也可以不判断

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- (void)getNetworkPermissions:(void (^)(BOOL))completion {
CTCellularData *cellularData = [[CTCellularData alloc] init];
CTCellularDataRestrictedState authState = cellularData.restrictedState;
if (authState == kCTCellularDataRestrictedStateUnknown) {
cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state){
if (state == kCTCellularDataNotRestricted) {
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) {
completion(YES);
}
});
}else{
dispatch_async(dispatch_get_main_queue(), ^{
[self createAlertWithMessage:@"无线数据"];
if (completion) {
completion(NO);
}
});
}
};
} else if (authState == kCTCellularDataNotRestricted){
if (completion) {
completion(YES);
}
} else {
[self createAlertWithMessage:@"无线数据"];
if (completion) {
completion(NO);
}
}
}
  • 推送通知

本地通知(UILocalNotification) 、远程通知(APNs)

Objective-C
1
2
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound  categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];

3.提高 APP 获取系统权限的通过率。

  • 在绝对必要的情况下才向用户请求权限,例如:用户访问照片库时请求访问系统相册权限;
  • 在展示系统权限的对话框前,先向用户显示自定义的对话框,若用户选择不允许,默认无操作,若用户选择允许,再展示系统对话框。
  • 在用户打开APP时就向用户请求权限;
  • 告知用户授权权限后能够获得好处之后,再向用户请求权限;

二、二维码第三方库调研

1.ZXingObjC(OC)

Star 数:2,752
最近一次更新时间:3 天以前
谷歌搜索词条结果:9,820
百度搜索词条结果:1,560,000
是否也支持 Swift:是
是否有中文文档:否

简介:ZXingObjC 是 ZXing(“Zebra Crossing”)的 Objective-C 版本,ZXing 是一个 Java 条形码图像处理库。它主要用于 iOS 设备和 Mac 应用程序实现二维码功能。

编码和解码目前支持以下条形码:

  • UPC-A and UPC-E
  • EAN-8 and EAN-13
  • Code 39
  • Code 93
  • Code 128
  • ITF
  • Codabar
  • RSS-14 (all variants)
  • QR Code
  • Data Matrix
  • Maxicode
  • Aztec (‘beta’ quality)
  • PDF 417 (‘beta’ quality)
    ZXingObjC 目前具有与 ZXing 版本 3.3.3 相同的功能。

2.LBXScan

Star 数:2,565
最近一次更新时间:3 月以前
谷歌搜索词条结果:7,550
百度搜索词条结果:23,500
是否也支持 Swift:是
是否有中文文档:是

简介:
(1)iOS扫码封装

  • 扫码识别封装: 系统API(AVFoundation)、ZXing、ZBar
  • 扫码界面效果封装
  • 二维码、条形码
  • 相册获取图片后识别

(2)设置参数自定义效果

  • 扫码框周围区域背景色可设置
  • 扫码框颜色可也设置
  • 扫码框4个角的颜色可设置、大小可设置
  • 可设置只识别扫码框内的图像区域
  • 可设置扫码成功后,获取当前图片
  • 动画效果选择: 线条上下移动、网格形式移动、中间线条不移动(一般扫码条形码的效果)

(3)模仿其他app(通过设置参数即可完成)

  • 模仿QQ扫码界面
  • 支付宝扫码框效果
  • 微信扫码框效果

3.SGQRCode

Star 数:1,101
最近一次更新时间:6 天以前
谷歌搜索词条结果:1,860
百度搜索词条结果:86
是否也支持 Swift:是
是否有中文文档:是

简介:
生成二维码
扫描二维码
从相册中读取二维码
根据光线强弱开启手电筒
扫描成功之后界面之间逻辑跳转处理
扫描界面可自定义(线扫描条样式以及网格样式)
扫描界面仿微信(请根据项目需求,自行布局或调整)

4.swiftScan
Star 数:1,000
最近一次更新时间:2 月以前
谷歌搜索词条结果:4,560
百度搜索词条结果:70,000
是否有中文文档:是

简介:
(1)swift封装系统自带扫码及识别图片功能

  • 扫码界面效果封装
  • 二维码和条形码识别及生成
  • 相册获取图片后识别(测试效果不好…)

(2) 模仿其他app

  • 模仿QQ扫码界面
  • 支付宝扫码框效果
  • 微信扫码框效果

(3)其他设置参数自定义效果

  • 扫码框周围区域背景色可设置
  • 扫码框颜色可也设置
  • 扫码框4个角的颜色可设置、大小可设置
  • 可设置只识别扫码框内的图像区域
  • 可设置扫码成功后,获取当前图片
  • 根据扫码结果,截取码的部分图像(在模仿qq扫码界面,扫码成功后可看到)
  • 动画效果选择: 线条上下移动、网格形式移动、中间线条不移动(一般扫码条形码的效果).

总结:OC 二维码框架的框架,GitHub 靠前的只有这三个,其中 LBXScan 是封装了有 系统扫描,ZBar,ZXingObjC 等扫描库的第三方库,在使用上也可以避免臃肿的选择封装了其中一项的库引用,在界面上和 SGQRCode,主打高度模仿微信扫描界面的不相上下,可以支持微信、支付宝等、QQ 扫描界面的设置。所以推荐使用 LBXScan。而 swift 版的二维码框架,GitHub 上 Star 数量合格的只有一个,而且又是 LBXScan 同一个作者。所以 Swift 也推荐使用swiftScan

三、crash

为什么不使用官方的崩溃信息监控?

官方提供的崩溃信息并不是实时的,只能查看两天之前的崩溃信息。且需要用户设置,设置->隐私->诊断与用量->与应用开发者共享,为自动发送。才可有收到 Crash 信息。

1.Bugly

地址:http://bugly.qq.com/

提供:专业的Crash(崩溃)、Android ANR(application not response)、iOS卡顿监控和解决方案。发现用户在使用过程中出现的Crash(崩溃)、Android ANR和iOS卡顿,并根据上报的信息快速定位和解决问题。

费用:免费、且可以提供精确定位到某个用户的异常

2.友盟

地址:http://www.umeng.com/analytics

提供:友盟sdk(一个统计分析sdk)友盟统计分析工具,可以捕捉用户在使用应用程序过程中出现的异常退出(FC), 并在应用程序下次启动时将错误报告发送给服务器。
错误报告包含应用程序版本,操作系统版本和设备型号以及程序出现异常时的Stacktrace。

费用:免费。

3.Fabric(Crashlytics)

地址:https://get.fabric.io/
提供:
1、Crashlytics 不会漏掉任何应用崩溃信息。在发生崩溃后,用户再次进入 APP 并联网情况下,日志自动上传。
2、Crashlytics 可以象 Bug 管理工具那样,管理这些崩溃日志。例如:Crashlytics 会根据每种类型的 Crash 的出现频率以及影响的用户量来自动设置优先级。对于每种类型的 Crash,Crashlytics 除了会像一般的工具提供 Call Stack 外,还会显示更多相关的有助于诊断的信息,例如:设备是否越狱,当时的内存量,当时的 iOS 版本等。对于修复掉的 Crash 日志,可以在 Crashlytics 的后台将其关掉。
3、Crashlytics 可以每天和每周将崩溃信息汇总发到你的邮箱。
4、提供在线的报告,解释崩溃原因,甚至能给出是哪一行代码导致的崩溃。
费用:免费

其他还有一些 crash 服务: Testin(部分收费)、极光推送、TalkingData 的 crash 等

还有关于 crash 其他的技术:网易大白 App 运行时 Crash 自动防护

四、热更新

1.react-native

Star 数:71,567
最近一次更新时间:2 小时以前
谷歌搜索词条结果:148,000,000
百度搜索词条结果:10,600,000
是否也支持 Swift:是
是否有中文文档:否

简介:
facebook 出品。
适配 iOS 和 android 需要自己分别做修改。
React Native 和 Weex 都可以进行热更新,但都不能修改原生 OC 代码。
JSPatch、lua 配合 React Native 可以让一个原生 APP 时刻处于可扩展可修改的状态。

2.JSPatch

Star 数:10,692
最近一次更新时间:8 月以前
谷歌搜索词条结果:62,300
百度搜索词条结果:2,090,000
是否也支持 Swift:是
是否有中文文档:是

简介:
bugly 所包含的热更新核心也是采用 JSPatch 技术。
JSPatch 是一个开源项目(Github链接),只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。
理论上可以修改和新建所有的模块,但是不建议这样做。
建议用来做紧急的小需求和修复严重的线上 bug。

使用时需要接入 JSPatch 平台,官方给出以下解释:

若从苹果的审核规则来看,JSPatch 和 React Native 是一样的,但苹果接受 React Native,拒绝 JSPatch,主要是因为JSPatch 可以调用任意原生 API,出于安全和滥用方面的顾虑而拒绝,之前大量 APP 自行接入 JSPatch,导致有几个风险点:

  1. 无法保证每个 APP 接入方式都是安全的,容易传输过程被替换,被黑客中间人攻击,成为 iOS 上的一个漏洞。
  2. 一些像地图/推送类 SDK 接入 JSPatch 后覆盖大量 APP,若这些 SDK 后台被攻破,可以对这些 APP 下发恶意脚本,造成大面积危害。
  3. 开发者可以方便地不经过苹果审查使用 JSPatch 调用私有 API。
  4. 若大家还是通过一些混淆手段骗过苹果继续各自接入 JSPatch,出于上述三点考虑,苹果不可能再允许,但若接入 JSPatch 平台,上述三个问题可以帮苹果解决,不再有这类隐患,详见这里,苹果才会考虑允许继续使用。

3.DynamicCocoa

Star 数:1,204
最近一次更新时间:2 年以前
谷歌搜索词条结果:4,870
百度搜索词条结果:19,400
是否也支持 Swift:是
是否有中文文档:否

简介:
滴滴打车出品。

  • 使用原生技术栈:使用者完全不用接触到JS或任何中间代码,保持原生的 Objective-C 开发、调试方式不变;
  • 无需重写已有代码:已有 native 模块能很方便的变成动态化插件;
  • 语法支持完备性高:支持绝大多数日常开发中用到的语法,不用担心这不支持那不支持;
  • 支持 HotPatch:改完 bug 后直接从源码打出 patch,一站式解决动态化和热修复需求。

4.lua脚本

比如: wax。热更新时,从服务器拉去 lua 脚本。游戏开发经常用到。

5.Weex

跨平台,一套代码,iOS、Android 都可以运行。
weex 基于 vue.js,ReactNative 使用 React。
react 模板 JSX 有一定的学习成本,vue 和常用的 web 开发类似,模板是普通的 html,数据绑定用 mustache 风格,样式直接使用 css。
weex 是阿里开源的技术。

6.Hybrid

像 PhoneGap 之类的框架, 基本概念和 web 差不多, 通过更新 js/html 来实现动态化,没有原生的效果流畅。

7.动态库

可以做 demo 用,真实使用的时候会被苹果禁止。
因为 打包发到 AppStor e的 ipa 安装包 里的每个动态库 都有唯一的编码,iOS 系统会进行验证,所以动态通过网络获取 新的动态库 也用不了。

8.rollout.io

Rollout 紧急修复线上 bug。后端有相关的管理页面。因为是国外的网站,然后呢,要 FQ 才能使用。

------本文结束 感谢阅读------

本文地址:http://kaaaaai.cn/articles/050.html
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布
转载请注明出处,谢谢!

众筹项目:拯救世界!
0%