let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = 
storyboard.instantiateViewController(withIdentifier: 
"secondViewController") as! SecondViewController
self.present(secondViewController, animated: true, 
completion: nil)

Blur Background für eine View in Swift:

Dieser Code muss in die viewDidLoad Funktion:

view.backgroundColor = .clear
let blurEffect = UIBlurEffect(style: .extralight)
let blurView = UIVisualEffectView(effect: blurEffect)
blurView.translatesAutoresizingMaskIntoConstraints = false
view.insertSubview(blurView, at: 0)

NSLayoutConstraint.activate([
  blurView.topAnchor.constraint(equalTo: view.topAnchor),
  blurView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
  blurView.heightAnchor.constraint(equalTo: view.heightAnchor),
  blurView.widthAnchor.constraint(equalTo: view.widthAnchor)
])

Problem: Nach wenigen Sekunden stockt das Bild und bleibt schließlich stehen. Abhilfe schafft nur ein Umschalten, und nach einigen Sekunden hängt es wieder.

Ursache: MagentaTV benötigt IGMPv3, Entertain kam mit IGMPv2 aus.

Lösung:

Falls ein Switch zum Einsatz kommt, muss er IGMPv3 unterstützen

Man benötigt für die PFSense / OPNSense das Paket igmp-proxy.

Nach der Installation muss man in den Settings ein UP & Downstream Interface einstellen:

enter image description here

enter image description here

Ausserdem müssen zwei Firewall Regeln auf dem WAN Interface erstellt werden:

Regel für IGMP:

Action: Pass Interface: WAN Address Family: IPv4 Protocoll: IGMP Source: Any Destination: ANY Description: MagentaTV_IGMP Advanced Options: Allow IP Options muss aktiviert sein.

Regel für UDP anlegen:

Action: Pass Interface: WAN Address Family: IPv4 Protocol: UDP Source: Any Destination: ANY Description: MagentaTV_UDP

Wichtig ist die Option "Allow IP Options" Genau diese Option muss dann auch noch in der LAN Firewall Regel "Default allow LAN to any rule" die normalerweise automatisch erstellt wird aktiviert werden.

Stand der Info: 24.05.2021

  1. Batterie abklemmen
  2. Unterbodenverkleidung abschrauben (6 8er Schrauben)
  3. Massekabel abschrauben, Schraube zur Seite legen, siehe #
  4. Getriebeinöleinfüllschraube (Inbus 14) öffnen um sicherzugehen das man das neue Öl einfüllen kann
  5. Getriebeölablassschraube öffnen, Öl ablaufen lassen
  6. Schraube mit neuer Dichtung wieder rein (60nm)
  7. Getriebequerträger abschrauben, zwei 13er in der Mitte + 2 17er an den Seiten
  8. Motor kippt leicht nach hinten
  9. Tachowelle abschrauben (8er)
  10. Kupplungsnehmerzylinder abschrauben (Kupplung muss dann nicht entlüftet werden, 2 Schrauben)
  11. Kardanwelle abschrauben und leicht zusammenschieben (3Schrauben)
  12. Wenn die Hardyscheibe mit gewechselt wird, alle 6 Schrauben entfernen
  13. Schaltgestänge aushaken + Markieren
  14. 10x Getriebeschrauben lockern
  15. Getriebe unterbauen / Getriebeheber
  16. Nach hinten rausziehen und wegheben
  17. Öleinfüllschraube öffnen und ATF III einfüllen bis es seitlich rauskommt, ca 1,7l
  18. Öleinfüllschraube mit neuer Dichtung einschrauben (60nm)
  19. Ausrücklager austauschen, einfach abziehen und wieder einlegen
  20. Getriebestirnseite reinigen (Bremsenreiniger)
  21. Kupplungskorb abschrauben 6x 8er Imbus
  22. Korb und alte Scheibe abnehmen
  23. Neue Scheibe richtigherum rein, Korb dran und zwei Schrauben mit der Hand eindrehen
  24. Kupplungsscheibe mit Dorn zentrieren
  25. Dorn drinlassen und alle Imbus Schrauben über Kreuz anziehen (25nm)
  26. Dorn abziehen
  27. Evtl. Motorseite reinigen (Bremsenreiniger)
  28. Nehmerzylinder über das Getriebe legen
  29. Getriebe wieder reinheben, von hinten einschieben, nicht verkanten
  30. Schrauben wieder eindrehen und Festziehen
  31. Kardanwelle wieder Montieren (45nm)
  32. Restlicher Einbau wie vorher rückwärts

