Использование Google Sign In для iOS с Swift Package Manager

Примерно как Создайте приложение для iOS с Google Sign с поддержкой Mac, я встроил платформу Google Sign in для iOS и включил ее в проект Xcode, но я ориентируюсь только на iOS. Мне нужно использовать Swift Package Manager с Google Sign In для iOS.

Я создаю этот вопрос, чтобы добавить к нему свое текущее решение и посмотреть, есть ли решение у других. И попытаться убедить Google поддерживать Swift Package Manager с помощью Google Sign In для iOS :).


person Chris Prince    schedule 27.12.2020    source источник


Ответы (2)


С этой целью я создал версию Google Sign для XCFramework. См. https://github.com/SyncServerII/GSignIn.git. Пока что это позволяет проводить тестирование и разработку с помощью Xcode iOS Simulator и на реальных устройствах iOS.

После сборки он используется в манифесте Package.swift, например:

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

(См. Также https://github.com/SyncServerII/iOSGoogle/blob/main/Package.swift для полного примера).

Проблемы на данный момент:

  1. Я, по-видимому, не могу получить доступ к активам пакета. Мне пришлось создать новую кнопку входа в Google. Ничего страшного, но для полноты картины я хотел бы иметь доступ к кнопке Google, которую предоставляет фреймворк Google Sign In.

  2. Этот пакет зависит от конкретной версии Google Sign In. Для его обновления потребуется войти в https://github.com/SyncServerII/GSignIn.git и вручную обновляя его на основе обновлений системы входа в систему Google.

Мне еще предстоит развернуть приложение, использующее этот пакет, в магазине приложений, так что на данный момент это неизвестно.

- Обновления -

28.12.20 (решено - см. Обновление от 01.01.21 ниже): я также должен отметить, что я получаю предупреждение об этой библиотеке в моем расширении общего доступа:

ld: предупреждение: связывание с dylib, которое небезопасно для использования в расширениях приложений: /Users/chris/Library/Developer/Xcode/DerivedData/Neebla-aybzuiaoyytaypbvqtqeummvcssh/Build/Products/Debug-iphoneframe/GworkSignGworkSign

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

29.12.20 (решено - см. Обновление от 01.01.21 ниже): ранее я создавал с помощью пакета входа в Google, перетаскиваемого в мое приложение из локального каталога. Я только что попытался перейти от незатянутого, а просто полагаться на него как на быстрый пакет в моем приложении, на который ссылается его репозиторий Github. И это нарушает сборку из-за различных неясных ошибок компоновщика, например следующих:

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)

Обратите внимание, что это не относится к сборке для реального устройства (например, arm64). Если я создаю симулятор, я получаю такие же сообщения, но с заголовком Undefined symbols for architecture x86_64:.

Когда я создаю и все еще включаю свой пакет Google Sign In (со ссылками в моем основном приложении), но не имею ссылок на этот пакет в моем расширении общего доступа, он строится чисто. Я считаю это еще одним доказательством того, что этот пакет нельзя использовать в расширении общего доступа.

01.01.21: Теперь обе проблемы с компоновщиком, указанные выше, решены. Первый был просто переключателем, который мне нужно было изменить в моем https://github.com/SyncServerII/GSignIn.git проект Xcode (см. предупреждающее сообщение, указывающее на dylib, который небезопасен для использования в расширениях приложений). Во-вторых, я просто не добавил свою ссылку на фреймворк (в моем случае для iOSGoogle) в свое расширение для общего доступа. См., Например, https://stackoverflow.com/a/61848359/1675875

03.02.21: Я столкнулся с некоторыми другими проблемами, связанными с использованием XCFrameworks в расширении общего доступа, когда я загрузил свое приложение в iTunes Connect:

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

  2. Ошибка операции подключения к App Store. ОШИБКА ITMS-90680: неверный каталог. Пакет Payload / Neebla.app / PlugIns / GSignIn.framework не содержится в правильно названном каталоге. Это должно быть в разделе Frameworks. См. https://forums.swift.org/t/swift-package-binary-framework-issue/41922/2 и https://bugs.swift.org/browse/SR-13840

person Chris Prince    schedule 27.12.2020
comment
Можно ли заставить его работать, просто добавив https://github.com/SyncServerII/GSignIn.git в качестве зависимости в диспетчере пакетов Swift? - person Orkhan Alikhanov; 11.01.2021
comment
Нет, мне нужно сделать еще один шаг. Мне нужно добавить zip-файл (я думаю) и хеш. Позвольте мне разобраться в этом на следующий день или около того, и я опубликую здесь то, что вам нужно. - person Chris Prince; 12.01.2021
comment
Я поместил несколько инструкций вверху TL;DR в github.com/SyncServerII/GSignIn. Помните, что, как я указал выше, кнопка входа в Google, скорее всего, не будет отображаться должным образом. - person Chris Prince; 12.01.2021

Начиная с версии 6.0 Google Sign-In Framework, Swift Диспетчер пакетов поддерживается изначально.

Больше нет необходимости в обходном пути. Просто используйте их URL-адрес Github, чтобы добавить фреймворк в SPM:

git clone https://github.com/google/GoogleSignIn-iOS
person Sera    schedule 14.07.2021