Sử dụng Google Đăng nhập cho iOS với Trình quản lý gói Swift

Dec 28 2020

Tương tự như Xây dựng ứng dụng iOS có Google Sign hỗ trợ cho Mac , tôi đã nhúng khung Đăng nhập Google cho iOS và gói vào một dự án Xcode, nhưng tôi chỉ nhắm mục tiêu đến iOS. Nhu cầu của tôi trong việc này là sử dụng Trình quản lý gói Swift với Đăng nhập bằng Google dành cho iOS.

Tôi đang tạo câu hỏi này để thêm giải pháp hiện tại của tôi cho vấn đề này và để xem liệu những người khác có giải pháp hay không. Và để cố gắng khuyến khích Google hỗ trợ Trình quản lý gói Swift bằng Google Đăng nhập cho iOS :).

Trả lời

1 ChrisPrince Dec 28 2020 at 02:34

Vì vậy, tôi đã tạo phiên bản XCFramework của Google Sign. Xemhttps://github.com/SyncServerII/GSignIn.git. Cho đến nay, điều đó đang cho phép thử nghiệm và phát triển với Xcode iOS Simulator và trên các thiết bị iOS thực tế.

Sau khi được tạo, điều này được sử dụng trong tệp kê khai Package.swift như:

        .binaryTarget(
            // This was generated using https://github.com/SyncServerII/GSignIn.git
            name: "GSignIn",
            path: "Frameworks/GSignIn.xcframework"
        ),