Attention: Application ID changes with every Appstart since iOS 8

do {
    let documentsURL = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    let docs = try FileManager.default.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: [], options:  [.skipsHiddenFiles, .skipsSubdirectoryDescendants])
    let images = docs.filter{ $0.pathExtension == "xxx" }
    print(images)
} catch {
    print(error)
}
    //Delete Image from Notification
    if lentItems.imageURL == nil {
        //no image to delete
    } else {
        let fileManager = FileManager.default
        do {
            try fileManager.removeItem(atPath: lentItems.imageURL!)
        } catch {
            print("Could not delete Image: \(error)")
        }
    }
    do {
        let attachment = try UNNotificationAttachment(identifier: "bild", url: imageURL, options: nil)
        content.attachments = [attachment ]
    } catch {
        print("Attachment could not be loaded" )
    }
    // Create a URL
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
    let imageURL = documentsURL?.appendingPathComponent("\(String(describing: title)).png")


    // save image to URL
    if thumbnailData == nil {
        print("No Picture")
    } else {
        let notificationImage = UIImage(data: thumbnailData as! Data) // or wherever you have your UIImage
        do {
            try UIImagePNGRepresentation(notificationImage!)?.write(to: notificationImageURL!)                    
        } catch {
            print("Couldnt save image" )
        }
    }

In viewDidLoad:

//Dissmiss Keyboard
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(tap)

Function:

//Dismiss Keyboard
@objc func dismissKeyboard() {
    view.endEditing(true)
}
    //MARK: Contacts

    func checkContactsStatus() {
        let status = CNContactStore.authorizationStatus(for: .contacts)
        if status == .denied || status == .restricted {
            presentSettingsActionSheet()
            return
        }
    }

   //Ask for Contact Permissions
    func presentSettingsActionSheet() {
        let alert = UIAlertController(title: "Permission to Contacts", message: "This app needs access to contacts in order to ...", preferredStyle: .actionSheet)
        alert.addAction(UIAlertAction(title: "Go to Settings", style: .default) { _ in
            let url = URL(string: UIApplicationOpenSettingsURLString)!
            UIApplication.shared.open(url)
        })
        alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
        present(alert, animated: true)
    }

    func contactPicker(_ picker: CNContactPickerViewController,
                       didSelect contactProperty: CNContactProperty) {

    }

    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        // You can fetch selected name and number in the following way

        // user name
        let userName:String = contact.givenName
        let surName:String = contact.familyName
        let fullName:String = userName + " " + surName
        print(fullName)
        contactTextField.text = fullName

//         user phone number
//        let userPhoneNumbers:[CNLabeledValue<CNPhoneNumber>] = contact.phoneNumbers
//        let firstPhoneNumber:CNPhoneNumber = userPhoneNumbers[0].value

        // user phone number string
//        let primaryPhoneNumberStr:String = firstPhoneNumber.stringValue
//        print(primaryPhoneNumberStr)
    }

    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {

    }

    func chooseContact() {
        let contactPicker = CNContactPickerViewController()
        contactPicker.delegate = self
        contactPicker.displayedPropertyKeys =
            [CNContactGivenNameKey
                , CNContactPhoneNumbersKey]
        self.present(contactPicker, animated: true, completion: nil)
    }

Info.plist

<key>NSContactsUsageDescription</key>
<string>This app requires contacts access to function properly.</string>