iOS越狱设备添加Entitlements授权
在iOS越狱设备上添加Entitlements授权
院里的一款用于网络测试的APP,在iOS8.3之前,可以通过引入CoreTelephony框架,调用其私有函数来获取信号强度,MCC、MNC等相关参数,但在iOS8.3之后,无法通过私有API进行获取,APP开发团队一直没解决,Boss找到我,让我研究一下,看有没有解决方案,遂开始研究。
首先,经过多方的调研,发现在iOS8.3 above的系统是有解决方案的,参见Stackoverflow,大概思路是需要添加Entitlements
授权,既在entitlements文件中添加如下的key,但是由于Apple 的CodeSign
的机制,导致无法添加私有的Entitlements
授权,所以需要绕过Apple的签名机制。
1 | <key>com.apple.CommCenter.fine-grained</key> |
绕过签名机制
一开始,使用ldid来进行签名,签名之后会导致app闪退,遂使用了另外一种方法,禁用codesign,采用伪证书的方式,接下来将详细列出步骤。
解决步骤
设备必须越狱,这是前提,且在Cydia中安装
AppSync Unified
插件(该插件需要添加软件源,地址为:http://cydia.angelxwind.net/)。Apple Developer的账号,免费的就行。
装完Xcode之后,执行如下命令,作用是禁用Xcode的CodeSign机制,然后允许进行AD_HOC签名。
1
2
3
4sudo defaults write /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/SDKSettings.plist DefaultProperties -dict-add CODE_SIGNING_REQUIRED -string NO
sudo defaults write /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/SDKSettings.plist DefaultProperties -dict-add ENTITLEMENTS_REQUIRED -string NO
sudo defaults write /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/SDKSettings.plist DefaultProperties -dict-add AD_HOC_CODE_SIGNING_ALLOWED -string YES
sudo chmod 644 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/SDKSettings.plist打开Xcode,进行完初始化之后,退出即可。
打开Mac上的钥匙串访问应用,点击菜单栏上的
钥匙串访问-证书助理-创建证书
,在弹出的框中的证书类型选择代码签名
,并勾选让我覆盖这些默认值
,然后一路往下走,完成后就创建了一个新的证书。在开发的项目中添加
Entitlements
文件,代码如下,其中,key为com.apple.CommCenter.fine-grained
的节点是我的项目需要添加的key,别的项目可忽略该键值,并添加自己需要的键值对:1
2
3
4
5
6
7
8
9
10
11
12
13
14<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>get-task-allow</key>
<true/>
<key>application-identifier</key>
<string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string>
<key>com.apple.CommCenter.fine-grained</key>
<array>
<string>spi</string>
</array>
</dict>
</plist>在项目
Build Settings
设置的Code Signing部分,将Code Signing Entitlements
设为Entilements文件名,然后将Code Signing Identity
设为Ad Hoc Code Sign
,如果项目包含多个target,则需要进行同样的设置。完成。
基本命令
- ldid授权命令:
ldid -Sentitlements.xml OTS_SDK_3.1.app/OTS_SDK_3.1
- ldid查看授权:
ldid -e OTS_SDK_3.1.app/OTS_SDK_3.1
- codesign查看权限:
codesign -d --entitlements - Example.app
参考
- http://stackoverflow.com/questions/13399659/get-cellid-mcc-mnc-lac-and-network-in-ios-5-1
- http://iphonedevwiki.net/index.php/Ldid
- http://stackoverflow.com/questions/14871748/how-do-i-change-my-ios-applications-entitlements/14885266#14885266
- https://angelxwind.net/?page/how2asu
- https://cydia.angelxwind.net/?page/net.angelxwind.appsyncunified
- http://stackoverflow.com/questions/12768109/how-to-use-ldid