Unterschrift mit dem iPhone

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Unterschrift mit dem iPhone

    Hallo und guten Morgen zusammen,

    ich hätte mal eine Frage zu einem ganz speziellen Thema.
    Ich habe eine App für macOS in Swift mit SwiftUI programmiert. Läuft wunderbar. Ich möchte diese App jetzt um eine spezielle Funktion erweitern.

    In der Vorschau gibt es ja den Button "Unterschreiben", mit dem man in pdf seine Unterschrift über das iPhone / iPad einfügen kann. Tolles Feature, das ich gerne auch in meiner App nutzen möchte.
    Gibt es hierzu eine API oder ein Kit von Apple, das ich verwenden kann? Oder ist das nur auf pdf beschränkt?

    Ziel sollte sein, dass ich in meiner App am Mac einen Button klicke, dann öffnet auf dem iPhone die Signatur, der Kunde unterschreibt und ich habe die Unterschrift als Grafik auf meinem Mac in der App.

    Schönen Tag und Dank schon mal im Voraus für eure Unterstützung.
  • mihema schrieb:

    Gibt es hierzu eine API oder ein Kit von Apple, das ich verwenden kann? Oder ist das nur auf pdf beschränkt?


    Ziel sollte sein, dass ich in meiner App am Mac einen Button klicke, dann öffnet auf dem iPhone die Signatur, der Kunde unterschreibt und ich habe die Unterschrift als Grafik auf meinem Mac in der App.
    Ein Framework oder ähnliches hierzu wäre mir neu - wobei ich langsam den Überblick verliere. Wenn man allerdings davon ausgeht, dass Dir eine "einfache digitale Signatur" ausreicht, ist die Anforderung doch eher überschaubar:

    Du hast eine UIView, der Du z. B. einen UIPanGestureRecognizer hinzufügt. In dessen Action aktualisiert Du je nach State einen UIBezierPath, so dass er die Positionen der Geste abbildet. Diesen Pfad zeichnest Du auch in der View, damit der Benutzer seine "Unterschrift" sehen kann.

    Für die Übergabe des Pfades an eine Mac-App wirst Du selber serialisieren müssen, da AppKit und UIKit unterschiedliche Pfad-Klassen haben: Zum Beispiel speicherst Du die Elementart und deren Anker- / Kontrollpunkte in einem eigenen NSData-Objekt, welches per Key-Value-Store über iCloud gesynced wird. Oder Dir reicht die Grafik, dann kannst Du z. B. die JPEGRepresentation übertragen. Oder wolltest Du wirklich nur eine Grafik-Datei auf macOS, dann könntest Du z. B. entweder in der Foto-Galerie speichern oder ein Datei in iCloud-Drive packen. Oder ... oder ... oder - je nach Deinen Anforderungen.

    Nur als grober Ansatz, Mattes - aber vielleicht übersehe ich auch eine noch einfachere Lösung

    P.S.: Und für den Fall, dass Du es gar nicht selber programmieren willst, findest Du über Google ("uikit draw signature") x Lösungsansätze, Code oder schon fertige CocoaPods...
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von MyMattes () aus folgendem Grund: Google- / CocoaPods-Verweis ergänzt.

  • Hallo Mattes,

    danke für die schnelle Antwort. Ich habe auch schon befürchtet, dass es doch eine ziemliche Bastelei werden wird. Hatte gehofft, dass Apple hier schon was fertiges hat, was man verwenden kann, weil es das ja in der Vorschau schon gibt.

    Die Pods hatte ich auch schon entdeckt, aber die sind ja alle eher für iOS und ich müsste die dann ja von meiner App aus ansprechen / ansteuern können.

    Naja, mal schauen, vielleicht findet sich ja noch was.
  • mihema schrieb:


    Die Pods hatte ich auch schon entdeckt, aber die sind ja alle eher für iOS und ich müsste die dann ja von meiner App aus ansprechen / ansteuern können.
    So wie ich Dich verstanden habe, brauchst Du aber doch auch eine iOS-App, denn dort soll die Unterschrift ja erfolgen. Das iPhone von macOS heraus nur als Tablet zu verwenden, geht (ohne App) m. W. nicht: Also eine iOS-App zum Signieren, die Graphik z. B. in einen gemeinsamen Key-Value-Store in der iCloud packen und von der macOS heraus abfragen…

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Mal jetzt vom geschäftlichen Standpunkt aus gesehen. Ich unterschreibe doch nichts, von dem ich nicht weiss, was ich unterschreibe. Daher möchte ich, wenn ich unterschreibe, auch sehen, was, und dies muss unveränderlich sein!

    Ohne mich um die technischen Details zu kümmern, gibt es da nach meiner Meinung nur 3 Möglichkeiten:
    - PDF
    - In der App (Tablet) ist alles ersichtlich und dort wird direkt unterschrieben...
    - Auf dem Mac wird unterschrieben, mit einer direkt sichtbaren Quittung.

    Das blinde Unterschreiben von einen Gast von irgendwas, das würde ich nicht dulden. Sorry, deine aktuelle Idee, nenne ich jetzt Humbug... ausser du zeigst mir hierfür einen vernünftigen Grund auf.
  • Soweit schon mal der erste Schritt: ein PDF erstellen, in dem eine Annotation von der Art "Signature" enthalten ist.
    Was jetzt noch fehlt, ist das Aufrufen des iPhones für die Unterschrift, die Übergabe der selben zurück in den Annotation-Container. (mal laienhaft ausgedrückt)

    Quellcode: Unterschrift.swift

    1. //
    2. // Unterschrift.swift
    3. // justCare
    4. //
    5. // Created by Mischa Heißmann on 30.07.2023.
    6. //
    7. import SwiftUI
    8. import PDFKit
    9. class Unterschrift {
    10. var pageWidth:CGFloat
    11. var pageHeight:CGFloat
    12. var pageRect: CGRect
    13. var page: Int = 1
    14. var printDate: Date = Date()
    15. var reportTitle: String = ""
    16. var destPath: URL? = nil
    17. init() {
    18. self.pageWidth = (5.0 / 2.54) * 72
    19. self.pageHeight = (3.0 / 2.54) * 72
    20. self.pageRect = CGRect(x:0, y:0, width: pageWidth, height: pageHeight)
    21. }
    22. var pdfContext = CGContext(data: nil,
    23. width: 0,
    24. height: 0,
    25. bitsPerComponent: 1,
    26. bytesPerRow: 1,
    27. space: CGColorSpace.init(name: CGColorSpace.sRGB)!,
    28. bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)
    29. var tmpImg: NSImage? = nil
    30. var imgRec: NSRect? = nil
    31. func createPDF() -> URL {
    32. let documentInfo:[String:String] = [
    33. String(kCGPDFContextAuthor): "Mein Name",
    34. String(kCGPDFContextTitle): "Unterschrift",
    35. String(kCGPDFContextCreator): "Meine App"
    36. ]
    37. let manager = FileManager.default
    38. destPath = manager.url(forUbiquityContainerIdentifier: nil)?.appending(path: "Documents")
    39. .appending(path: "WhatEver")
    40. .appending(path: "Unterschriften")
    41. try? manager.createDirectory(at: destPath!, withIntermediateDirectories: true, attributes: nil)
    42. let fileDateFormatter = DateFormatter()
    43. fileDateFormatter.dateFormat = "yyyyMMdd"
    44. let fileName = "\(fileDateFormatter.string(from: Date.now)) - Unterschrift.pdf"
    45. destPath?.appendPathComponent(fileName)
    46. pdfContext = CGContext(destPath! as CFURL, mediaBox: &pageRect, documentInfo as CFDictionary)
    47. // This must be called to begin a page in a PDF document
    48. pdfContext!.beginPDFPage(nil)
    49. drawHorLine(thickness: 0.5)
    50. pdfContext!.endPDFPage()
    51. pdfContext!.closePDF()
    52. let ba = PDFDocument(url: destPath!)
    53. ba?.page(at: 0)?.addAnnotation(addAnnotation())
    54. ba?.write(to: destPath!)
    55. return destPath!
    56. }
    57. /// Draws a horizontal line full width at the given vertical position
    58. /// - Parameter posY: Double - Position where to draw the line
    59. func drawHorLine(thickness: Double = 0.5) {
    60. pdfContext?.move(to: CGPoint(x: 0, y: 10))
    61. pdfContext?.setLineWidth(thickness)
    62. pdfContext?.setStrokeColor(NSColor.black.cgColor)
    63. pdfContext?.addLine(to: CGPoint(x: self.textRect.width, y: 10))
    64. pdfContext?.strokePath()
    65. }
    66. func addAnnotation() ->PDFAnnotation {
    67. let annotation = PDFAnnotation(bounds: CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight), forType: PDFAnnotationSubtype.widget, withProperties: nil)
    68. annotation.backgroundColor = .blue
    69. annotation.fieldName = "signature"
    70. annotation.widgetFieldType = .signature
    71. annotation.shouldDisplay = true
    72. annotation.shouldPrint = true
    73. annotation.widgetControlType = .unknownControl
    74. annotation.draw(with: PDFDisplayBox(rawValue: 0)!, in: pdfContext!)
    75. return annotation
    76. }
    77. }
    Alles anzeigen
    Dateien
    • Unterschrift.txt

      (2,88 kB, 2 mal heruntergeladen, zuletzt: )