Задать вопрос
  • Как реализовать простое подключение NEVPNManager?

    doublench21
    @doublench21 Куратор тега Swift
    Сколько бы я не искал, пытался найти, подробной информации и примера кода нигде нет.

    Что-то крайне хреново Вы искали.

    blog.moatazthenervous.com/create-a-vpn-connection-...
    blog.moatazthenervous.com/create-a-key-chain-for-a...
    https://stackoverflow.com/questions/47351441/vpn-c...

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

    P.S. И денег не надо. Welcome!
    Ответ написан
  • Какие инструменты для дизайнера мобильных приложений?

    doublench21
    @doublench21
    Душите таких дизайнеров и НИ в коем случаи не делайте за них работу. Заставляйте использовать такие инструменты как Principle, InVision Studio, Adobe XD.
    Ответ написан
    Комментировать
  • Как в Swift в консольном приложении получить параметры его запуска?

    doublench21
    @doublench21 Куратор тега Swift
    Ну что значит как. У Вас есть Swift. У Swift есть стандартная библиотека, которую подключать конечно же не надо, она и так доступна. Очевидно она умеет делать такие базовые вещи. Та дам https://developer.apple.com/documentation/swift/co... Ну а дальше гугл вам поможет.
    Ответ написан
    1 комментарий
  • Как получить текст смс?

    doublench21
    @doublench21 Куратор тега Swift
    Читать сообщения конечно же нельзя. Но начиная с iOS 12 у Вас есть возможность получить код подтверждения для вашего приложения, присланное смской.

    if #available(iOS 12, *) {
      textField.textContentType = .oneTimeCode
    }
    Ответ написан
    2 комментария
  • Как отключить "Жирный шрифт" в приложении, который включен для всей системы?

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

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

    По умолчанию шрифт полученный методами preferredFont(forTextStyle:), preferredFont(forTextStyle:compatibleWith:) и от UIFontMetrics включает это свойство, для остальных шрифтов - отключён. Вот ваш способ и сработал.
    Ответ написан
    Комментировать
  • Как разблокировать пользователю интерфейс при скроле таблицы?

    doublench21
    @doublench21 Куратор тега Swift
    Проблема(если это вообще можно назвать проблемой) заключается в том, что UITableView не пропускает ивенты UIEvent во время скролла своим сабвьюхам. Поэтому ваш UIDatePicker и не получает никаких касаний(ивентов UIEvent), до тех пор, пока не остановить таблицу.

    Решений тут может быть несколько:
    1) Переопределять метод
    func hitTest(_ point: CGPoint,  with event: UIEvent?) -> UIView?
    у UITableView;
    2) https://stackoverflow.com/questions/16882737/scrol... ;
    Ответ написан
    Комментировать
  • Как использование базы данных SQLite в Swift 4.2?

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

    В порядке убывания сложности:
    GRDB
    SQLite Swift
    Core Data
    Ответ написан
    1 комментарий
  • Может ли iOS очистить значения свойств класса?

    doublench21
    @doublench21 Куратор тега Swift
    Если у Вас действительно такой кэш, какой вы показали, то это ужасно.

    По делу: само по себе свойство не может очиститься. Либо система посчитает нужным и полностью выбросит ваше приложение из памяти, либо вы вернётесь, как ни в чем не бывало.
    Ответ написан
    3 комментария
  • Может ли iOS background приложение показать картинку?

    doublench21
    @doublench21
    Вот вы хоть сами понимаете, что такого просто не может быть? НУ кто Вам в здравом уме позволит ни с того ни с сего, по Вашему хотению(имеется ввиду ваше приложение), что-то вообще делать, если Ваше приложение неактивно, а уж тем более показывать картинку ПОВЕРХ. Конечно такого нет, не было и никогда не будет. Всё что Вы можете, это делать переодически, некоторое количество вещей(смотрите документацию), которые обычно связаны с небольшими запросами получения информации из вне.

    То есть Вы ограничены как по времени, так и по перечню действий, который никогда ничего не могут отобразить. Когда Вы закрываете приложение, у Вас есть всего некоторое кол-во времени, которое даётся на то, что бы Вы успели, скажем закрыть коннект к БД или сделать что-то ещё. Если этого времени не хватает, можете запросить у системы ещё. С большой вероятностью система даст добро, но опять таки - это время будет крайне малым. Секунды.
    А что касается периодических действий в фоне по графику, то они крайне скудны и направлены лишь на получение какой-либо информации.

    В общем и целом, это единственный верный и нужный способ взаимодействий приложения в фоне. Это и называется так, потому-что НИКТО не хочет, что бы приложение которое я закрыл, что-то пыталось мне впихнуть. Очевидно этого никогда не будет и ... правильно. Apple в этом плане молодцы!
    Ответ написан
    1 комментарий
  • Как из NSSet преобразовать в другой тип?

    doublench21
    @doublench21 Куратор тега Swift
    5b8d4b617ba06911513554.png
    У меня тут для NSSet, если у Вас там NSSet?, то Вы знаете что делать.
    Ответ написан
    1 комментарий
  • Как работают вложенные функции?

    doublench21
    @doublench21 Куратор тега Swift
    Доброго времени суток. Вопрос немного странный.

    Вопрос 1
    Достаточно зайти вот сюда и обнаружить, что метод auth всего лишь возвращает инстанц класса FIRAuth Собственно все ваши currentUser тут присутствуют. Думаю теперь вопросов быть не должно.
    spoiler
    @implementation FIRAuth {
      /** @var _currentUser
          @brief The current user.
       */
      FIRUser *_currentUser;
    
      /** @var _firebaseAppName
          @brief The Firebase app name.
       */
      NSString *_firebaseAppName;
    
      /** @var _listenerHandles
          @brief Handles returned from @c NSNotificationCenter for blocks which are "auth state did
              change" notification listeners.
          @remarks Mutations should occur within a @syncronized(self) context.
       */
      NSMutableArray<FIRAuthStateDidChangeListenerHandle> *_listenerHandles;
    
      /** @var _keychain
          @brief The keychain service.
       */
      FIRAuthKeychain *_keychain;
    
      /** @var _lastNotifiedUserToken
          @brief The user access (ID) token used last time for posting auth state changed notification.
       */
      NSString *_lastNotifiedUserToken;
    
      /** @var _autoRefreshTokens
          @brief This flag denotes whether or not tokens should be automatically refreshed.
          @remarks Will only be set to @YES if the another Firebase service is included (additionally to
            Firebase Auth).
       */
      BOOL _autoRefreshTokens;
    
      /** @var _autoRefreshScheduled
          @brief Whether or not token auto-refresh is currently scheduled.
       */
      BOOL _autoRefreshScheduled;
    
      /** @var _isAppInBackground
          @brief A flag that is set to YES if the app is put in the background and no when the app is
              returned to the foreground.
       */
      BOOL _isAppInBackground;
    
      /** @var _applicationDidBecomeActiveObserver
          @brief An opaque object to act as the observer for UIApplicationDidBecomeActiveNotification.
       */
      id<NSObject> _applicationDidBecomeActiveObserver;
    
      /** @var _applicationDidBecomeActiveObserver
          @brief An opaque object to act as the observer for
              UIApplicationDidEnterBackgroundNotification.
       */
      id<NSObject> _applicationDidEnterBackgroundObserver;
    }

    Представить это можно так:
    class Auth {
     class func auth() -> FIRAuth { ... }
     ...
    }
    
    class FIRAuth {
      var currentUser: FIRUser?
      ...
    }
    
    class FIRUser {
     var providerData: [Int : {что-то}]
     ...
    }
    
    Auth.auth().currentUser?.providerData[indexPath.row]


    Вопрос 2
    Кажется ещё более странным. Вы ведь знаете что такое опционал?! Тогда неужели Вы забыли, что метод может возвращать любое значение, в том числе и опционал. Теперь становится ясно, что с любым опционалом мы также можем применить опциональную цепочку, что собственно тут и было сделано.
    FUIAuth.defaultAuthUI() возвращает опционал. Почему бы и не продолжить цепочку. Продолжаем:
    FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication)
    Но как не странно этот метод тоже возвращает опционал и мы просто хотим себя от этого обезопасить и сказать, что если на последнем методе тоже будет опционал, то верни правую часть, то бишь false. В итоге получаем общую картину:
    FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false
    Ответ написан
    2 комментария
  • Как извлечь файл из ресурсов приложения в папку с программой или иной путь?

    doublench21
    @doublench21
    Это реверс инженеринг. Открываете бинарник любым hex редактором и ищите сигнатуру .jpg

    Повезёт если изображение хранится как есть, если нет, то нужно искать сигнатуру того во что она обёрнута.

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

    В самом простом случае бегаете по всем байтам и ищите маркер начала jpg (0xFF 0xD8) и маркер конца jpg (0xFF 0xD9)
    Теперь все такие случаи, а точнее все байты включая маркеры начала и конца скармливаете функции( не знаю какая там у Вас есть, которая преобразует байты в JPEG, ту и берите) Ну собственно и все.
    Ответ написан
    1 комментарий
  • Возможно ли отправлять push для ios c сайта?

    doublench21
    @doublench21
    Нельзя. Safari iOS не поддерживает "push notification" и "serviceworker". Уведомления могут получать лишь приложения.
    Ответ написан
    Комментировать
  • C - Как в массиве найти наибольшую подпоследовательность полных квадратов?

    doublench21
    @doublench21
    А Вы вообще понимаете, что такое максимальная подпоследовательность ? Судя по вашему алгоритму - нет.
    Да и код Вы под чем пишите? Под пивом? Всё пляшет как ни знаю как.

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <math.h>
    
    void ent(int * arrayName, int arraySize) {
         // int i; Так давно уже писать не нужно
    
            for (int i = 0; i < arraySize; i++) {
                printf("a[%i] = ", i);
                scanf("%i", & arrayName[i]);
            }
    }
    
    void proc(int * arrayName, int arraySize) {
        int repeat = 0, maxRepeat = 0;
    
        for (int i = 0; i < arraySize; ++i) {
            if (checkSquareNumber(arrayName[i])) {
                printf("%d - full square \n", arrayName[i]);
                repeat++;
            } else {
                repeat = 0;
            }
            maxRepeat = repeat > maxRepeat ? repeat : maxRepeat;
        }
    
        printf("Max otrezok = %d \n", repeat); // Забыли как будет слово отрезок на английском? 
    }
    
    int checkSquareNumber(int number) {
        if (number == 0 || number == 1)
            return 1;
    
        if (number % 4 == 0 || number % 9 == 0)
            return 1;
    
        if (number % 8 == 1 || number % 3 == 1)
            return 1;
    
        return 0;
    }
    
    void printArray(int * arrayName, int arraySize) {
        // int i; Так давно уже писать не нужно
        for (int i = 0; i < arraySize; ++i) {
            printf("%d ", arrayName[i]);
        }
    }
    
    void main() {
        int i;
        int n; //
        int squar = 0;
    
        printf("Size Massive: "); // Забыли как будет слово массив на английском? 
        scanf("%d", & n);
    
        int Arr[n];
        ent(Arr, n);
    
        printf("Array: ");
        printArray(Arr, n);
    
        printf("\n");
    
        proc(Arr, n);
    
        system("pause");
    }
    Ответ написан
    1 комментарий
  • Какой правильный путь становления iOS developer?

    doublench21
    @doublench21
    Только Swift. Тут даже говорить особо не нужно.

    С - писать что-то на С под iOS в 99% случаев не нужно. Разве что Вам вот срочно нужен какой-то специфичный участок поднять в производительности и Вы пишете его на С. Затем пишите обвязку вашего кода на Swift и собственно вызываете его. Но я таких случаев вспомнить не могу.
    Swift и Obj-c отлично дружат с С, но никак не с С++.

    Obj-c - совершенно не нужен, как новичку который вливается в эту тему. Язык остаётся всё больше в прошлом с каждым днём. Всё возможности с лихвой покрываются языком Swift. Основной фактор - Apple сама продвигает всё к Swift

    Swift - новый/модный/се*суальный. Если серьезно, то язык уже очень сильно вырос, хотя и является довольном молодым. Огромная работа проводится над ним ежедневно, достаточно глянуть на кол-во коммитов в репозитории языка на GitHub. Скоро будет достигнут самый важный рубеж - это ABI.

    Язык имеет выразительный синтаксис. Огромные возможности ПОП и сильную поддержку дженериков во всех проявлениях. Довольно быстрый язык. Тут можно глянуть, что язык на данный момент является самым быстрым ООП языком, не учитывая конечно С/С++ и Rust(хотя Rust в каком то смысле и не ООП)

    Этот язык не зря недавно выбрали разработчики Tensorflow. Тут описано почему именно его, а не другие.

    Немного ушли от темы iOS Dev. Тут однозначно только Swift. Учебник Swift от Apple. Дальше можно взять Стэнфордские курсы iOS 11(есть на русском). А дальше уже от Вас зависит.
    Ответ написан
    2 комментария
  • Как передать индекс ячейки для каждой из двух кнопок?

    doublench21
    @doublench21 Куратор тега Swift
    Смотря где вы обрабатываете нажатие? Внутри самой ячейки ?

    UPD
    Можно выкрутиться так: super.tableView.indexPath(for: self)
    НО это неправильный подход, Почитайте про MVC. Не нужно этого делать внутри ячейки.

    @IBAction func change(sender: UIButton) {
      
       for case let mycell as MyCustomCell in tableView.visibleCells where mycell.changeButton === sender {
          let indexPath = tableView.indexPath(for: myCell)
         // ...
       }
    
    }
    Ответ написан
  • Как в swift преобразовать кодироку строки?

    doublench21
    @doublench21 Куратор тега Swift
    let str = "Привет Как дела"  // Внутренняя кодировка Свифта utf-32
    
    let cp1251Data = str.data(using: .windowsCP1251) 
    let utf8Data = str.data(using: .utf8)
    
    cp1251Data.count // 15
    utf8Data.count // 28
    
    // ***********************************
    
    let session = URLSession.shared
    var URL = URL(string: "https://greatcomments.server/add")!
    var request = URLRequest(url: URL)
    request.httpMethod = "POST"
        
     // Headers
    request.addValue("application/x-www-form-urlencoded; charset=windows-1251", forHTTPHeaderField: "Content-Type")
    
    // Form URL-Encoded Body 
    let bodyParameters = [
         "comment": "Проверка",
    ]
    let bodyString = bodyParameters.queryParameters
    request.httpBody = bodyString.data(using: . win1251, allowLossyConversion: true)
    
    let task = session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) -> Void in
          if (error == nil) {
            // Success
            let statusCode = (response as! HTTPURLResponse).statusCode
            print("URL Session Task Succeeded: HTTP \(statusCode)")
          }
          else {
            // Failure
            print("URL Session Task Failed: %@", error!.localizedDescription);
          }
        })
    task.resume()
    session.finishTasksAndInvalidate()
    
    
    // ***********************************
    
    protocol URLQueryParameterStringConvertible {
      var queryParameters: String {get}
    }
    
    extension Dictionary : URLQueryParameterStringConvertible {
      var queryParameters: String {
        var parts: [String] = []
        for (key, value) in self {
          let part = String(format: "%@=%@",
                            String(describing: key).win1251Encoded,
                            String(describing: value).win1251Encoded)
          parts.append(part as String)
        }
        return parts.joined(separator: "&")
      }
      
    }
    
    extension URL {
      func appendingQueryParameters(_ parametersDictionary : [String: String]) -> URL {
        let URLString : String = String(format: "%@?%@", self.absoluteString, parametersDictionary.queryParameters)
        return URL(string: URLString)!
      }
    }
    
    // Раньше Swift(Foundation) позволял любую строку закодировать в url-encode в любой кодировке. 
    // Сейчас же де факто это можно лишь сделать в utf-8. 
    // Видимо Apple аргументирует это тем,  что utf-8 - это стандарт в вебе. 
    
    // Да всех остальных случаев нужно писать такую функцию самому. 
    // Ниже кодировка в url-encode в windows-1251
    
    extension CharacterSet {
      static let rfc3986Unreserved = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~=&+")
    }
    
    extension String.Encoding {
      static let win1251 = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.windowsCyrillic.rawValue)))
    }
    
    extension String {
      func addingPercentEncoding(withAllowedCharacters characterSet: CharacterSet, using encoding: String.Encoding) -> String {
        let stringData = self.data(using: encoding, allowLossyConversion: true) ?? Data()
        let percentEscaped = stringData.map {byte->String in
          if characterSet.contains(UnicodeScalar(byte)) {
            return String(UnicodeScalar(byte))
          } else if byte == UInt8(ascii: " ") {
            return "+"
          } else {
            return String(format: "%%%02X", byte)
          }
          }.joined()
        return percentEscaped
      }
      
      var win1251Encoded: String {
        return self.addingPercentEncoding(withAllowedCharacters: .rfc3986Unreserved,  using: . win1251)
      }
    }
    Ответ написан
  • Бледный текст в браузере Сафари, как можно исправить?

    doublench21
    @doublench21
    macOS 10.13.5
    Safari Version 11.1.1 (13605.2.8)

    5b40ecd9c124e687142108.jpeg
    Ответ написан
    Комментировать
  • Как вызвать функцию из другого класса, которая без типа?

    doublench21
    @doublench21 Куратор тега Swift
    А Вы уверенны что знаете язык Swift? Судя по коду и вопросу - нет.
    Нужно понимать, что такое метод типа, а что такое инстанц метод.

    Метод типа определяется так. Ключевое слово static может быть заменено на class(но это не важно)
    class Printer {
      static func mustprint() {
        print ("was printed")
      }
    }


    И вызывается так
    Printer.mustprint()

    ----------

    А то что Вы написали, это инстанц метод
    class Printer {
       func mustprint() {
        print ("was printed")
      }
    }


    И вызывается он сначала путём создание инстанца этого класса, а затем вызова функции.
    let printer = Printer(); printer.mustprint()

    ----------

    О чём Вам тут и говорят: "Instance member 'mustprint' cannot be used on type 'Printer'; "
    Ответ написан
    3 комментария