. «Чистая» сборки может удалить «мертвую древесину», которая может быть оставлена лежащей рядом с предыдущими сборками, неудачными сборками, неполными сборками и другими проблемами сборки.
В общем случае среда IDE или сборка будет включать в себя некоторую форму «чистой» функции, но это может быть неправильно настроено (например, в ручном файле) или может завершиться неудачей (например, промежуточные или результирующие двоичные файлы - только).
После завершения «очистки» убедитесь, что «чистый» преуспел, и весь сгенерированный промежуточный файл (например, автоматический файл makefile) был успешно удален.
Этот процесс можно рассматривать как конечный вариант, но часто является хорошим первым шагом ; особенно если недавно был добавлен код, связанный с ошибкой (локально или из исходного репозитория).
Я нашел ответ! Выполнение снимка экрана прерывает любые нажатия на экране. Вот почему snapchat требует удерживания, чтобы увидеть картинку. Ссылка: http://tumblr.jeremyjohnstone.com/post/38503925370/how-to-detect-screenshots-on-ios-like-snapchat
Похоже, нет прямого способа сделать это, чтобы обнаружить, что пользователь нажал home + power button
. Согласно этому , это было возможно раньше, используя уведомление darwin, но оно больше не работает. Поскольку snapchat уже делает это, я предполагаю, что они проверяют фотоальбом iPhone, чтобы определить, добавлено ли новое изображение между этими 10 секундами, и каким-то образом они сравниваются с текущим изображением. Возможно, для этого сравнения сделана некоторая обработка изображений. Просто мысль, возможно, вы можете попытаться расширить ее, чтобы она работала. Проверьте это для более подробной информации .
Редактирование:
Похоже, что они могут обнаруживать событие отмены UITouch (захват экрана отменяет касания) и показывает это сообщение об ошибке для пользователя в соответствии с этим блогом: Как обнаружить скриншоты на iOS (например, SnapChat)
В этом случае вы можете использовать метод – touchesCancelled:withEvent:
для определения отмены UITouch для обнаружения этого , Вы можете удалить изображение в этом методе делегата и показать соответствующее предупреждение пользователю.
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesCancelled:touches withEvent:event];
NSLog(@"Touches cancelled");
[self.imageView removeFromSuperView]; //and show an alert to the user
}
Вот как это сделать в Swift с закрытием:
func detectScreenShot(action: () -> ()) {
let mainQueue = NSOperationQueue.mainQueue()
NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationUserDidTakeScreenshotNotification, object: nil, queue: mainQueue) { notification in
// executes after screenshot
action()
}
}
detectScreenShot { () -> () in
print("User took a screen shot")
}
Это включено как стандартная функция в:
https://github.com/goktugyil / EZSwiftExtensions
Отказ от ответственности: его мое репо
Последний SWIFT 3:
func detectScreenShot(action: @escaping () -> ()) {
let mainQueue = OperationQueue.main
NotificationCenter.default.addObserver(forName: .UIApplicationUserDidTakeScreenshot, object: nil, queue: mainQueue) { notification in
// executes after screenshot
action()
}
}
В viewDidLoad вызовите эту функцию
detectScreenShot { () -> () in
print("User took a screen shot")
}
Однако
NotificationCenter.default.addObserver(self, selector: #selector(test), name: .UIApplicationUserDidTakeScreenshot, object: nil)
func test() {
//do stuff here
}
работает полностью нормально. Я не вижу никаких точек mainQueue ...
Начиная с iOS 7, другие ответы больше не верны. Apple сделала так, что touchesCancelled:withEvent:
больше не вызывается, когда пользователь делает снимок экрана.
Это полностью сломает Snapchat, поэтому была добавлена пара бета-версий в новом решении. Теперь решение так же просто, как использование NSNotificationCenter для добавления наблюдателя в UIApplicationUserDidTakeScreenshotNotification .
Вот пример:
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationUserDidTakeScreenshotNotification
object:nil
queue:mainQueue
usingBlock:^(NSNotification *note) {
// executes after screenshot
}];
NotificationCenter.default.addObserver(
forName: .UIApplicationUserDidTakeScreenshot,
object: nil,
queue: .main) { notification in
//executes after screenshot
}