我想在调试屏幕中查看构建信息.有没有办法在运行时检查这个?

我意识到我可以为构建或类似设置编译器标志,但是如果存在可以利用的现有方法,我想利用这一点.

解决方法

虽然我同意Abhi Beckert,运行时是错误的时间来做(使用预处理指令和构建设置!),我想澄清一些在前面的答案/评论的细节和猜测,并发光一些你的事情可以做.与我同在,这将是一个更长的答案…

有一堆数据可以在“构建信息”的通用伞下.这些事情的非详尽列表将包括:构建配置,代码签名身份,构建时间,构建日期,营销版本号,SCM版本号,SCM分支名称,配置配置文件组标识,配置配置文件过期,CI构建号.这个名单一直在继续.

假设您的问题目前狭窄地集中在获取有关构建iOS用户类型和配置配置文件的信息,那么我将不得不以非常坚定的“否”作为问题的答案:是否有在运行时检查[使用现有API方法构建信息]的方法?简而言之,这两个数据点在Xcode 4.6.x Build Settings或“CODE_SIGN_IDENTITY”中被称为“Code Signing Identity”,用于您的命令行构建设置爱好者.

在提出此问题的时候,您没有可以调用的单一的公共iOS API来获取有关当前正在运行的应用程序的代码签名类型的信息.这背后的可能原因很多,但下面是几个例子:

允许开发人员构建自己的构建方案并构建配置.这意味着我们可以有一个方案和一个构建配置,或一个方案和几十个构建配置,甚至每个配置数千个.自然地,可以为每个方案分配不同的构建配置,并且可以为每个配置分配不同的代码签名身份.您可能会猜到,开发人员或团队不需要太多的自定义来快速获得混乱.
>代码签名标识仅要求为当前应用程序标识符发出未过期的配置配置文件,其中包含用于对二进制文件进行签名的证书的公用密钥副本.对于在团队中工作的人员,您可能有一个配置配置文件,其中包含团队中开发人员的所有证书,或者您可以为仅包含其证书的团队中的每个开发人员设置单独的配置配置文件.这是开发人员如何选择构建应用程序的另一个变化点.
>开发人员可能会分享单一证书(tsk tsk),或者发行自己的证书…是的,你猜到了,更多的变化.

然后,这个假设的一站式API将需要在运行时访问所有的构建配置数据,证书和配置配置文件,以便能够解开在编译时应用的“有效”设置,并将所有数据减少到有限的字符串…只是为了开发人员诊断视图…通过任何想象力不是不可能的壮举,但是对于可忽略的开发人员利益而言,这样一个潜在的计算密集型操作肯定会在任何人的优先级列表中排名很低.鉴于其他选项(如编译时标志!)更可靠,更便宜的设置,并且从长远来看更易于维护,它将进一步降低优先级列表.

现在,关于“我可以在运行时能做到”的半潜伏问题吗?我会强调说“是的,你可以”.

如你所知,设备构建是唯一需要代码签名的构建.该过程的一部分在主包中创建一个名为“embedded.mobileprovision”的文件.这是您的应用程序的沙箱拥有的文件,因此您绝对有能力以编程方式打开:

