2018-01-10 15:24:56 iosWorker 阅读数 769

直接上代码+截图
(http://img.blog.csdn.net/20180110151849217?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaW9zV29ya2Vy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
相机+相册权限 及其描述

iOS11之后:默认开启访问相册权限(读权限),无需用户授权,无需添加NSPhotoLibraryUsageDescription,适配iOS11之前的还是需要加的。 添加图片到相册(写权限),需要用户授权,需要添加 NSPhotoLibraryAddUsageDescription。

NSPhotoLibraryAddUsageDescription 是否允许此APP保存图片到相册?

2017-10-24 22:15:06 jiadabin 阅读数 566

还没有开始适配之前,就已经听身边的程序猿伙伴在为iPhone X的刘海和HomeBar的存在而纷纷吐槽了。说的我都有些怕怕,胆子小,哈哈哈。下面针对在整理过程中发现的适配注意点进行简单总结。


一、iOS11


1、iOS11新增版本判断API


2、MJRefresh上拉刷新死循环


3、访问相册权限变更


4、UITableView相关适配


二、iPhone X


1、iPhone X尺寸


2、iPhone X上下显示黑条问题


3、导航栏适配


4、安全区域问题


5、上传警告问题


1.1、iOS11新增版本判断API


iOS11版本现在有了简单的API,OC也开始支持swfit的@available语法,就可以不用再手写判断iOS版本了。


if (@available(iOS 11.0, *)) {


// 版本适配


}


1.2、MJRefresh上拉刷新死循环


self.tableView.estimatedRowHeight=150.0f;


150这个数值是你cell的平均高度,如果estimatedRowHeight设置非常小,MJRefresh的KVO会监听错误的contentoffset,造成不停进行上拉加载操作。


1.3、访问相册权限变更


www.jianshu.com/p/cd0f814a7ce9


1.4、UITableView相关适配


www.jianshu.com/p/73394f7518c8


2.1、iPhone X尺寸




2.2、iPhone X上下显示黑条问题


运行Xcode9.0的iPhoneX模拟器, APP在iPhoneX屏幕没填充满,上下有黑色区域,这是因为app之前未用LaunchScreen.Storyboard作为启动页面,可以使用LaunchScreen来当做入场页面,这样APP才会自动适配为iPhoneX的大小。我的项目中是用Assets中的LaunchImage, 这样就可以修改Assets中的LaunchImage,添加iPhoneX的Launch图(1125*2436)


适配启动页入口


2.3、导航栏适配


导航栏新增了一种大标题样式,默认设置是不开启,所以不需要修改。


iOS 11以前,导航栏的高度是64,其中状态栏statusBar的高度是20,底部tabbar的高度是49。


iOS 11之后,iPhoneX的导航栏的高度是88,其中状态栏的statusBar的高度变成了44, 底部的tabbar变成了83。


iPhoneX的底部增加了虚拟Home区,由于安全区域的原因默认tabBar的高度由49变为83,增高了34,所以自定义的底部TabBar也需要需改其适配方案。


目前我们项目没有自定义底部TabBar, 则先不考虑吧, 先来考虑关于navi 在 iPhone X 上是88的问题.


目前没发现有iPhoneX的机型判断API,建议使用size来做代替判断。


#definekStatusBarHeight[[UIApplicationsharedApplication] statusBarFrame].size.height


#define kNavBarHeight 44.0


#define kTabBarHeight ([[UIApplication sharedApplication] statusBarFrame].size.height>20?83:49)//tabBar高


#define kTopHeight(kStatusBarHeight + kNavBarHeight)//导航栏高


//判断iPhoneX


#define isiPhone (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)


#defineiPhoneX[[UIScreenmainScreen] bounds].size.width >= 375.0f && [[UIScreen mainScreen] bounds].size.height >= 812.0f && isiPhone


2.4、安全区域问题


iOS 11之前, 

automaticallyAdjustsScrollViewInsets经常被设置成NO,由开发者去控制处理留白和坐标问题, 但是11+automaticallyAdjustsScrollViewInsets = NO这句代码失效。


iOS 11后,

把这个automaticallyAdjustsScrollViewInsets废弃,新增了contentInsetAdjustmentBehavior,这个属性是个枚举类型值,我们只需要把其设置成never就行了


解决tableView偏移88的问题,  我们可以对对 tableView 进行如下设置:


if (@available(iOS 11.0, *)) {


self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;


} else {


self.automaticallyAdjustsScrollViewInsets = NO;


}


2.5、上传警告问题


打好ipa包之后,收到苹果方的邮件是下面这个样子的。




更新适配版本时 iPhone X 的启动图适配加上了, 千万别忘了也要传 Icon. 否则就会有上传版本时会有提示警告滴~




9月份上传的时候, 没有1024*1024的营销图标只是有警告, 现在上传的时候也是有警告的, 只不过现在提交审核的时候直接不能提交审核!

2019-04-13 19:27:20 ios8988 阅读数 196

iOS逆向-day1:逆向内容的简介与越狱环境搭建

1、SSH与OpenSSH简介

2、Mac远程登录到iPhone

3、iOS下的2个常用账户:root、mobile

4、SSL和OpenSSL

5、建立安全连接与服务器公钥的保存和变更

6SSH-客户端认证

7、SSH-远程拷贝-文件权限

8、22端口

9、通过USB进行SSH登录

10、usbmuxd-使用

11、利用sh脚本设置快捷方式

12、Mac连接iPhone终端的中文乱码问题

一、SSH与OpenSSH简介

1.1、SSH简介

  • SSH 是 Secure Shell 的缩写,意为“安全外壳协议”,是一种可以为远程登录提供安全保障的协议

  • 使用SSH,可以把所有传输的数据进行加密,“中间人”攻击方式就不可能实现,能防止DNS欺骗和IP欺骗

image.png

提示:sniffer 是嗅探器以及抓数据包软件

1.2、OpenSSH简介

  • OpenSSH 是 SSH 协议的免费开源实现

  • 可以通过OpenSSH的方式让Mac远程登录到iPhone

二、Mac远程登录到iPhone

2.1、Mac远程登录到iPhone的简介

我们经常在Mac的终端上,通过敲一些命令行来完成一些操作

image.png

Mac的终端

  • iOS和Mac OS X都是基于Darwin(苹果的一个基于Unix的开源系统内核),所以iOS中同样支持终端的命令行操作(在逆向工程中,我们经常会通过命令行来操纵iPhone)

  • 为了能够让Mac终端中的命令行能作用在iPhone上,我们得让Mac和iPhone建立连接

image.png

Mac终端中的命令行能作用在iPhone图

2.2、Mac使用OpenSSH远程登录iphone的前提

在iPhone上通过Cydia安装OpenSSH工具(软件源http://apt.saurik.com)

image.png

OpenSSH

OpenSSH的具体使用步骤可以查看Description中的描述

image.png

OpenSSH的具体使用步骤可以查看Description中的描述

2.3、使用OpenSSH远程登录 的 使用步骤 – (Mac充当客户端,iPhone充当服务器)

  • 、SSH是通过TCP协议通信,所以要确保Mac和iPhone在同一局域网下,比如连接着同一个WiFi

  • 、在Mac的终端输入ssh 账户名@服务器主机地址,如下是以root权限登录的,其中的 192.168.3.73是手机的IP地址,这里的服务器是手机

ssh root@192.168.3.73

手机的IP地址的查看方式,要和电脑在同一个WiFi下

image.png

手机的IP地址的查看方式

、初始密码 alpine

image.png

初始密码 `alpine`

image.png

登录成功

image.png

登录成功过后的测试

  • 、登录成功后就可以使用终端命令行操作iPhone,如:退出登录命令是exit,也可以使用快捷键:control+d

三、iOS下的2个常用账户:root、mobile (初始登录密码都是alpine)

image.png

root、mobile

3.1、root:最高权限账户,$HOME是 /var/root

提示:$HOME是 登录用户的路径,查看方式如下

image.png

$HOME是 登录用户的路径,查看方式如下

3.2、mobile:普通权限账户,只能操作一些普通文件,不能操作系统级别的文件,$HOME是 /var/mobile

3.3、修改一下root和mobile用户的登录密码(登录root账户后,分别通过passwd、passwd mobile完成),使用root用户登录,登录成功后命令如下

image.png

修改一下root和mobile用户的登录密码

四、SSL和OpenSSL

分析:我们在安装 OpenSSH的时候可以看到先安装的是OpenSSL

image.png

安装 OpenSSH的时候可以看到先安装的是OpenSSL

4.1、SSL:Secure Sockets Layer的缩写,是为网络通信提供安全及数据完整性的一种安全协议,在传输层对网络连接进行加密

4.2、OpenSSL:SSL的开源实现;绝大部分HTTPS请求等价于:HTTP + OpenSSL

提示1:OpenSSH的加密就是通过OpenSSL完成的

image.png

OpenSSH的加密就是通过OpenSSL完成的

五、建立安全连接

5.1、SSH的版本

SSH协议一共2个版本:SSH-1 与 SSH-2(现在用的比较多的是SSH-2,客户端和服务端版本要保持一致才能通信)

查看SSH版本(查看配置文件的Protocol字段)

  • 客户端:/etc/ssh/ssh_config

  • 服务端:/etc/ssh/sshd_config

  • 举例:以电脑作为客户端与越狱手机作为服务器查看各自对应的SSH版本

    • 电脑作为客户端查看SSH版本

      image.png

      电脑作为客户端查看SSH版本

      image.png

      可以看到SSH的版本是2:Protocol 2

    • 越狱手机作为服务器端查看SSH版本

image.png

越狱手机作为客户端查看SSH版本

5.2、SSH的通信过程可以分为3大主要阶段:建立安全连接、客户端认证、数据传输

5.3、建立安全连接

、在建立安全连接过程中,服务器会提供自己的身份证明(也就是公钥)

image.png

建立安全连接

  • 提示:~/.ssh/known_hosts路径下存储 服务器的公钥等其他的信息,在第一次存储后,第二次客户端再登录服务器就不再需要验证身份

  • 如果客户端并无服务器端的公钥信息,就会询问是否连接此服务器,如下图:我们在第一次登录的时候一般都会提示

image.png

没有保存公钥的提示

、解释下:在建立安全链接的过程中,~/.ssh/known_hosts所保存的服务器公钥以及其他信息,也就是上图中的:字符串 (把服务器发过来的公钥利用加密计算出来的一个字符串)

、服务器身份信息变更(也就是同一个服务器,但是服务器的公钥发生了变化,也可以说本地的存储的公钥与服务器的不一样),解决办法:删除掉同一个 IP 的信息,下面以 IP:192.168.3.73 为例

image.png

  • (1)、cd ~/.ssh

  • (2)、vim know_hosts

  • (3)、让光标停留在192.168.3.73行,按 dd 即可删除

  • (4)、esc,shift+;,wq输入回车键 保存推出;

  • (5)、再次进行连接服务器ssh root@192.168.3.73;

  • (6)、重新提示要不要连接

提示:快捷方式:ssh-keygen -R 服务器IP地址,如和上面一样的效果:ssh-keygen -R 192.168.3.73

、验证客户端存储的 公钥 与 服务器的公钥是否一致

image.png

验证客户端存储的 公钥 与 服务器的公钥是否一致

六、SSH-客户端认证

6.1、SSH-2 提供了2种常用的客户端认证方式

第一种(我们在 五 用到的密码登录):基于密码的客户端认证(使用账号和密码即可认证)

第二种:基于密钥的客户端认证 (免密码认证,最安全的一种认证方式)

提示:SSH-2 默认会优先尝试 “密钥认证”,如果认证失败,才会尝试 “密码认证”

6.2、搭建 SSH – 基于密钥的客户端认证(也就是可以省略密码登录的过程)

image.png

搭建 SSH – 基于密钥的客户端认证的过程

首先要在客户端生成公钥与私钥,然后把公钥传给服务器,将公钥内容追加到授权文件尾部,在登录验证的时候,服务器发送一个登录信息过来,使用私钥进行解密或者其他的操作(不仅仅是这些操作,后面都会阐述),解密成功的话进行登录

、在客户端生成一对相关联的密钥(Key Pair):一个公钥(Public Key),一个私钥(Private Key)

  • ssh-keygen

  • 一路敲回车键(Enter)即可

  • OpenSSH默认生成的是RSA密钥,可以通过-t参数指定密钥类型

  • 生成的公钥:~/.ssh/id_rsa.pub

  • 生成的私钥:~/.ssh/id_rsa

image.png

公钥与私钥

、把客户端的公钥内容追加到服务器的授权文件(~/.ssh/authorized_keys)尾部

  • ssh-copy-id root@服务器主机地址

  • 需要输入root用户的登录密码

  • ssh-copy-id会将客户端~/.ssh/id_rsa.pub的内容自动追加到服务器的~/.ssh/authorized_keys尾部

image.png

把客户端的公钥内容追加到服务器的授权文件

  • 注意:由于是在~文件夹下操作,所以上述操作仅仅是解决了root用户的登录问题(不会影响mobile用户),也就是root用户再使用 ssh root@IP地址 不再需要密码,而mobile用户是需要密码的

image.png

root用户登录不再需要密码

七、SSH-远程拷贝-文件权限(这里以上面 六 基于密钥的客户端认证的手动操作)

7.1、可以使用 ssh-copy-id 将客户端的公钥内容自动追加到服务器的授权文件尾部,也可以手动操作,复制客户端的公钥到服务器某路径

scp ~/.ssh/id_rsa.pub root@服务器主机地址:~
  • scp是secure copy的缩写,是基于SSH登录进行安全的远程文件拷贝命令,把一个文件copy到远程另外一台主机上

  • 上面的命令行将客户端的~/.ssh/id_rsa.pub拷贝到了服务器的~/.ssh/地址

具体的细节

  • SSH登录服务器:ssh root@服务器主机地址

  • 在服务器创建.ssh文件夹: mkdir .ssh

  • 追加公钥内容到授权文件尾部:cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

  • 删除公钥:rm ~/id_rsa.pub

提示: ~ 指的是用户目录,登录的是root的话就是:/var/root

7.2、如果上面的操作都做完了还是无法基于密钥的客户端认证(也可以说免密登录),那就是和权限有关的问题了,设置下下面的权限

image.png

设置下下面的权限

chmod 755 ~chmod 755 ~/.sshchmod 644 ~/.ssh/authorized_keys

八、22端口

8.1、端口:就是设备对外提供服务的窗口,每个端口都有个端口号(范围是0~65535,共2^16个)

8.2、有些端口号是保留的,已经规定了用途,比如

  • 21端口提供FTP服务

  • 80端口提供HTTP服务

  • 22端口提供SSH服务(可以查看/etc/ssh/sshd_config的Port字段)

  • 更多保留端口号

8.3、iPhone默认是使用22端口进行SSH通信,采用的是TCP协议

image.png

iPhone默认是使用22端口进行SSH通信,采用的是TCP协议

image.png

iPhone默认是使用22端口进行SSH通信

cat /etc/ssh/sshd_config

九、通过USB进行SSH登录

9.1、使用USB进行SSH登录的原因是:在上面

我们是通过同一个WIFI的情况下进行的SSH登录,在终端操作的时候可以感觉到输入内容很慢,这个时候我们可以可以使用USB进行SSH登录

9.2、默认情况下,由于SSH走的是TCP协议,Mac是通过网络连接的方式SSH登录到iPhone,要求iPhone连接WiFi

image.png

iPhone默认是使用22端口进行SSH通信,采用的是TCP协议

9.3、为了加快传输速度,也可以通过USB连接的方式进行SSH登录,Mac上有个服务程序 usbmuxd(它会开机自动启动),可以将Mac的数据通过USB传输到iPhone

usbmuxd的路径在:/System/Library/PrivateFrameworks/MobileDevice.framework/Resources/usbmuxd

image.png

usbmuxd的路径

image.png

通过USB连接的方式进行SSH登录

十、usbmuxd 的使用

10.1、下载usbmuxd工具包(下载v1.0.8版本,主要用到里面的2个python脚本:tcprelay.py与usbmux.py)

image.png

tcprelay.py 与 usbmux.py

10.2、将iPhone的 22 端口(SSH端口)映射到Mac本地的 10010 端口(不一定非是10010端口,只要不是保留端口就好),做完下面的操作我们会发现再终端操作不会卡了

image.png

提示:映射窗口不要关闭,在SSH登录的时候 新开窗口操作,保持至少两个窗口,因为可能 连接 多个手机的 22 端口

  • 端口映射完毕后,以后如果想跟iPhone的22端口通信,直接跟Mac本地的10010端口通信就可以了

ssh root@localhost -p 10010ssh root@127.0.0.1 -p 10010
  • localhost 是一个域名,指向的IP地址是 127.0.0.1,本机虚拟网卡的IP地址

  • usbmuxd会将Mac本地10010端口的TCP协议数据,通过USB连接转发到iPhone的22端口

10.3、远程拷贝文件也可以直接跟Mac本地的10010端口通信

scp -P 10010 ~/Desktop/1.txt root@localhost:~/test

将Mac上的~/Desktop/1.txt文件,拷贝到iPhone上的~/test路径

image.png

scp的端口号参数是大写的 -P

提示:注意:scp的端口号参数是大写的 -P

十一、利用 sh 脚本设置快捷方式

11.1、我们可以将经常执行的一系列终端命令行放到sh脚本文件中(shell),然后执行脚本文件,举例如下

、usb.sh脚本的举例:我们在使用 USB连接用户的iPhone的时候,每次都要执行 10.1中 tcprelay.py 这个脚本,我们可以把 tcprelay.py 存到一个固定位置,比如说我把它存在了桌面的 Jailbreak 文件夹,路径就成为了 /Users/wangchong/Desktop/Jailbreak/tcprelay.py,我们在 将iPhone的 22 端口(SSH端口)映射到Mac本地的 10010 端口就变成为如下的命令

python /Users/wangchong/Desktop/Jailbreak/tcprelay.py

但是我们每次再映射的时候都要执行上面的命令,为了解决每次的麻烦,我们可以使用 sh脚本,比如我在用户目录下创建一个 usb.sh 脚本文件,把上面的路径复制进去,如下

image.png

usb.sh 脚本文件

当我们再次执行映射的时候可以直接如下操作

sh usb.sh

image.png

执行脚本

、login.sh脚本的举例:同样创建一个  login.sh 文件里面写入要执行登录的脚本文件:ssh root@localhost -p 10010,执行脚本如下

sh login.sh

、总结:我们在每次映射和登录iPhone连接的时候可以执行下面的两个脚本命令,但是要是在两个窗口,先映射后登录

sh usb.shsh login.sh

11.2、扩展:我们在执行脚本的时候不仅仅使用 sh,还有bash、source命令来执行sh脚本文件

sh、bash

  • 当前shell环境会启动一个子进程来执行脚本文件,执行后返回到父进程的shell环境

  • 执行cd时,在子进程中会进入到cd的目录,但是在父进程中环境并没有改变,也就是说目录没有改变

source

  • 在当前的shell环境下执行脚本文件

  • 执行cd后会跳转到cd的目录

  • source 可以用一个点”.”来替代,比如”. test.sh”

11.3、source 与 sh、bash的区别

source执行的脚本如果是执行 cd 路径的时候,执行后 会 显示路径

image.png

sh、bash 执行的脚本如果是执行 cd 路径的时候,执行后 不会 显示路径

image.png

十二、Mac连接iPhone终端的中文乱码问题

12.1、默认情况下,iOS终端不支持中文输入和显示,解决方案:新建一个~/.inputrc文件,文件内容是

不将中文字符转化为转义序列

set convert-meta off 允许向终端输出中文set output-meta on允许向终端输入中文set meta-flag on set input-meta on

image.png

提示:如果是想在终端编辑文件内容,可以通过Cydia安装一个vim 

image.png

vim软件

12.2、做完上面操作后的效果如下

image.png

作者:IIronMan

交流群昵称:ios-Swift/Object C开发上架
交流群号: 869685378   找ios马甲包开发者合作,有兴趣请添加Q 51259559

2018-03-05 09:59:00 weixin_30725315 阅读数 13

手机升到iOS 11后  发现之前正常的图片保存功能无法正常使用  会闪退

经测试发现应该是权限没有开启的原因  但是NSPhotoLibraryUsageDescription已经写入plist  且在iOS 11之前的手机系统上是正常的

通过查阅资料得知

OS11之后:默认开启访问相册权限(读权限),无需用户授权,无需添加NSPhotoLibraryUsageDescription,适配iOS11之前的还是需要加的。 添加图片到相册(写权限),需要用户授权,需要添加NSPhotoLibraryAddUsageDescription
 
<key>NSPhotoLibraryUsageDescription</key>

<string>是否允许此APP使用相册?</string>


<key>NSPhotoLibraryAddUsageDescription</key>

<string>是否允许此APP保存图片到相册?</string>

 

转载于:https://www.cnblogs.com/gaoxiaoniu/p/8507476.html

2017-10-20 11:34:00 weixin_30905133 阅读数 68

http://www.jianshu.com/p/c03a87e4ca87

 

大家都知道访问相册需要申请用户权限。 相册权限需要在info.plist—Property List文件中添加NSPhotoLibraryUsageDescription键值对,描述文字不能为空。 iOS11之前:访问相册和存储照片到相册(读写权限),需要用户授权,需要添加NSPhotoLibraryUsageDescription。
iOS11之后:默认开启访问相册权限(读权限),无需用户授权,无需添加NSPhotoLibraryUsageDescription,适配iOS11之前的还是需要加的。 添加图片到相册(写权限),需要用户授权,需要添加NSPhotoLibraryAddUsageDescription

总结:iOS11之后如果需要写入权限需要添加
NSPhotoLibraryAddUsageDescription字段。  
   NSPhotoLibraryUsageDescription:
Property List:
   Privacy - Photo Library Usage Description
Source Code:
  NSPhotoLibraryUsageDescription
是否允许此APP使用相册?
   NSPhotoLibraryAddUsageDescription :
Property List:
   Privacy - Photo Library Additions Usage Description
Source Code:
   NSPhotoLibraryAddUsageDescription
是否允许此APP保存图片到相册?

苹果官方文档说明:

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW73

NSPhotoLibraryAddUsageDescription

NSPhotoLibraryAddUsageDescription (String - iOS) This key lets you describe the reason your app seeks write-only access to the user’s photo library. When the system prompts the user to allow access, this string is displayed as part of the alert.

Important: To protect user privacy, an iOS app linked on or after iOS 10.0, and that accesses the user’s photo library, must statically declare the intent to do so. Include the NSPhotoLibraryAddUsageDescription key (in apps that link on or after iOS 11) or NSPhotoLibraryUsageDescription key in your app’s Info.plist file and provide a purpose string for the key. If your app attempts to access the user’s photo library without a corresponding purpose string, your app exits.

 

This key is supported in iOS 11.0 and later.

NSPhotoLibraryUsageDescription

NSPhotoLibraryUsageDescription (String - iOS) This key lets you describe the reason your app accesses the user’s photo library. When the system prompts the user to allow access, this string is displayed as part of the alert.

Although this keys governs read and write access to the user’s photo library, it’s best to use NSPhotoLibraryAddUsageDescription if your app needs only to add assets to the library and does not need to read any assets.

Important: To protect user privacy, an iOS app linked on or after iOS 10.0, and that accesses the user’s photo library, must statically declare the intent to do so. Include the NSPhotoLibraryUsageDescription key in your app’s Info.plist file and provide a purpose string for this key. If your app attempts to access the user’s photo library without a corresponding purpose string, your app exits.

 

This key is supported in iOS 6.0 and later.

 



作者:小孩仔
链接:http://www.jianshu.com/p/c03a87e4ca87
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/huangzizhu/p/7698648.html

7.0适配

阅读数 168

没有更多推荐了,返回首页