Как открыть брелок мерседес


Как заменить батарейку в брелке ключа Мерседес

Руководство по замене батарейки в ключе автомобилей Мерседес.

Как заменить батарейку в брелке ключа Мерседес 

Вы не можете открыть или закрыть свой автомобиль? Не можете запустить двигатель? Ваш ключ брелок Мерседеса не реагирует на ваши действия? Самая распространенная причина, по которой брелок не реагирует на нажатие кнопок это севшая батарейка в пульте. Не знаете, как поменять элемент питание в пульте? Предлагаем вам посмотреть видео, с помощью которого вы сможете узнать, как самостоятельно поменять батарею в ключе-брелке автомобилей Мерседес-Бенц.

 

Вот подробный видео ролик, с помощью которого вы можете узнать, как меняется батарейка в четырех видах брелках автомобилей Мерседес:

В зависимости от типа используемого пульта меняется нужное количество батареек. Так первый ключ (Тип 1 - треугольная кнопка паники) использует только одну батарейку CR 2025. 

 

Второй ключ (Тип 2 -круглая кнопка паники) имеет две батарейки CR 2025. 

 

Третий брелок-ключ (Тип 3), также имеет два элемента питания CR 2025.

 

Четвертый ключ, на котором также легко заменить батарейку самостоятельно, также имеет два элемента питания 2025CR.

 

 

Обращаем ваше внимание, что для долговечной службы батарейки CR 2025 и других подобных элементов питания приобретайте только литиевые элементы питания, которые имеют большой срок службы. Внимание!!! В настоящий момент на рынке представлен большой ассортимент батареек типа «таблетка».

Как заменить батарейку в брелке ключа Мерседес

К сожалению, большинство дешевых элементов питания не могут служить долгий срок из-за низкого качества элемента питания, которые не держат заряд.

Поэтому при выборе батарейки для пульта автомобиля выбирайте только дорогие элементы питания, известных брендов.