(Xem thêm https://github.com/SyncServerII/iOSGoogle/blob/main/Package.swift cho một ví dụ hoàn chỉnh).

Các vấn đề cho đến nay:

  1. Tôi dường như không thể truy cập vào nội dung gói. Tôi đã phải tạo một nút Đăng nhập Google mới. Không phải là vấn đề lớn, nhưng để hoàn thiện, tôi muốn có quyền truy cập vào nút Google mà khung Đăng nhập Google cung cấp.

  2. Gói này phụ thuộc vào một phiên bản Đăng nhập bằng Google cụ thể. Cập nhật nó sẽ yêu cầu đi vàohttps://github.com/SyncServerII/GSignIn.git và cập nhật thủ công dựa trên các cập nhật cho khuôn khổ Đăng nhập của Google.

Tôi vẫn chưa triển khai ứng dụng bằng gói này cho cửa hàng ứng dụng nên đó là một ẩn số tại thời điểm này.

- Cập nhật -

28/12/20 (Đã giải quyết-- xem bản cập nhật 1/1/21 bên dưới): Tôi cũng nên lưu ý rằng tôi đang nhận được cảnh báo cho thư viện này trong tiện ích chia sẻ của mình:

ld: warning: liên kết chống lại một dylib không an toàn để sử dụng trong các tiện ích mở rộng ứng dụng: /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Products/Debug-iphoneos/GSignIn.Inframework/GSignIn.

khi tôi xây dựng với khung này trong ứng dụng mục tiêu của mình, có tiện ích mở rộng chia sẻ. Tôi vẫn chưa thử tải ứng dụng này lên cửa hàng ứng dụng, vì vậy không biết điều gì sẽ xảy ra sau đó.

29/12/20 (Đã giải quyết-- xem bản cập nhật 1/1/21 bên dưới): Trước đây tôi đang xây dựng với gói Đăng nhập bằng Google được kéo vào ứng dụng của tôi từ một thư mục cục bộ. Tôi vừa thử chuyển từ không kéo vào mà chỉ dựa vào nó như một gói nhanh trong ứng dụng của mình, được tham chiếu bằng cách sử dụng repo Github của nó. Và điều đó phá vỡ bản dựng với nhiều lỗi trình liên kết khó hiểu như sau:

Showing All Messages
Ld /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Products/Debug-iphoneos/Share\ Extension.appex/Share\ Extension normal (in target 'Share Extension' from project 'Neebla')
    cd /Users/chris/Developer/Neebla
    /Applications/Xcode-12.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -target arm64-apple-ios14.0 -isysroot /Applications/Xcode-12.3.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.3.sdk -L/Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Products/Debug-iphoneos -F/Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Products/Debug-iphoneos -filelist /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/Neebla.build/Debug-iphoneos/Share\ Extension.build/Objects-normal/arm64/Share\ Extension.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -Xlinker -rpath -Xlinker @executable_path/../../Frameworks -dead_strip -Xlinker -object_path_lto -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/Neebla.build/Debug-iphoneos/Share\ Extension.build/Objects-normal/arm64/Share\ Extension_lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -fembed-bitcode-marker -fapplication-extension -fobjc-link-runtime -L/Applications/Xcode-12.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos -L/usr/lib/swift -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/Neebla.build/Debug-iphoneos/Share\ Extension.build/Objects-normal/arm64/Share_Extension.swiftmodule -lc++ -framework Accelerate -e _NSExtensionMain -Xlinker -no_adhoc_codesign -Xlinker -dependency_info -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/Neebla.build/Debug-iphoneos/Share\ Extension.build/Objects-normal/arm64/Share\ Extension_dependency_info.dat -o /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Products/Debug-iphoneos/Share\ Extension.appex/Share\ Extension -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/iOSFacebook.build/Debug-iphoneos/iOSFacebook.build/Objects-normal/arm64/iOSFacebook.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/iOSSignIn.build/Debug-iphoneos/iOSSignIn.build/Objects-normal/arm64/iOSSignIn.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/ServerShared.build/Debug-iphoneos/ServerShared.build/Objects-normal/arm64/ServerShared.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/PersistentValue.build/Debug-iphoneos/PersistentValue.build/Objects-normal/arm64/PersistentValue.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/SwiftyUserDefaults.build/Debug-iphoneos/SwiftyUserDefaults.build/Objects-normal/arm64/SwiftyUserDefaults.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/KeychainAccess.build/Debug-iphoneos/KeychainAccess.build/Objects-normal/arm64/KeychainAccess.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/iOSShared.build/Debug-iphoneos/iOSShared.build/Objects-normal/arm64/iOSShared.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/swift-log.build/Debug-iphoneos/Logging.build/Objects-normal/arm64/Logging.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/SQLite.swift.build/Debug-iphoneos/SQLite.build/Objects-normal/arm64/SQLite.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/Facebook.build/Debug-iphoneos/FacebookLogin.build/Objects-normal/arm64/FacebookLogin.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/Facebook.build/Debug-iphoneos/FacebookCore.build/Objects-normal/arm64/FacebookCore.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/Facebook.build/Debug-iphoneos/FacebookShare.build/Objects-normal/arm64/FacebookShare.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/iOSDropbox.build/Debug-iphoneos/iOSDropbox.build/Objects-normal/arm64/iOSDropbox.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/SwiftyDropbox.build/Debug-iphoneos/SwiftyDropbox.build/Objects-normal/arm64/SwiftyDropbox.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/Alamofire.build/Debug-iphoneos/Alamofire.build/Objects-normal/arm64/Alamofire.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/ImageIOSwift.build/Debug-iphoneos/ImageIOUIKit.build/Objects-normal/arm64/ImageIOUIKit.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/ImageIOSwift.build/Debug-iphoneos/ImageIOSwift.build/Objects-normal/arm64/ImageIOSwift.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/SMLinkPreview.build/Debug-iphoneos/SMLinkPreview.build/Objects-normal/arm64/SMLinkPreview.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/swift-log-file.build/Debug-iphoneos/FileLogging.build/Objects-normal/arm64/FileLogging.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/iOSBasics.build/Debug-iphoneos/iOSBasics.build/Objects-normal/arm64/iOSBasics.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/Version.build/Debug-iphoneos/Version.build/Objects-normal/arm64/Version.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/ChangeResolvers.build/Debug-iphoneos/ChangeResolvers.build/Objects-normal/arm64/ChangeResolvers.swiftmodule -Xlinker -add_ast_path -Xlinker /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Intermediates.noindex/ServerAccount.build/Debug-iphoneos/ServerAccount.build/Objects-normal/arm64/ServerAccount.swiftmodule

ld: warning: linking against a dylib which is not safe for use in application extensions: /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Products/Debug-iphoneos/GSignIn.framework/GSignIn
Undefined symbols for architecture arm64:
  "iOSGoogle.GoogleHashing.init() -> iOSGoogle.GoogleHashing", referenced from:
      Share_Extension.ServerInterface.addHashingForCloudStorageSignIns(hashingManager: iOSShared.HashingManager) throws -> () in ServerInterface+CloudHashing.o
  "type metadata for iOSGoogle.GoogleHashing", referenced from:
      Share_Extension.ServerInterface.addHashingForCloudStorageSignIns(hashingManager: iOSShared.HashingManager) throws -> () in ServerInterface+CloudHashing.o
  "protocol witness table for iOSGoogle.GoogleHashing : iOSShared.CloudStorageHashing in iOSGoogle", referenced from:
      Share_Extension.ServerInterface.addHashingForCloudStorageSignIns(hashingManager: iOSShared.HashingManager) throws -> () in ServerInterface+CloudHashing.o
  "type metadata accessor for iOSGoogle.GoogleSyncServerSignIn", referenced from:
      Share_Extension.Services.getSignIns(configPlist: Share_Extension.ConfigPlist) -> [(iOSSignIn.GenericSignIn, iOSSignIn.SignInDescription)] in Services+SignIns.o
  "iOSGoogle.GoogleSyncServerSignIn.__allocating_init(serverClientId: Swift.String, appClientId: Swift.String, signInDelegate: iOSGoogle.GoogleSignInDelegate) -> iOSGoogle.GoogleSyncServerSignIn", referenced from:
      Share_Extension.Services.getSignIns(configPlist: Share_Extension.ConfigPlist) -> [(iOSSignIn.GenericSignIn, iOSSignIn.SignInDescription)] in Services+SignIns.o
  "direct field offset for iOSGoogle.GoogleSyncServerSignIn.userType : ServerShared.UserType", referenced from:
      Share_Extension.Services.getSignIns(configPlist: Share_Extension.ConfigPlist) -> [(iOSSignIn.GenericSignIn, iOSSignIn.SignInDescription)] in Services+SignIns.o
  "protocol witness table for iOSGoogle.GoogleSyncServerSignIn : iOSSignIn.GenericSignIn in iOSGoogle", referenced from:
      Share_Extension.Services.getSignIns(configPlist: Share_Extension.ConfigPlist) -> [(iOSSignIn.GenericSignIn, iOSSignIn.SignInDescription)] in Services+SignIns.o
  "type metadata accessor for iOSApple.AppleSignIn", referenced from:
      Share_Extension.Services.getSignIns(configPlist: Share_Extension.ConfigPlist) -> [(iOSSignIn.GenericSignIn, iOSSignIn.SignInDescription)] in Services+SignIns.o
  "iOSApple.AppleSignIn.__allocating_init() -> iOSApple.AppleSignIn", referenced from:
      Share_Extension.Services.getSignIns(configPlist: Share_Extension.ConfigPlist) -> [(iOSSignIn.GenericSignIn, iOSSignIn.SignInDescription)] in Services+SignIns.o
  "protocol descriptor for iOSGoogle.GoogleSignInDelegate", referenced from:
      l_got.$s9iOSGoogle20GoogleSignInDelegateMp in Services+SignIns.o
  "protocol witness table for iOSApple.AppleSignIn : iOSSignIn.GenericSignIn in iOSApple", referenced from:
      Share_Extension.Services.getSignIns(configPlist: Share_Extension.ConfigPlist) -> [(iOSSignIn.GenericSignIn, iOSSignIn.SignInDescription)] in Services+SignIns.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Lưu ý rằng điều này không dành riêng cho việc xây dựng cho một thiết bị thực (ví dụ arm64:). Nếu tôi xây dựng cho trình mô phỏng, tôi nhận được cùng một loại thông báo, nhưng tiêu đề là như vậy Undefined symbols for architecture x86_64:.

Khi tôi tạo và vẫn bao gồm gói Đăng nhập bằng Google của mình (với các tham chiếu trong ứng dụng chính của tôi), nhưng không có tham chiếu đến gói này trong tiện ích chia sẻ của mình, thì gói này sẽ được xây dựng rõ ràng. Tôi lấy đây làm bằng chứng thêm rằng không thể sử dụng gói này trong tiện ích mở rộng chia sẻ.

1/1/21: Tôi hiện đã giải quyết được cả hai vấn đề về trình liên kết ở trên. Đầu tiên chỉ là một công tắc tôi cần thay đổi tronghttps://github.com/SyncServerII/GSignIn.gitDự án Xcode (xem thông báo cảnh báo liên kết chống lại một dylib không an toàn để sử dụng trong các tiện ích mở rộng ứng dụng ). Thứ hai chỉ là tôi đã không thêm tham chiếu khung của mình (đối với iOSGoogle trong trường hợp của tôi) vào tiện ích mở rộng chia sẻ của mình. Ví dụ, hãy xemhttps://stackoverflow.com/a/61848359/1675875

2/3/21: Tôi gặp phải một số vấn đề khác, với việc sử dụng XCFrameworks trong tiện ích mở rộng chia sẻ khi tôi tải ứng dụng của mình lên iTunes Connect:

  1. https://developer.apple.com/forums/thread/662247

  2. Lỗi hoạt động kết nối App Store LỖI ITMS-90680: "Thư mục không hợp lệ. Gói Payload / Neebla.app / PlugIns / GSignIn.framework không được chứa trong thư mục được đặt tên chính xác. Nó phải nằm trong" Khung "." Xemhttps://forums.swift.org/t/swift-package-binary-framework-issue/41922/2 và https://bugs.swift.org/browse/SR-13840