Переместите этот метод image_new
из photoOutput
, как показано ниже,
//target function after saving the images
func image_new(_ image:UIImage,didFinishSavingWithError error : Error?,contextInfo : UnsafeRawPointer)
{
if let error = error
{
let ac = UIAlertController(title: "Save Error",message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "Ok", style: .default))
present(ac,animated: true)
}
else
{
let ac = UIAlertController(title: "Saved",message: "Your pic has been saved",preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "Ok", style: .default))
present(ac,animated: true)
}
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto
photo: AVCapturePhoto, error: Error?)
{
if let imageData = photo.fileDataRepresentation()
{
image = UIImage(data: imageData)
//the code added/////////
//save the images for test and debug
UIImageWriteToSavedPhotosAlbum(image,self,#selector(image_new(_:didFinishSavingWithError:contextInfo:)),nil)
//end
// the code addedd ends /////
self.images.append(image!)
//self.images.append((image?.resized(toWidth: 1200))!)
let seconds = (currentCamera?.exposureDuration.seconds)!
self.times.append(Float(seconds * seconds))
self.takenPhoto = true
if self.images.count >= self.photoCount
{
self.msg.text = ""
self.stopRunningCaptureSession()
self.indicator.startAnimating()
}
}
}
Доступ к пользователю непосредственно через DirectoryEntry походит на самый простой подход. Вот некоторые связанные с AD лакомые кусочки, которые я узнал из своего первого связанного с AD проекта:
Необходимо будет, вероятно, использовать DirectorySearcher для получения записи каталога пользователя, если Вы не будете знать ее путь (который Вы не были бы, только путем вхождения в систему его). Используя его было довольно легко, но остерегайтесь причуд в синтаксисе LDAP; а именно, имея необходимость закодировать неASCII (и другой?) символы. Строка поиска, которую Вы использовали бы, вероятно, будет чем-то как: (И (sAMAccountName=whatever) (class=user)). Это первое, что пришло на ум и может быть немного неправильно.
Ссылка Схемы Active Directory будет полезна. Действительно поймите, что схема может быть изменена и расширена (например, Exchange установки добавит информацию о почтовых ящиках к пользователям).
AD Проводник является полезным инструментом, который можно использовать для отладки и AD управления данными низкого уровня. Я нашел это полезным, когда я знаю, какое свойство я хочу установить, но не могу найти правильное диалоговое окно в AD инструменте управления.
Вы могли бы найти следующий отрывок полезным как начинающий.
public static bool IsUserInGroup(string lanid, string group)
{
DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH);
if(entry != null)
{
entry.Username=@"LDAPUSER";
entry.Password="LDAPPASSWORD";
DirectorySearcher srch = new DirectorySearcher(entry);
srch.Filter = String.Format("(&(objectClass=person)(sAMAccountName={0}))", lanid);
srch.PropertiesToLoad.Add("memberOf");
SearchResult result = srch.FindOne();
if(result != null)
{
if(result.Properties.Contains("memberOf"))
{
string lookfor = String.Format("cn={0},", group.ToLower());
foreach(string memberOf in result.Properties["memberOf"])
{
if(memberOf.ToLower().StartsWith(lookfor))
return true;
}
}
}
return false;
}
throw new Exception(String.Format("Could not get Directory lanid:{0}, group{1}", lanid, group));
}
Очень хорошая ссылка: практическое руководство: (почти) Все В Active Directory через C#
Взгляните на Систему. Пространство имен DirectoryServices:
Я пользовался стандартной библиотекой LDAP для получения информации с сервера Active Directory, но необходимо было бы проверить, что данные, в которых Вы нуждаетесь, доступны с помощью схемы сервера LDAP. В целом можно получить любую информацию, хранившую в InetOrganizationalPerson и большей части информации, связанной с группой (группами), которой они принадлежат.