[[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]

.mobileprovision文件是PCKS#7编码的,并且包含二进制和文本数据.您寻求的信息是嵌入在PCKS#7数据中的基于文本的plist.首先,使用OS X,我们来看看您的一个设备构建中的这些文本数据:

>右键单击您的构建设备.app包,然后选择“显示包内容”
>将embedded.mobileprovision文件复制到一个容易访问的地方.
>使用首选文本编辑器打开该文件.

您马上注意到有很多二进制数据,但您可以制作出部分文本数据.滚动到右边,你会看到plist风格的xml,只是在这个视图中看起来不是那么容易.我们可以使用OS X命令行工具以更有条理的方式查看这些数据:

>打开终端和’cd’到包含您的embedded.mobileprovision副本的文件夹.
>运行:security cms -D -i embedded.mobileprovision

这将显示plist xml到终端窗口,以便您以良好的标签格式进行阅读.如果您重复此过程进行Ad-Hoc构建,Dev构建和App Store构建,那么您将开始注意到本文中的键,表示各种类型的构建.对于使用“iPhone开发人员:…”证书签名的构建(或“Dev”按原始帖子列出的方式构建),请查找:

<key>get-task-allow</key>
<true/>

“get-task-allow”键是用来指示iOS的应用程序将允许调试器附加到它.在“iPhone开发人员”签名的二进制文件的情况下,这是有道理的 – 当将代码从Xcode推送到您的设备进行测试时,您通常需要在设备上进行调试.

“Ad-Hoc”和“App Store”之间的差异需要额外的检查.对于这两种类型的分发,这个相同的“get-task-allow”键将被设置为false:

<key>get-task-allow</key>
<false/>

然而,“Ad-Hoc”版本的“App Store”构建中没有定义的“ProvisionedDevices”集合:

<key>ProvisionedDevices</key>
<array>
    <string>abcdef01234567890abcdef01234567890abacde</string>
    <string>1abcdef01234567890abcdef01234567890abacd</string>
    <string>2abcdef01234567890abcdef01234567890abacd</string>
</array>

那么运行时检查问题在实际中是什么意思呢?是的,您可以通过从主包中打开embedded.mobileprovision文件,并从中解析出数据,做出明智的决定,但这是您将完全负责实现自己的事情.您需要添加逻辑来处理该文件丢失的情况(例如模拟器构建),并解析PCKS#7数据或可靠地提取文件的ASCII内容,您的代码可以运行一系列字符串搜索.可能显而易见的是,这将需要非常简单的方法来解决一个有点脆弱的解决方案,否则可以通过构建设置和预处理器宏来容易地适应上述答案中所述的Abhi Beckert.

App Store拒绝的风险如何?这是“非法”还是“颠覆”?

假设您在阅读和解析embedded.mobileprovision文件的内容时使用所有公共API,这完全可以通过App Store的当前条款.您的应用程式沙箱中的任何内容都是公平的游戏,包括embedded.mobileprovision,如果它恰好存在.我仍然强烈警告不要走这条路,回应Abhi Beckert的意见.对于不到1%的使用案例来说,这是相当多的努力,而且有更容易的解决方案!此外,开发人员诊断视图不应该在App Store发布版本中,但是包含无关代码的决定完全在您的手中.

我希望这清除任何留下的问题,但如果没有,请抛出一个评论,我们可以看到我们能做什么.

ios – 检查应用程序是否是ad-hoc | dev | app-store在运行时构建的更多相关文章

  1. 可以在Mavericks(OS X 10.9)上使用XCode 5为iOS 6开发吗?

    这个问题已经过时了.小牛队发布,一切正常,在iPod4th上使用Xcode5和iOS6.我正在考虑将我的OSX升级到Mavericks,但我仍然想继续开发我的iOS应用程序.我在网上看到Xcode4.6.3与Mavericks不兼容.所以,这会迫使我使用新的Xcode5.然而,Xcode5附带了新的iOS7SDK.问题是我拥有一个与iOS7不兼容的iPod第四代.那么,有人试过这个吗?

  2. ios – 从iphone app store过渡到企业开发

    它应该覆盖手机上的相同应用程序,而不是创建第二个应用程序.我联系了Apple支持,他们说:“不,如果你没有指示客户卸载他们的旧应用程序,你将安装2个应用程序”.这是真的?

  3. ios – Marmalade SDK是否与游戏开发更相关或更常用?

    我是移动应用程序开发的新手,并且正在寻找一个适合的平台.我遇到了一个项目,人们希望将交换机和家庭自动化公司的自助广告实施到移动应用程序中.他们最初想要一个iPhone应用程序,但也希望随后在Android和其他平台上部署.一个类似的应用程序是这one.在投入大量时间研究各种SDK和开发人员计划之后,Marmalade通过它的多平台部署功能引起了我的注意.然而,在经历了一些教程之后,我发现these

  4. ios – 尝试在设备上运行我的应用程序时找不到此可执行文件的有效配置文件

    我正在敲打我的头一天超过一天,我几天前将应用程序上传到苹果商店,它被拒绝了.我做了更改,现在想再次在我的手机上测试应用程序,每次我都收到一条奇怪的消息,告诉我没有有效的配置文件.我是iOS的新手.我检查了各种问题,并按照解释设置了所有内容.为什么这个奇怪的错误.点击窗口>组织者我看到我的有效个人资料和我的iPhone带有绿色信号.我想知道问题出在哪里!

  5. iOS推送通知适用于Dev而不是Enterprise Distribution

    本网站上没有其他问题,我已经能够找到实际上提出了Dev将工作的原因,但企业分布不会.为什么归档总是使aps环境生产?

  6. iOS7 Safari中的全屏模式

    我正在使用SenchaTouch开发移动网站.在iOS7Safari中,我无法创建顶级地址栏和下面的工具栏消失了.Sencha过去常常处理iOS6,但iOS7最近的一些变化导致了这个问题.http://java.dzone.com/articles/safari-ios-7-and-html5我阅读了上面的链接&对于HTML5游戏而言,这似乎也是一个问题.一些其他应用程序.适用于iOS6的旧win

  7. 调试 – iOS设备上的remote console.log()

    我正在开发涉及touchEvent的网络应用程序.如果我可以在我的Mac上远程查看控制台,那么调试它会更容易一些.我可以在iOS设备上使我的MobileSafari将控制台日志存储在系统中的某个位置.我已经越狱了我的iPad.谢谢!

  8. ios – iPhone:我可以通过编程方式禁用自动关闭显示屏吗?

    3个我最近开始在Objective-C开发iPhone应用程序,并组装了一个小型通用视频播放器,可以让我在iPhone上观看电视节目,电影等.除了一件小事之外,一切都在完美无缺.如果我在该时间范围内没有点击屏幕,显示屏会在一两分钟后关闭并变为黑色.我想知道在我的应用程序打开时是否可以以编程方式保持显示.我已经尝试将idleTimerdisabled设置为true,但没有成功.我的设备是越狱的,如果它有所作为,我也开放的解决方案只适用于越狱设备.解决方法在AppDelegate中添加:

  9. 使用iOS 9 beta 3时,一般设置中没有配置文件选项卡

    当我尝试运行我的应用程序在iOS9beta3,以及beta4&5,我收到一个错误说不信任的企业开发人员UntrustedEnterpriseDeveloper“iPhoneDeveloper:name(id)”hasnotyetbeentrustedonthisiPhone.Untilthisdeveloperhasbeentrusted,theirenterpriseappswillnotbea

  10. ios – 警报“开发人员工具访问需要控制另一个进程进行调试以继续.输入您的密码以允许这一点.

    编辑那些你厌恶命令行的人可以在组织者窗口中找到类似的功能在XCode中打开“管理器”窗口,在“设备”选项卡中,您将看到列出的“我的Mac”.您可以通过点击按钮来启用和禁用开发人员模式.

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部