Как заменить аккумулятор для ключа Mercedes-Benz

  • Новое

    Новые автомобили

    • Новое
      • Mercedes-Benz Summer Event
      • Специальное предложение менеджера на 2019 год
      • Новые скидки
      • Новый инвентарь
      • Микроавтобусы Mercedes-Benz
      • Льготы по лизингу
      • Поощрение флота
    • Исследовать
      • 2021 GLE Coupe AMG® - Скоро!
      • 2021 GLA - прибыл!
      • 2020 GLB
      • 2020 GLE
      • 2020 GLC
      • 2020 GLC купе
      • Обзоры моделей
  • Рядом с новым

    Рядом с новым

  • 900 23.

    брелок Mercedes | Etsy

    Etsy использует файлы cookie и аналогичные технологии, чтобы вам было удобнее работать, например:

    • основные функции сайта
    • обеспечение безопасных, безопасных транзакций
    • безопасный вход в аккаунт
    • запоминание учетной записи, браузера и региональных настроек
    • запоминание настроек конфиденциальности и безопасности
    • анализ посещаемости и использования сайта
    • персонализированный поиск, контент и рекомендации
    • помогает продавцам понять свою аудиторию
    • , показ релевантной целевой рекламы на Etsy
    • и за ее пределами

    Подробную информацию можно найти в Политике Etsy в отношении файлов cookie и аналогичных технологий и в нашей Политике конфиденциальности.

    Всегда на связи

    Необходимые файлы cookie и технологии

    Некоторые из используемых нами технологий необходимы для критически важных функций, таких как безопасность и целостность сайта, аутентификация учетной записи, параметры безопасности и конфиденциальности, данные об использовании и обслуживании внутреннего сайта, а также для правильной работы сайта для просмотра и транзакций.

    На

    Персонализированная реклама

    Эти технологии используются для таких вещей, как персонализированная реклама.

    Мы делаем это с партнерами по маркетингу и рекламе (у которых может быть собственная собранная информация). Отказ не остановит вас от просмотра рекламы Etsy, но может сделать ее менее актуальной или более повторяющейся. Узнайте больше в нашей Политике в отношении файлов cookie и аналогичных технологий.

    .

    6 простых способов попасть внутрь, когда заблокирован «Автообслуживание и ремонт :: WonderHowTo

    Запирать ключи в машине - это, мягко говоря, неприятно, особенно если вы куда-то спешите. Вы всегда можете позвонить в службу технической поддержки AAA на дороге или к слесарю, но вам, вероятно, придется выложить немного денег, а также подождать, пока они доберутся до вас. Вас даже могут отбуксировать.

    К счастью, есть несколько способов самостоятельно отпереть дверь автомобиля в отчаянии, и я не говорю о мистификациях, таких как использование мобильного телефона или теннисного мяча.Чтобы открыть замок, когда у вас нет ключей, попробуйте шнурок, автомобильную антенну или даже стеклоочиститель.

    Эти трюки с блокировкой могут показаться невероятными, но они определенно работают, хотя все зависит от вашей марки и модели автомобиля. В новые легковые и грузовые автомобили будет труднее попасть с автоматическими замками и системами безопасности, но это возможно. Вы можете хотя бы попробовать один из этих советов по взлому замков, прежде чем звонить дорогому профессионалу, который сделает это за вас.

    Метод №1: используйте шнурки

    Это может показаться невыполнимой задачей, но вы можете открыть дверь машины за считанные секунды, используя только один шнурок.Снимите шнурок с одной из ваших туфель (подойдет и другой тип шнурка), затем завяжите в середине шнурок, который вы можете затянуть, потянув за концы шнурка.

    Возьмитесь за один конец веревки в каждой руке, проденьте его в угол двери машины и, двигаясь вперед и назад, опустите его достаточно далеко, чтобы узел мог скользить по дверной ручке. Как только он окажется на месте, потяните за шнур, чтобы затянуть его, и потяните вверх, чтобы разблокировать.

    Этот метод не будет работать для автомобилей, у которых есть запирающие механизмы сбоку двери, но если у вас есть ручка в верхней части двери (как на скриншотах выше), у вас есть большие шансы получить это работать.

    Метод № 2: Используйте длинный стержень

    Если вы можете приподнять верхнюю часть двери автомобиля хотя бы немного, вы можете использовать деревянный клин, воздушный клин и стержень, чтобы разблокировать машину. Сначала возьмитесь за деревянный клин и вставьте его в верхнюю часть двери. Чтобы не повредить краску, накройте клин крышкой (желательно пластиковой).

    Если вы думаете, что можете делать это много раз, купите набор клиньев или надувной клин и инструмент с большим радиусом действия.

    Вставьте воздушный клин рядом с деревянным клином и закачайте в него воздух, чтобы создать большее расстояние между автомобилем и дверью. Вдавите деревянный клин как можно сильнее, пока не образуется значительный зазор. Наконец, вставьте стержень в дверной проем и осторожно откройте дверь с помощью запирающего механизма сбоку.

    Если у вас нет воздушного клина, вы, вероятно, могли бы обойтись и без него. Сделать это будет сложнее, но в следующем видео это выглядит проще.

    Метод № 3: Используйте пластиковую полоску

    Если у вас запирающий механизм вверху, а не сбоку, вы можете использовать пластиковую пластину, что может быть проще, чем шнурок. Вам все равно нужно будет как-то открыть дверь, с воздушным клином или без него.

    Метод № 4: Используйте вешалку для одежды или Slim Jim

    Один из наиболее распространенных способов отпереть дверь автомобиля - использовать модифицированную проволочную вешалку для одежды, которая представляет собой тонкую скобу «сделай сам».Принцип тот же. Этот метод лучше подходит для ручного запирания дверей; для автоматической блокировки см. один из других методов.

    С помощью плоскогубцев раскрутите вешалку так, чтобы одна сторона была прямой, а другая зацепилась за крючок, который вы будете использовать для подъема рычага управления внутри двери, который соединен со стержнем замка.

    Затем сдвиньте крючок вниз между стеклом автомобиля и уплотнением, пока крюк не окажется примерно на 2 дюйма ниже места соединения окна и двери автомобиля, рядом с внутренней дверной ручкой, где обычно находится рычаг управления.(Вам следует заранее посмотреть онлайн-схему для вашей конкретной марки и модели автомобиля, так как расположение может быть другим.)

    Поворачивайте подвеску, пока крюк не будет направлен внутрь, и ловите вокруг рычага управления, что не всегда легко найти. Как только вы заперты, подъезжайте, и дверь машины откроется.

    Опять же, трюк с вешалкой работает только на определенных механизмах блокировки, обычно на старых автомобилях, поэтому он, скорее всего, не будет работать на новых моделях автомобилей.Для более новых автомобилей вы все еще можете использовать вешалку для одежды, но вам придется вставить ее между дверью и остальной частью автомобиля (как в методе № 2), чтобы разблокировать ее изнутри.

    Метод № 5: Используйте свою антенну

    На старых моделях автомобилей с внешней ручкой особого стиля, как на скриншоте ниже, вы потенциально можете разблокировать дверь снаружи, используя только антенну от вашего автомобиля.

    Просто открутите антенну, осторожно проведите ею вверх через дверную ручку и перемещайте ее, пока замок не начнет покачиваться.Как только вы увидите, что устанавливаете соединение, выдвиньте антенну вперед, и дверь откроется.

    Метод № 6: Используйте стеклоочиститель

    Обычно вы можете довольно легко снять дворники вашего автомобиля, но этот метод отличается для каждой модели автомобиля. Независимо от того, какая у вас машина, стеклоочиститель может избавить вас от необходимости вызывать слесаря, чтобы открыть запертую дверь машины.

    Сначала снимите стеклоочиститель с передней части автомобиля. Если ваше окно слегка приоткрыто или вы можете приоткрыть дверь, вы маневрируете в салон автомобиля.Используйте дворник, чтобы взять ключи на стуле или нажать кнопку разблокировки сбоку от двери (что я успешно опробовал на видео ниже).

    Вы можете практически использовать все, что достаточно долго, что проходит через ваше окно, но если вы спешите и не видите вокруг себя ничего, что могло бы пройти через щель, лучше всего подойдет стеклоочиститель. .

    Что сработало для вас?

    Вы пробовали какой-либо из вышеперечисленных методов? Или вы знаете другие способы самостоятельно открыть дверь машины? Дайте нам знать в комментариях ниже!

    Если ничего из этого не помогло, вы всегда можете попробовать помощь на дороге AAA, если вы являетесь участником (или позвоните и зарегистрируйтесь по телефону).Обычно они возмещают вам часть или все расходы, если вам нужно вызвать слесаря. Если у вас нет AAA, вы можете попробовать позвонить в полицию или в местную службу безопасности (университет или торговый центр). У полицейских обычно есть стройные машины в машине, но не рассчитывайте на это - помощь вам, вероятно, наименее важная вещь в их списке дел.

    Если вы не хотите, чтобы вас снова заблокировали, вы также можете приобрести магнитные держатели ключей. Положите туда запасной ключ от машины и спрячьте его под бампером.

    Хотите освоить Microsoft Excel и вывести свои перспективы работы на дому на новый уровень? Начните свою карьеру с нашего пакета обучения Microsoft Excel Premium A-to-Z из нового магазина Gadget Hacks и получите пожизненный доступ к более чем 40 часам инструкций от базового до расширенного по функциям, формулам, инструментам и многому другому.

    Купить сейчас (97% скидка)>

    .Руководство по API

    Keychain Services для паролей в Swift

    Одним из наиболее важных элементов безопасности для разработчиков Apple является связка ключей iOS , специализированная база данных для хранения метаданных и конфиденциальной информации. Использование Keychain - лучший способ хранить небольшие фрагменты данных, которые важны для вашего приложения, например секреты и пароли.

    Непосредственно взаимодействовать с Keychain сложно, особенно в Swift. Вы должны использовать фреймворк Security , который в основном написан на C.

    Существуют различные оболочки Swift, которые позволяют взаимодействовать с Keychain . Apple даже предлагает один под названием GenericKeychain, чтобы упростить вашу жизнь.

    Хотя вы можете легко использовать сторонние оболочки для взаимодействия с недружественным API, предоставляемым Apple, понимание Keychain Services добавляет ценный инструмент в ваш набор инструментов разработчика.

    В этом руководстве вы углубитесь в Keychain Services API и узнаете, как создать свою собственную оболочку, разработав ее как платформу iOS.

    В частности, вы узнаете, как добавлять, изменять, удалять и искать общие пароли и пароли в Интернете. Кроме того, вы предоставите модульные тесты, чтобы убедиться, что ваш код работает так, как вы ожидаете.

    Начало работы

    В этом руководстве вы будете использовать SecureStore , стандартную платформу iOS, в которой вы реализуете свой Keychain Services API .

    Начните с загрузки начального проекта с помощью кнопки Загрузить материалы вверху или внизу этого руководства.После загрузки откройте SecureStore.xcodeproj в Xcode.

    Чтобы вы не отвлекались, в стартовом проекте есть все, что связано с реализацией вашей оболочки, уже настроенной для вас.

    Структура вашего проекта должна выглядеть так:

    Код вашей оболочки находится в папке группы SecureStore :

    • SecureStoreError.swift : содержит перечисление , которое представляет все возможные ошибки, с которыми может справиться ваша оболочка.В соответствии с LocalizedError , SecureStoreError предоставляет локализованные сообщения с описанием ошибки и причин ее возникновения.
    • SecureStoreQueryable.swift : определяет протокол с тем же именем, что и файл. SecureStoreQueryable заставляет разработчика предоставить свойство запроса , определенное как словарь с типом [String: Any] . Внутренне ваш API имеет дело только с этими типами объектов. Подробнее об этом позже.
    • SecureStore.swift : определяет оболочку, которую вы реализуете в этом руководстве. Он предоставляет инициализатор и набор зарезервированных методов для добавления, обновления, удаления и получения ваших паролей из Keychain . Потребитель может создать экземпляр оболочки, введя некоторый тип, соответствующий SecureStoreQueryable .
    • InternetProtocol.swift : представляет все возможные значения интернет-протокола, с которыми вы можете иметь дело.
    • InternetAuthenticationType.swift : описывает механизмы аутентификации, которые предоставляет ваша оболочка.

    Примечание : Внедрение зависимостей позволяет писать классы, которые расширяют и изолируют функциональность. Это немного пугающее слово для довольно простой концепции. В этом руководстве вы встретите слово «внедрить», которое относится к передаче всего объекта в инициализатор.

    Наряду с кодом фреймворка у вас должны быть две другие папки: SecureStoreTests и TestHost .Первый содержит модульные тесты, которые вы поставляете вместе со своим фреймворком. Последний содержит пустое приложение, которое вы будете использовать для тестирования API фреймворка.

    Примечание : Обычно для тестирования кода, который вы пишете в учебнике, вы запускаете приложение в симуляторе. Вместо этого вы убедитесь, что ваш код работает, запустив модульные тесты. Таким образом, тестовое хост-приложение в проекте не будет работать в симуляторе; вместо этого он служит контейнером, в котором выполняет модульные тесты для вашей платформы.

    Прежде чем углубляться непосредственно в код, ознакомьтесь с некоторой теорией!

    Обзор служб связки ключей

    Зачем использовать Keychain вместо более простых решений? Разве недостаточно сохранить пароль пользователя в кодировке Base-64 в UserDefaults ?

    Определенно нет! Для злоумышленника нетрудно восстановить пароль, сохраненный таким образом.

    Службы связки ключей помогут вам безопасно хранить элементы или небольшие фрагменты данных в зашифрованной базе данных от имени пользователя.

    Из документации Apple, класс SecKeychain представляет базу данных, а класс SecKeychainItem представляет элемент.

    Службы связки ключей работают по-разному в зависимости от используемой вами операционной системы.

    В iOS приложения имеют доступ к одной цепочке ключей , которая включает Связку ключей iCloud .Блокировка и разблокировка устройства автоматически блокирует и разблокирует Брелок . Это предотвращает нежелательный доступ. Кроме того, приложение может получить доступ только к своим собственным элементам или элементам, совместно используемым с группой, к которой оно принадлежит.

    С другой стороны, macOS поддерживает несколько цепочек ключей. Обычно вы полагаетесь на пользователя для управления ими с помощью приложения Keychain Access и неявно работаете с цепочкой ключей по умолчанию. Кроме того, вы можете напрямую управлять связками ключей; например, создание и управление связкой ключей, которая является строго частной для вашего приложения.

    Если вы хотите сохранить секрет, например пароль, вы упаковываете его как элемент связки ключей. Это непрозрачный тип, который состоит из двух частей: данных и набора атрибутов. Непосредственно перед тем, как вставить новый элемент, Keychain Services шифрует данные, а затем упаковывает их вместе со своими атрибутами.

    Используйте атрибуты для идентификации и хранения метаданных или для управления доступом к вашим сохраненным элементам. Укажите атрибуты как ключи и значения словаря, выраженного как CFDictionary .Список доступных ключей можно найти в разделе «Ключи и значения атрибутов элемента». Соответствующие значения могут быть строками, числами, некоторыми другими базовыми типами или константами, упакованными в среду безопасности.

    Службы связки ключей предоставляют особые виды атрибутов, которые позволяют идентифицировать класс для определенного элемента. В этом руководстве вы будете использовать kSecClassGenericPassword и kSecClassInternetPassword для работы с обычными паролями и паролями в Интернете.

    Каждый класс поддерживает только специальный набор атрибутов. Другими словами, не все атрибуты применимы к определенному классу элементов. Вы можете проверить их в соответствующей документации по стоимости класса номенклатуры.

    Примечание : Помимо манипулирования паролями, Apple предлагает возможность взаимодействовать с другими типами элементов, такими как сертификаты, криптографические ключи и идентификационные данные. Они представлены соответственно классами kSecClassCertificate , kSecClassKey и kSecClassIdentity .

    Погружение в API служб связки ключей

    Поскольку код скрывает элементы от злонамеренных пользователей, Keychain Services предоставляет набор функций C для взаимодействия. Вот API, которые вы будете использовать для управления как обычными паролями, так и паролями в Интернете:

    • SecItemAdd (_: _ :) : используйте эту функцию, чтобы добавить один или несколько элементов в связку ключей.
    • SecItemCopyMatching (_: _ :) : эта функция возвращает один или несколько элементов связки ключей, соответствующих поисковому запросу.Кроме того, он может копировать атрибуты определенных элементов связки ключей.
    • SecItemUpdate (_: _ :) : Эта функция позволяет изменять элементы, соответствующие поисковому запросу.
    • SecItemDelete (_ :) : эта функция удаляет элементы, соответствующие поисковому запросу.

    Хотя вышеперечисленные функции работают с разными параметрами, все они возвращают код результата, выраженный как OSStatus . Это 32-битное целое число со знаком, которое может принимать одно из значений, перечисленных в Ключах результата возврата элемента.

    Поскольку OSStatus может быть непонятным для понимания, Apple предоставляет дополнительный API под названием SecCopyErrorMessageString (_: _ :) для получения удобочитаемой строки, соответствующей этим кодам состояния.

    Примечание : Помимо добавления, изменения, удаления или поиска определенного элемента связки ключей, Apple также предоставляет функции как для экспорта, так и для импорта сертификатов, ключей и идентификаторов или даже для изменения контроля доступа к элементам. Если вы хотите узнать больше, ознакомьтесь с документацией по элементам связки ключей.

    Теперь, когда вы хорошо знакомы с Keychain Services , в следующем разделе вы узнаете, как удалить заглушенные методы, предоставляемые вашей оболочкой.

    Реализация Wrapper API

    Откройте SecureStore.swift и добавьте следующую реализацию внутри setValue (_: for :) :

     // 1 guard let encodedPassword = value.data (используя: .utf8) else { выбросить SecureStoreError.string2DataConversionError } // 2 var query = secureStoreQueryable.запрос запрос [String (kSecAttrAccount)] = userAccount // 3 var status = SecItemCopyMatching (запрос как CFDictionary, nil) switch status { // 4 case errSecSuccess: var attributesToUpdate: [String: Any] = [:] attributeToUpdate [String (kSecValueData)] = encodedPassword status = SecItemUpdate (запрос как CFDictionary, attributeToUpdate как CFDictionary) if status! = errSecSuccess { выбросить ошибку (от: статус) } // 5 case errSecItemNotFound: запрос [String (kSecValueData)] = encodedPassword status = SecItemAdd (запрос как CFDictionary, ноль) if status! = errSecSuccess { выбросить ошибку (от: статус) } дефолт: выбросить ошибку (от: статус) } 

    Этот метод, как следует из названия, позволяет сохранить новый пароль для конкретной учетной записи.Если он не может обновить или добавить пароль, он выдает SecureStoreError.unhandledError , в котором указывается локализованное описание для него.

    Вот что делает ваш код:

    1. Проверьте, может ли он закодировать значение для сохранения в тип Data . Если это невозможно, возникает ошибка преобразования.
    2. Попросите экземпляр secureStoreQueryable выполнить запрос и добавить учетную запись, которую вы ищете.
    3. Вернуть элемент цепочки для ключей, соответствующий запросу.
    4. Если запрос завершился успешно, это означает, что пароль для этой учетной записи уже существует. В этом случае вы замените существующее значение пароля с помощью SecItemUpdate (_: _ :) .
    5. Если не удается найти элемент, значит пароль для этой учетной записи еще не существует. Вы добавляете элемент, вызывая SecItemAdd (_: _ :) .

    API Keychain Services использует типы Core Foundation. Чтобы компилятор был доволен, вы должны преобразовать типы Core Foundation в типы Swift и наоборот.

    В первом случае, поскольку атрибут каждого ключа имеет тип CFString , его использование в качестве ключа в словаре запросов требует преобразования в String . Однако преобразование из [String: Any] в CFDictionary позволяет вам вызывать функции C.

    Пришло время восстановить пароль. Прокрутите вниз только что реализованный метод и замените реализацию getValue (for :) на следующую:

     // 1 var query = secureStoreQueryable.запрос запрос [String (kSecMatchLimit)] = kSecMatchLimitOne запрос [String (kSecReturnAttributes)] = kCFBooleanTrue запрос [String (kSecReturnData)] = kCFBooleanTrue запрос [String (kSecAttrAccount)] = userAccount // 2 var queryResult: AnyObject? let status = withUnsafeMutablePointer (to: & queryResult) { SecItemCopyMatching (запрос как CFDictionary, $ 0) } switch status { // 3 case errSecSuccess: охранять пусть queriedItem = queryResult как? [String: Any], пусть passwordData = queriedItem [String (kSecValueData)] как? Данные, let password = String (data: passwordData, кодировка:.utf8) else { выбросить SecureStoreError.data2StringConversionError } вернуть пароль // 4 case errSecItemNotFound: вернуть ноль дефолт: выбросить ошибку (от: статус) } 

    Для конкретной учетной записи этот метод извлекает связанный с ней пароль. Опять же, если с запросом что-то пойдет не так, код выдаст SecureStoreError.unhandledError .

    Вот что происходит с только что добавленным кодом:

    1. Запрашивать secureStoreQueryable для выполнения запроса.Помимо добавления интересующей вас учетной записи, это обогащает запрос другими атрибутами и связанными с ними значениями. В частности, вы просите его вернуть один результат, вернуть все атрибуты, связанные с этим конкретным элементом, и в результате вернуть вам незашифрованные данные.
    2. Используйте SecItemCopyMatching (_: _ :) для выполнения поиска. По завершении queryResult будет содержать ссылку на найденный элемент, если он доступен. withUnsafeMutablePointer (to: _ :) дает вам доступ к UnsafeMutablePointer , который вы можете использовать и изменять внутри замыкания для сохранения результата.
    3. Если запрос завершился успешно, это означает, что он нашел элемент. Поскольку результат представлен словарем, содержащим все запрошенные вами атрибуты, вам необходимо сначала извлечь данные, а затем декодировать их в тип Data .
    4. Если элемент не найден, вернуть значение ноль .

    Недостаточно добавить или получить пароли для учетной записи. Вам также необходимо интегрировать способ удаления паролей.

    Найдите removeValue (для :) и добавьте эту реализацию:

     var query = secureStoreQueryable.запрос запрос [String (kSecAttrAccount)] = userAccount let status = SecItemDelete (запрос как CFDictionary) статус охраны == errSecSuccess || status == errSecItemNotFound else { выбросить ошибку (от: статус) } 

    Чтобы удалить пароль, выполните SecItemDelete (_ :) , указав учетную запись, которую вы ищете. Если вы успешно удалили пароль или элемент не был найден, ваша работа сделана, и вы спасетесь. В противном случае вы выдаете необработанную ошибку, чтобы пользователь знал, что что-то пошло не так.

    Но что, если вы хотите удалить все пароли, связанные с определенной службой? Ваш следующий шаг - реализовать окончательный код для достижения этой цели.

    Найдите removeAllValues ​​() и добавьте в скобки следующий код:

     пусть запрос = secureStoreQueryable.query let status = SecItemDelete (запрос как CFDictionary) статус охраны == errSecSuccess || status == errSecItemNotFound else { выбросить ошибку (от: статус) } 

    Как вы заметите, этот метод похож на предыдущий, за исключением запроса, переданного в функцию SecItemDelete (_ :) .В этом случае вы удаляете пароли независимо от учетной записи пользователя.

    Наконец, создайте фреймворк, чтобы убедиться, что все компилируется правильно.

    Соединяя точки

    Вся проделанная вами работа обогащает вашу оболочку возможностями добавления, обновления, удаления и извлечения. Как есть, вы должны создать оболочку с экземпляром некоторого типа, который соответствует SecureStoreQueryable .

    Поскольку вашей самой первой целью было иметь дело как с общими паролями, так и с паролями в Интернете, следующим шагом будет создание двух различных конфигураций, которые потребитель может создать и внедрить в вашу оболочку.

    Во-первых, изучите, как составить запрос на общие пароли.

    Откройте SecureStoreQueryable.swift и добавьте следующий код под определением SecureStoreQueryable :

     public struct GenericPasswordQueryable { let service: String позволить accessGroup: String? init (service: String, accessGroup: String? = nil) { self.service = service self.accessGroup = accessGroup } } 

    GenericPasswordQueryable - это простая структура , которая принимает службу и группу доступа как параметры String .

    Затем добавьте следующее расширение под определением GenericPasswordQueryable :

     extension GenericPasswordQueryable: SecureStoreQueryable { public var query: [String: Any] { var query: [String: Any] = [:] запрос [String (kSecClass)] = kSecClassGenericPassword запрос [String (kSecAttrService)] = служба // Группа доступа, если целевая среда не симулятор #if! targetEnvironment (симулятор) если разрешить accessGroup = accessGroup { запрос [String (kSecAttrAccessGroup)] = accessGroup } #endif ответ на запрос } } 

    Чтобы соответствовать протоколу SecureStoreQueryable , необходимо реализовать запрос как свойство.Запрос представляет способ, которым ваша оболочка может выполнять выбранную функцию.

    Составленный запрос имеет определенные ключи и значения:

    • Класс элемента, представленный ключом kSecClass , имеет значение kSecClassGenericPassword , поскольку вы имеете дело с универсальными паролями. Таким образом связка ключей определяет, что данные являются секретными и требуют шифрования.
    • kSecAttrService устанавливается равным значению параметра service , которое вводится с новым экземпляром GenericPasswordQueryable .
    • Наконец, если ваш код не выполняется на симуляторе, вы также устанавливаете ключ kSecAttrAccessGroup на предоставленное значение accessGroup . Это позволяет вам обмениваться элементами между разными приложениями с одной и той же группой доступа.

    Затем создайте каркас, чтобы убедиться, что все работает правильно.

    Примечание : для элемента связки ключей класса kSecClassGenericPassword первичный ключ представляет собой комбинацию kSecAttrAccount и kSecAttrService .Другими словами, кортеж позволяет вам однозначно идентифицировать общий пароль в цепочке ключей .

    Ваша новая блестящая обертка еще не готова! Следующим шагом является интеграция функций, позволяющих потребителям также взаимодействовать с паролями в Интернете.

    Прокрутите до конца SecureStoreQueryable.swift и добавьте следующее:

     public struct InternetPasswordQueryable { пусть сервер: Строка пусть порт: Int let path: String пусть securityDomain: String пусть internetProtocol: InternetProtocol пусть internetAuthenticationType: InternetAuthenticationType } 

    InternetPasswordQueryable - это структура , которая помогает вам управлять Интернет-паролями внутри ваших приложений Связка ключей .

    Перед тем, как соответствовать SecureStoreQueryable , найдите время, чтобы понять, как ваш API будет работать в этом случае.

    Если пользователи хотят иметь дело с паролями в Интернете, они создают новый экземпляр InternetPasswordQueryable , где свойства internetProtocol и internetAuthenticationType привязаны к определенным доменам.

    Затем добавьте следующее ниже своей реализации InternetPasswordQueryable :

     extension InternetPasswordQueryable: SecureStoreQueryable { public var query: [String: Any] { var query: [String: Any] = [:] запрос [String (kSecClass)] = kSecClassInternetPassword запрос [String (kSecAttrPort)] = порт запрос [String (kSecAttrServer)] = сервер запрос [String (kSecAttrSecurityDomain)] = securityDomain запрос [String (kSecAttrPath)] = путь запрос [String (kSecAttrProtocol)] = internetProtocol.rawValue запрос [String (kSecAttrAuthenticationType)] = internetAuthenticationType.rawValue ответ на запрос } } 

    Как видно из случая общих паролей, запрос имеет определенные ключи и значения:

    • Класс элемента, представленный ключом kSecClass , имеет значение kSecClassInternetPassword , поскольку теперь вы взаимодействуете с паролями в Интернете.
    • kSecAttrPort настроен на параметр порт .
    • kSecAttrServer настроен на параметр server .
    • kSecAttrSecurityDomain установлен в параметр securityDomain .
    • kSecAttrPath устанавливается в параметр path .
    • kSecAttrProtocol привязан к rawValue параметра internetProtocol .
    • Наконец, kSecAttrAuthenticationType привязан к rawValue параметра internetAuthenticationType .

    Снова соберите, чтобы увидеть, правильно ли компилируется Xcode.

    Примечание : для элемента связки ключей класса kSecClassInternetPassword первичный ключ представляет собой комбинацию kSecAttrAccount , kSecAttrSecurityDomain , kSecAttrServer , kSecAttrProtocol58. Другими словами, эти значения позволяют однозначно идентифицировать интернет-пароль в цепочке ключей .

    Пришло время увидеть результат всей вашей тяжелой работы. Но ждать! Поскольку вы не создаете приложение, работающее на симуляторе, как вы собираетесь его проверить?

    Вот где на помощь приходят модульные тесты.

    Тестирование поведения

    В этом разделе вы увидите, как интегрировать модульные тесты для вашей оболочки. В частности, вы протестируете функции, которые предоставляет ваша оболочка.

    Создание класса

    Чтобы создать класс, который будет содержать все ваши модульные тесты, щелкните File New File… и выберите iOS Source Unit Test Case Class .На следующем экране укажите имя класса SecureStoreTests , подкласс XCTestCase и убедитесь, что язык - Swift . Щелкните Next , выберите группу SecureStoreTests , убедитесь, что вы установили флажок SecureStoreTests target, и щелкните Create .

    Xcode предложит диалоговое окно для создания заголовка моста Objective-C. Нажмите Не создавать , чтобы пропустить создание.

    Откройте SecureStoreTests.swift и удалите весь код в фигурных скобках.

    Затем добавьте следующее под оператором import XCTest :

     @testable импорт SecureStore 

    Это дает модульным тестам доступ к классам и методам, определенным в вашей структуре SecureStore.

    Примечание : вы можете увидеть ошибку «Нет такого модуля». Не волнуйтесь, ошибка исчезнет, ​​когда вы дойдете до конца этого раздела руководства и выполните тест.

    Затем добавьте следующие свойства вверху SecureStoreTests :

     var secureStoreWithGenericPwd: SecureStore! var secureStoreWithInternetPwd: SecureStore! 

    Затем добавьте новый метод setUp () , например:

     override func setUp () { super.setUp () пусть genericPwdQueryable = GenericPasswordQueryable (служба: "someService") secureStoreWithGenericPwd = SecureStore (secureStoreQueryable: genericPwdQueryable) пусть internetPwdQueryable = InternetPasswordQueryable (сервер: "someServer", порт: 8080, путь: "somePath", securityDomain: "someDomain", протокол Интернета: .https, internetAuthenticationType: .httpBasic) secureStoreWithInternetPwd = SecureStore (secureStoreQueryable: internetPwdQueryable) } 

    Поскольку вы тестируете как общий, так и интернет-пароль, вы создаете два экземпляра оболочки с двумя разными конфигурациями. Эти конфигурации вы разработали в предыдущем разделе.

    Прежде чем вы забудете, вам нужно очистить состояние связки ключей на этапе разрыва теста, чтобы вы могли начать все заново в следующий раз.Добавьте этот метод в конец класса:

     override func tearDown () { пытаться? secureStoreWithGenericPwd.removeAllValues ​​() пытаться? secureStoreWithInternetPwd.removeAllValues ​​() super.tearDown () } 

    Поскольку вы должны изолировать и выполнять каждый тест независимо от других, вы собираетесь удалить все пароли, уже имеющиеся в цепочке ключей . Порядок исполнения значения не имеет.

    Пришло время добавить модульные тесты для общих паролей.

    Тестирование общих паролей

    Добавьте следующий код под tearDown () :

     // 1 func testSaveGenericPassword () { делать { попробуйте secureStoreWithGenericPwd.setValue ("pwd_1234", for: "genericPassword") } catch (let e) { XCTFail («Не удалось сохранить общий пароль с помощью \ (e.localizedDescription).») } } // 2 func testReadGenericPassword () { делать { попробуйте secureStoreWithGenericPwd.setValue ("pwd_1234", for: "genericPassword") пусть пароль = попробуйте secureStoreWithGenericPwd.getValue (для: "genericPassword") XCTAssertEqual ("pwd_1234", пароль) } catch (let e) { XCTFail («Не удалось прочитать общий пароль с \ (e.localizedDescription).») } } // 3 func testUpdateGenericPassword () { делать { попробуйте secureStoreWithGenericPwd.setValue ("pwd_1234", for: "genericPassword") попробуйте secureStoreWithGenericPwd.setValue ("pwd_1235", for: "genericPassword") let password = попробуйте secureStoreWithGenericPwd.getValue (для: "genericPassword") XCTAssertEqual ("pwd_1235", пароль) } catch (let e) { XCTFail ("Не удалось обновить общий пароль: \ (e.localizedDescription). ") } } // 4 func testRemoveGenericPassword () { делать { попробуйте secureStoreWithGenericPwd.setValue ("pwd_1234", for: "genericPassword") попробуйте secureStoreWithGenericPwd.removeValue (для: "genericPassword") XCTAssertNil (попробуйте secureStoreWithGenericPwd.getValue (для: "genericPassword")) } catch (let e) { XCTFail («Не удалось сохранить общий пароль с помощью \ (e.localizedDescription).») } } // 5 func testRemoveAllGenericPasswords () { делать { попробуйте secureStoreWithGenericPwd.setValue ("pwd_1234", для: "genericPassword") попробуйте secureStoreWithGenericPwd.setValue ("pwd_1235", for: "genericPassword2") попробуйте secureStoreWithGenericPwd.removeAllValues ​​() XCTAssertNil (попробуйте secureStoreWithGenericPwd.getValue (для: "genericPassword")) XCTAssertNil (попробуйте secureStoreWithGenericPwd.getValue (для: "genericPassword2")) } catch (let e) { XCTFail («Не удалось удалить общие пароли с помощью \ (e.localizedDescription).») } } 

    Здесь довольно много чего происходит, поэтому разберем:

    1. testSaveGenericPassword () проверяет, может ли он правильно сохранить пароль.
    2. testReadGenericPassword () сначала сохраняет пароль, затем извлекает пароль, проверяя, совпадает ли он с ожидаемым.
    3. testUpdateGenericPassword () проверяет, сохраняя другой пароль для той же учетной записи, последний пароль - это тот, который ожидается после его извлечения.
    4. testRemoveGenericPassword () проверяет, может ли он удалить пароль для определенной учетной записи.
    5. Наконец, testRemoveAllGenericPasswords проверяет, что все пароли, относящиеся к определенной службе, удалены из Keychain .

    Поскольку ваша оболочка может генерировать исключения, каждый блок catch приводит к сбою тестов, если что-то пойдет не так.

    Проверка работы

    Теперь пора убедиться, что все работает должным образом. Выберите TestHost в качестве активной схемы для вашего проекта Xcode:

    Нажмите Command-U на клавиатуре (или выберите Продукт ▸ Тест в меню), чтобы выполнить модульные тесты.

    Примечание : вам не нужно запускать приложение, как обычно в учебном пособии.В этом руководстве вы проверяете свой код, выполняя модульные тесты.

    Показать навигатор тестов и дождаться выполнения тестов. Как только они закончатся, все пять тестов будут зелеными. Ницца!

    Затем проделайте то же самое с паролями в Интернете.

    Прокрутите до конца класса и прямо перед последней фигурной скобкой добавьте следующее:

     func testSaveInternetPassword () { делать { попробуйте secureStoreWithInternetPwd.setValue ("pwd_1234", for: "internetPassword") } catch (let e) { XCTFail ("Не удалось сохранить интернет-пароль \ (e.localizedDescription). ") } } func testReadInternetPassword () { делать { попробуйте secureStoreWithInternetPwd.setValue ("pwd_1234", for: "internetPassword") let password = попробуйте secureStoreWithInternetPwd.getValue (для: "internetPassword") XCTAssertEqual ("pwd_1234", пароль) } catch (let e) { XCTFail («Не удалось прочитать интернет-пароль с \ (e.localizedDescription).») } } func testUpdateInternetPassword () { делать { попробуйте secureStoreWithInternetPwd.setValue ("pwd_1234", для: "internetPassword") попробуйте secureStoreWithInternetPwd.setValue ("pwd_1235", for: "internetPassword") let password = попробуйте secureStoreWithInternetPwd.getValue (для: "internetPassword") XCTAssertEqual ("pwd_1235", пароль) } catch (let e) { XCTFail («Не удалось обновить интернет-пароль с помощью \ (e.localizedDescription).») } } func testRemoveInternetPassword () { делать { попробуйте secureStoreWithInternetPwd.setValue ("pwd_1234", for: "internetPassword") попробуйте secureStoreWithInternetPwd.removeValue (для: "internetPassword") XCTAssertNil (попробуйте secureStoreWithInternetPwd.getValue (для: "internetPassword")) } catch (let e) { XCTFail («Не удалось удалить интернет-пароль с помощью \ (e.localizedDescription).») } } func testRemoveAllInternetPasswords () { делать { попробуйте secureStoreWithInternetPwd.setValue ("pwd_1234", for: "internetPassword") попробуйте secureStoreWithInternetPwd.setValue ("pwd_1235", for: "internetPassword2") попробуйте secureStoreWithInternetPwd.removeAllValues ​​() XCTAssertNil (попробуйте secureStoreWithInternetPwd.getValue (для: "internetPassword")) XCTAssertNil (попробуйте secureStoreWithInternetPwd.getValue (для: "internetPassword2")) } catch (let e) { XCTFail («Не удалось удалить интернет-пароли с помощью \ (e.localizedDescription).») } } 

    Обратите внимание, что приведенный выше код идентичен ранее проанализированному. Вы только что заменили ссылку secureStoreWithGenericPwd на secureStoreWithInternetPwd .

    Выберите TestHost в качестве активной схемы, если это еще не сделано, и нажмите Command-U на клавиатуре для повторного тестирования. Теперь все тесты, как для общих паролей, так и для интернет-паролей, должны быть зелеными.

    Поздравляем! Теперь у вас есть рабочий автономный фреймворк и модульные тесты.

    Куда идти дальше?

    В этом руководстве вы создали фреймворк, включающий Keychain Services API и даже интегрированные модульные тесты, чтобы доказать, что ваш код работает должным образом.Удивительный!

    Вы можете пойти дальше и поделиться своим кодом с другими людьми, выполнив заключительную часть нашего руководства «Создание платформы для iOS».

    Вы можете загрузить законченную версию проекта, используя кнопку Загрузить материалы вверху или внизу этого руководства.

    Если вы хотите узнать больше, ознакомьтесь с документацией Apple на сайте Keychain Services.

    Стоит отметить, что Keychain не ограничивается паролями.Вы можете хранить конфиденциальную информацию, такую ​​как данные кредитной карты или короткие заметки. Вы также можете сохранять такие элементы, как криптографические ключи и сертификаты, которыми вы управляете с помощью служб сертификатов, ключей и доверия, чтобы проводить безопасные и проверенные транзакции с данными.

    Что вы узнали из этого? Остались вопросы? Хотите поделиться тем, что произошло в процессе? Вы можете обсудить это на форумах. Увидимся там!

    raywenderlich.com Еженедельно

    Райвендерлих.com - это самый простой способ быть в курсе всего, что вам нужно знать как мобильному разработчику.

    Получайте еженедельный дайджест наших руководств и курсов, а в качестве бонуса получите бесплатный углубленный курс по электронной почте!

    .

    Смотрите также