有没有办法以编程方式关闭对话框,例如应用程序想要访问照片、访问联系人和访问位置的对话框?
我认为有一种方法可以混合 API 方法,但我真的不知道是哪一种。找出哪些方法需要混合的方法是什么?如果调配不是方式,那么还有什么替代方案?
请注意,这不是针对产品的,仅用于测试,因此如果可行,调酒是一个不错的选择。
有没有办法以编程方式关闭对话框,例如应用程序想要访问照片、访问联系人和访问位置的对话框?
我认为有一种方法可以混合 API 方法,但我真的不知道是哪一种。找出哪些方法需要混合的方法是什么?如果调配不是方式,那么还有什么替代方案?
请注意,这不是针对产品的,仅用于测试,因此如果可行,调酒是一个不错的选择。
在您的实现中键入此代码UIApplicationDelegate
(需要导入<AddressBook/AddressBook.h>
:
ABAuthorizationStatus ABAddressBookGetAuthorizationStatus(void) {
return kABAuthorizationStatusAuthorized;
}
在您的实现中输入以下方法UIApplicationDelegate
,或者在您需要的任何地方,最好使用辅助类。(需要导入<objc/runtime.h>
:
- (void)swizzleSelector:(SEL)selector fromInstancesOfClass:(Class)clazz withBlock:(id)block {
id replaceBlock = Block_copy(block);
Method origMethod = class_getInstanceMethod(clazz, selector);
IMP origImpl = method_getImplementation(origMethod);
IMP replaceImpl = imp_implementationWithBlock(replaceBlock);
method_setImplementation(origMethod, replaceImpl);
}
- (void)swizzleSelector:(SEL)selector fromClass:(Class)clazz withBlock:(id)block {
id replaceBlock = Block_copy(block);
Method origMethod = class_getClassMethod(clazz, selector);
IMP origImpl = method_getImplementation(origMethod);
IMP replaceImpl = imp_implementationWithBlock(replaceBlock);
method_setImplementation(origMethod, replaceImpl);
}
在您的UIApplicationDelegate
实施中执行以下操作。(需要导入<CoreLocation/CoreLocation.h>
):
[self swizzleSelector:@selector(startUpdatingLocation) fromInstancesOfClass:[CLLocationManager class] withBlock:^{}];
[self swizzleSelector:@selector(startMonitoringSignificantLocationChanges) fromInstancesOfClass:[CLLocationManager class] withBlock:^{}];
[self swizzleSelector:@selector(locationServicesEnabled) fromClass:[CLLocationManager class] withBlock:^{ return NO; }];
在您的UIApplicationDelegate
实施中执行以下操作。(需要导入<AssetsLibrary/AssetsLibrary.h>
):
[self swizzleSelector:@selector(authorizationStatus) fromClass:[ALAssetsLibrary class] withBlock:^{ return ALAuthorizationStatusAuthorized; }];
[self swizzleSelector:@selector(enumerateGroupsWithTypes:usingBlock:failureBlock:) fromInstancesOfClass:[ALAssetsLibrary class] withBlock:^{}];
您应该能够像这样从应用程序中的任何位置访问警报。这适用于常规警报,但我没有尝试使用系统警报(它们可能与常规警报不在同一层次结构中,在这种情况下您根本无法访问它们)。如果它确实有效并且您尝试使用它发布应用程序,它几乎肯定会被拒绝。
for (UIWindow* w in [UIApplication sharedApplication].windows)
{
for (NSObject* o in w.subviews)
if ([o isKindOfClass:[UIAlertView class]])
{
// as an example, this will just dismiss/cancel the alert
[(UIAlertView*)o dismissWithClickedButtonIndex:[(UIAlertView*)o cancelButtonIndex] animated:YES];
}
}