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
2
3
4
<key>com.apple.CommCenter.fine-grained</key>
<array>
<string>spi</string>
</array>

绕过签名机制

一开始,使用ldid来进行签名,签名之后会导致app闪退,遂使用了另外一种方法,禁用codesign,采用伪证书的方式,接下来将详细列出步骤。

解决步骤

  1. 设备必须越狱,这是前提,且在Cydia中安装AppSync Unified插件(该插件需要添加软件源,地址为:http://cydia.angelxwind.net/)。

  2. Apple Developer的账号,免费的就行。

  3. 装完Xcode之后,执行如下命令,作用是禁用Xcode的CodeSign机制,然后允许进行AD_HOC签名。

    1
    2
    3
    4
    sudo 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
  4. 打开Xcode,进行完初始化之后,退出即可。

  5. 打开Mac上的钥匙串访问应用,点击菜单栏上的钥匙串访问-证书助理-创建证书,在弹出的框中的证书类型选择代码签名,并勾选让我覆盖这些默认值,然后一路往下走,完成后就创建了一个新的证书。

  6. 在开发的项目中添加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>
  7. 在项目Build Settings设置的Code Signing部分,将Code Signing Entitlements设为Entilements文件名,然后将Code Signing Identity设为Ad Hoc Code Sign,如果项目包含多个target,则需要进行同样的设置。

  8. 完成。

基本命令

  • 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

参考