使用此问题中描述的方法,我可以获得在iOS设备上运行的应用列表.我知道PID并且可以访问他们的kinfo_proc
结构.如何确定哪些是前台进程以及哪些是后台(假设我的应用程序是后台)?
我试图找出这个基于信息kinfo_proc
(参见第1个链接),via kp_proc.p_priority
,但看起来不可能从优先级推断背景/前景状态.
我真的不在乎这是否适用于AppStore Review,但我更喜欢一种没有越狱的方法(即私有API可以,但是哪些?).我希望这至少可以在iOS 5上运行
我考虑过编写一个简单的MobileSubstrate
扩展,将其注入所有应用程序并且只是挂钩每个人applicationDidBecomeActive
,但这需要越狱并且过于侵略.
既然Apple正在运行某种静态分析来自动检查私有API的使用,那么很多人都因为Three20库而被捕.我使用另一个第三方库(我自己从代码中编译),我想在提交给Apple之前自动审核它以供私有API使用,所以我可以删除/重写这些部分.
如果我运行nm
我的应用程序可执行文件,我会得到一个符号列表,我看到那些我不使用的符号.例如,我看到_AudioServicesPlaySystemSound,如果我在XCode中搜索"AudioServicesPlaySystemSound",我得不到任何结果.有没有办法自动区分对私有API的调用,例如我注意到Apple习惯用初始下划线命名它们.
但是:如果我故意包含对私有API的调用,它不会显示在输出中nm
,但如果我strings
在二进制文件上运行它会显示.基于此,我的一个想法是将所有私有API调用的大量列表编译成一个巨大的表,并在字符串输出中自动搜索它们.我还没有这样做.
有没有人有关于如何自动捕捉这些东西的任何提示,所以我只进行一次审查过程?
UIWindow有私有方法_autolayoutTrace,可以帮助您找到暧昧的布局.这非常好,方便,输出如下:
*<UIWindow:0x13436fd0> - AMBIGUOUS LAYOUT
| *<UIView:0xd5e0b30>
| | *<PbJellyContentContainerView:0xd5e0ff0>
| | | *<UIView:0x20710ee0>
| | | | *<PbMapContainerView:0x20710c90>
| | | | | <MKMapView:0x2070df70>
| | | | | | <UIView:0xd1cca20>
| | | | | | | <MKBasicMapView:0xd1cd020>
....
Run Code Online (Sandbox Code Playgroud)
我的问题不是任何含糊不清的问题.它是关于某些观点前面的星号.它的含义是什么?
我的猜测是它标记了所有使用自动布局的视图.但是系统如何确定这个呢?
更新:
似乎星号标记所有具有至少一个约束集或具有至少具有一个约束集的子视图的视图.
设置translatesAutoresizingMaskIntoConstraints为false而不设置约束不会给出星号.
昨天我尝试在iOS 7中使用私有API但它不起作用.以下调用适用于iOS 6:
1. NSBundle *b = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/AppleAccount.framework"];
2. BOOL success = [b load];
3.
4. Class AADeviceInfo = NSClassFromString(@"AADeviceInfo");
6.
7. NSLog(@"-- serialNumber: %@", [AADeviceInfo serialNumber]);
8. NSLog(@"-- udid: %@", [AADeviceInfo udid]);
Run Code Online (Sandbox Code Playgroud)
在iOS 7中使用此代码段时,它返回一个空指针.框架,类和方法仍然存在(单击我).对我的问题有什么想法吗?是否有额外的安全层使得无法再在iOS 7中调用私有API?
谢谢!
考虑私有C函数_UICreateScreenUIImage
,它返回UIImage
当前设备屏幕的快照:
OBJC_EXTERN UIImage *_UICreateScreenUIImage(void) NS_RETURNS_RETAINED;
Run Code Online (Sandbox Code Playgroud)
我可以将它放在一个桥接头中,并在Swift中访问它,如下所示:
MyApp的桥接,Header.h
@import UIKit;
UIImage *_UICreateScreenUIImage(void) NS_RETURNS_RETAINED;
Run Code Online (Sandbox Code Playgroud)
MyClass.swift
let image = _UICreateScreenUIImage()
print(image) // <UIImage: 0x7fc4ba6081c0>, {375, 667}
Run Code Online (Sandbox Code Playgroud)
有没有办法_UICreateScreenUIImage
在纯粹的Swift中访问而不使用桥接头?
最初的想法是创建一个扩展UIImage
,但扩展期望我在扩展中声明函数的主体:
extension UIImage {
public func _UICreateScreenUIImage(_: Void) -> UIImage // "Expected '{' in body of function declaration"
}
Run Code Online (Sandbox Code Playgroud)
无论如何,这种实现都是有缺陷的,因为_UICreateScreenUIImage
它不是一种方法UIImage
.
是否可以在纯Swift中公开和访问此方法?
人们似乎把我的问题与"如何截取屏幕截图?"混淆了.那不是我要问的.我问我如何访问UIImage *_UICreateScreenUIImage(void);
Swift中的方法.它可以是任何私有方法,例如+(UIImage *)_deviceSpecificImageNamed:(NSString *)name inBundle:(NSBundle *)bundle;
或+(UIImage *)_pu_PhotosUIImageNamed:(NSString *)name;
.
我正在开发一款iPhone应用程序,我很快就会向现场观众进行演示.
我真的很想通过VGA实时演示应用到投影仪,而不是显示截图.
我为iPhone购买了一个VGA适配器,并根据我的需要调整了Rob Terrell的TVOutManager.不幸的是,在家里的电视上测试之后的帧速率并不是那么好 - 即使在iPhone 4上(也许是每秒4-5帧,它会有所不同).
我认为这种缓慢的原因是我用来捕获设备屏幕的主程序(然后显示在外部显示器上)是UIGetScreenImage()
.此例程不再允许成为运送应用程序的一部分,实际上非常慢.下面是我使用捕捉屏幕的代码(FYI mirrorView
是UIImageView
):
CGImageRef cgScreen = UIGetScreenImage();
self.mirrorView.image = [UIImage imageWithCGImage:cgScreen];
CGImageRelease(cgScreen);
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法可以用来捕捉iPhone的屏幕并获得更好的帧速率(拍摄20+ fps)?它不需要通过Apple的应用程序审查 - 此演示代码不会在运送应用程序中.如果有人知道任何更快的私有API,我真的很感激帮助!
此外,使用NSTimer
每秒1.0/desiredFrameRate
(当前每0.1秒)触发的重复执行上述代码.我想知道是否将这些调用包装在一个块中并使用GCD或者NSOperationQueue
比NSTimer
调用我updateTVOut
当前包含这些调用的obj-c方法更有效.我也会欣赏一些意见 - 一些搜索似乎表明,与其他操作相比,obj-c消息发送有点慢.
最后,正如您在上面看到的CGImageRef
那样,UIGetScreenImage()
返回的内容将被转换为a UIImage
,然后将UIImage
其传递给a UIImageView
,这可能会动态调整图像大小.我想知道调整大小是否会减慢速度.如何更快地做到这一点的想法?
是否可以AVSystemController_SystemVolumeDidChangeNotification
在使用私有API时(在App Store审核过程中)考虑收听NSNotification?
在我的应用程序中,我需要显示和更新当前的音量级别.在按下硬件音量按钮后和MPVolumeView滑块中的音量更改后,应更新音量指示器.
我搜索了解决方案如何获得硬件按钮按下的通知或事件,并找到了许多解决方案.
例如, 按iPhone检测音量键.
和
我喜欢听NSNotificationCenter的解决方案,似乎最简单明了的解决方案是听AVSystemController_SystemVolumeDidChangeNotification
(并且工作正常)
但是我确实想知道一件重要的事情.
此通知名称未出现在任何Apple官方文档中,并且有关于此通知用法是否将被视为"使用私有API"的讨论.
据我所知,使用私有API与调用私有方法相关联.这就是为什么使用这个通知密钥不能被视为私有API使用(因为实际上我们使用通知名称作为NSString).
也许有人肯定知道这一点,或者有使用AVSystemController_SystemVolumeDidChangeNotification
和app的经验被提交/拒绝?
非常感谢任何信息!
avfoundation iphone-privateapi appstore-approval nsnotificationcenter ios
我们如何获取/转储iOS 9的servicebundle头文件(尤其是IncomingCall.servicebundle头文件)?
针对较旧的iOS版本发布了IncomingCall.servicebundle标头(例如https://github.com/justzt/iPhone-IncomingCall.servicebundle-headers).
我正在尝试一段时间来为iOS 9找到或转储它们但没有运气.classdump-dyld工具(如http://iphonedevwiki.net/index.php/Reverse_Engineering_Tools#class-dump.2C_class_dump_z.2C_classdump-dyld中所述)无法转储我的dyld库,因为它"不合适的图像: dyld_shared_cache_arm64" .
考虑一下私有但尚未记录的Cocoa C函数_NSLogCStringFunction()
和_NSSetLogCStringFunction()
. _NSLogCStringFunction()
返回一个函数指针,指向Objective-C运行时幕后使用的C函数NSLog()
,并_NSSetLogCStringFunction()
允许开发人员指定自己的C函数进行日志记录.有关这两个函数的更多信息,请参阅此Stack Overflow问题和此WebObjects支持文章.
在C中,我可以传入一个NULL函数指针_NSSetLogCStringFunction()
:
extern void _NSSetLogCStringFunction(void(*)(const char*, unsigned, BOOL));
_NSSetLogCStringFunction(NULL); // valid
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在纯Swift中执行此操作时,我遇到了一些问题:
/// Represents the C function signature used under-the-hood by NSLog
typealias NSLogCStringFunc = (UnsafePointer<Int8>, UInt32, Bool) -> Void
/// Sets the C function used by NSLog
@_silgen_name("_NSSetLogCStringFunction")
func _NSSetLogCStringFunction(_: NSLogCStringFunc) -> Void
_NSSetLogCStringFunction(nil) // Error: nil is not compatible with expected argument type 'NSLogCStringFunc' (aka '(UnsafePointer<Int8>, UInt32, Bool) -> ()') …
Run Code Online (Sandbox Code Playgroud) 这个问题遵循Nate在此链接上提供的答案: 如何更改iOS应用程序的权利?
似乎所描述的程序将应用于越狱设备.
我有兴趣通过我的iOS应用程序关闭屏幕.以前的答案指向这样做:
void (*BKSDisplayServicesSetScreenBlanked)(BOOL blanked) = (void (*)(BOOL blanked))dlsym(RTLD_DEFAULT, "BKSDisplayServicesSetScreenBlanked");
Run Code Online (Sandbox Code Playgroud)
然后
BKSDisplayServicesSetScreenBlanked(1); // 1 to dim, 0 to undim
Run Code Online (Sandbox Code Playgroud)
我读到该应用程序还需要com.apple.backboard.client权利.这是我的知识停止的地方.
如果应用程序仅用于通过Apple的MDM平台控制的业务环境中,如何在我的应用程序中使用此功能?
我不想越狱设备.
ios ×8
iphone ×4
objective-c ×2
swift ×2
avfoundation ×1
c ×1
frameworks ×1
ios7 ×1
jailbreak ×1
screen ×1
uikit ×1