CommonCrypto'yu Swift çerçevesinde içe aktarma


184

CommonCryptoİOS için Swift çerçevesine nasıl aktarırsınız ?

CommonCryptoBir Swift uygulamasında nasıl kullanılacağını anlıyorum : #import <CommonCrypto/CommonCrypto.h>Köprü üstbilgisine ekliyorsunuz . Ancak Swift çerçeveleri köprüleme başlıklarını desteklemez. Dokümantasyon diyor ki:

Saf Objective-C kod temeli, saf Swift kod temeli veya karma dil kod temeli olan dış çerçeveleri içe aktarabilirsiniz. Harici bir çerçeveyi içe aktarma işlemi, çerçevenin tek bir dilde yazılması veya her iki dilden dosya içerip içermemesi ile aynıdır. Harici bir çerçeveyi içe aktarırken, içe aktardığınız çerçevenin Modül oluşturma tanımını Evet olarak ayarladığınızdan emin olun.

Aşağıdaki sözdizimini kullanarak bir çerçeveyi farklı bir hedef içindeki herhangi bir Swift dosyasına alabilirsiniz:

import FrameworkName

Ne yazık ki, ithalat CommonCryptoçalışmıyor. #import <CommonCrypto/CommonCrypto.h>Şemsiye başlığına da ekleme yapmaz .


CommonCrypto, Objective-C çerçevesi değil, C tabanlı bir çerçevedir.
rmaddy

1
@rmaddy Objective-C bir C süper kümesidir. Swift'ten CommonCrypto'yu kullanamayacağımızı mı söylüyorsun?
hpique

4
@rmaddy Modül haritalarını kullanarak CommonCrypto'yu çalıştırmayı başardım. Çözümü parlatacağım ve bugün daha sonra göndereceğim.
hpique

kolaylık bulursanız ve aradığınız şey zaten uygulanmışsa, CryptoSwift'i
Marcin

1
Apple sadece kaynaklı CommonCrypto'yu açıyor. Belki kaynaklara sahipsek çalıştırabiliriz.
eyeballz

Yanıtlar:


137

Biraz daha basit ve daha sağlam bir şey, modül haritasını otomatik olarak ve doğru Xcode / SDK yolu ile oluşturmak için Run Script aşamasıyla "CommonCryptoModuleMap" adlı bir Toplam hedef oluşturmaktır:

resim açıklamasını buraya girin resim açıklamasını buraya girin

Komut Dosyasını Çalıştır aşaması şu bash'ı içermelidir:

# This if-statement means we'll only run the main script if the CommonCryptoModuleMap directory doesn't exist
# Because otherwise the rest of the script causes a full recompile for anything where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger the rest of the script to run
if [ -d "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap" ]; then
    echo "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap directory already exists, so skipping the rest of the script."
    exit 0
fi

mkdir -p "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap"
cat <<EOF > "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap/module.modulemap"
module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
EOF

Kabuk kodu ve ${SDKROOT}araçlarını kullanmak , özellikle xcode-selectbir beta sürümüne geçmek için kullanıyorsanız veya birden çok sürümün yüklü olduğu bir CI sunucusunda oluşturuyorsanız, sistemden sisteme değişebilen Xcode.app yolunu sabit olarak kodlamanız gerekmediği anlamına gelir standart olmayan yerlerde. Ayrıca SDK'yı kodlamanız gerekmez, bu yüzden iOS, macOS vb. İçin çalışmalıdır.

Bu hedefi oluşturduktan sonra, Hedef Bağımlılıklar öğesiyle kütüphanenizi / çerçevenizi ona bağımlı hale getirin:

resim açıklamasını buraya girin

Bu, modül haritanızın çerçeveniz oluşturulmadan oluşturulmasını sağlar.

MacOS not : Eğer destek ediyorsanız macOSyanı, eklemek gerekir macosxiçin Supported Platformsaksi takdirde doğru modül harita koymak olmaz, yeni oluşturduğunuz yeni agrega hedefte inşa ayarı Debuggeri kalanı ile türetilmiş veri klasörüne çerçeve ürünler.

resim açıklamasını buraya girin

Ardından, modül haritasının üst dizinini ${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMapSwift bölümü altındaki "Yolları İçe Aktar" oluşturma ayarına ekleyin ( SWIFT_INCLUDE_PATHS):

resim açıklamasını buraya girin

$(inherited)Proje veya xcconfig düzeyinde tanımlanmış arama yollarınız varsa bir satır eklemeyi unutmayın .

Hepsi bu kadar, artık import CommonCrypto

Xcode 10 Güncelleştirmesi

Xcode 10 artık bir CommonCrypto modül haritası ile birlikte geliyor ve bu geçici çözümü gereksiz kılıyor. Hem Xcode 9 hem de 10'u desteklemek istiyorsanız, Modül haritasının var olup olmadığını görmek için Komut Dosyası Çalıştır aşamasında bir kontrol yapabilirsiniz.

COMMON_CRYPTO_DIR="${SDKROOT}/usr/include/CommonCrypto"
if [ -f "${COMMON_CRYPTO_DIR}/module.modulemap" ]
then
   echo "CommonCrypto already exists, skipping"
else
    # generate the module map, using the original code above
fi

8
Bu cevap en üstte olmalıdır. Basit ve zarif
Abdullah Saeed

1
Bu oyuna geç - ama bu seçilen cevap olmalı. Çok basit ve diğer geliştiricilerin aynı proje üzerinde çalışmasının gereksinimi görmesi daha kolay.
fatuous.logic

1
Mükemmel cevap. Teşekkürler!
Klaus Busse

1
Bunu .framework'ımda yaparsam, bu çerçeveyi eklediğim projelerde de aynısını yapmam gerekir mi?
Ravi Kiran

2
@IanDundas Yukarıdaki kodu yeniden derleme sorunu için bir düzeltmenin yanı sıra macOS'ta bunu kullanmak için bir düzeltme ile güncelledim
iwasrobbed

91

Aslında "sadece işe yarayan" bir çözüm oluşturabilirsiniz ( burada diğer çözümlerin gerektirdiği gibi bir modül.modulemap ve SWIFT_INCLUDE_PATHSayarları projenize kopyalamanıza gerek yoktur ), ancak bir kukla çerçeve / modül oluşturmanızı gerektirir. doğru çerçeve içine ithal edeceğiz. Biz de platformun bakılmaksızın çalışır sağlayabilirsiniz ( iphoneos, iphonesimulatorya da macosx).

  1. Projenize yeni bir çerçeve hedefi ekleyin ve sistem kütüphanesinden sonra adlandırın, örneğin "CommonCrypto". (Şemsiye başlığını silebilirsiniz, CommonCrypto.h .)

  2. Yeni bir Yapılandırma Ayarları Dosyası ekleyin ve adlandırın, örneğin "CommonCrypto.xcconfig". (Hedeflerinizden herhangi birini dahil edilmek üzere kontrol etmeyin.) Aşağıdakileri doldurun:

    MODULEMAP_FILE[sdk=iphoneos*]        = \
        $(SRCROOT)/CommonCrypto/iphoneos.modulemap
    MODULEMAP_FILE[sdk=iphonesimulator*] = \
        $(SRCROOT)/CommonCrypto/iphonesimulator.modulemap
    MODULEMAP_FILE[sdk=macosx*]          = \
        $(SRCROOT)/CommonCrypto/macosx.modulemap
    
  3. Yukarıda belirtilen üç modül harita dosyasını oluşturun ve aşağıdakilerle doldurun:

    • iphoneos.modulemap

      module CommonCrypto [system] {
          header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h"
          export *
      }
      
    • iphonesimulator.modulemap

      module CommonCrypto [system] {
          header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/CommonCrypto/CommonCrypto.h"
          export *
      }
      
    • macosx.modulemap

      module CommonCrypto [system] {
          header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/CommonCrypto/CommonCrypto.h"
          export *
      }
      

    (Bir beta sürümü kullanıyorsanız "Xcode.app" yerine "Xcode-beta.app" yazın. 10.11El Capitan çalıştırmıyorsanız mevcut OS SDK'nızla değiştirin .)

  4. On Bilgi Proje ayarlarının sekmesi altında Yapılandırmalar'ın , set ayıklama ve Yayın ait yapılandırmaları CommonCrypto için CommonCrypto (referans CommonCrypto.xcconfig ).

  5. Çerçeve hedefinizin Derleme Aşamaları sekmesinde, CommonCrypto çerçevesini Hedef Bağımlılıklara ekleyin . Ayrıca eklemek libcommonCrypto.dylib için bağlantı İkili ile Kütüphaneler yapım aşamasından.

  6. Seç CommonCrypto.framework içinde Ürünleri ve emin onun yapmak Hedef Üyeliğini sizin sarıcı olarak ayarlanır için İsteğe Bağlı .

Artık import CommonCryptosarıcı çerçevenizi inşa edebilmeli, çalıştırabilmelisiniz .

Örnek olarak, SQLite.swift öğesinin sahte bir sqlite3.framework kullandığını görün .


4
Adım (5) olmadan benim için çalışır. Bununla beraber bir inşa hatası alıyorum:ld: cannot link directly with /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.2.sdk/usr/lib/system/libcommonCrypto.dylib. Link against the umbrella framework 'System.framework' instead. for architecture x86_64
stannie

4
Mükemmel! Yapmak için bu Kullanılan github.com/soffes/Crypto ben linke yoktu System.frameworkgerçi. Çerçeveniz çapraz platformsa, Mac ve iOS için ayrı bir sarma çerçevesi yapmalısınız.
Sam Soffes

32
İnsanlar böyle şeyleri nasıl veya nerede öğreniyorlar?
hola

5
Sadece bir not, 1. adımda dil olarak Objective-C'yi seçmeniz gerektiğini açıkça belirtir. Bu kolayca gözden kaçabilir. Ayrıca, belki bir .dylib'e sahip olmadığım için, 5. adımda .framework eklemem gerekiyordu
Teo Sartori

7
bu korkunç. Her biri farklı şekillerde kırık Xcodes bir hayvanat bahçesi var ve her yerde başlıkları için mutlak yollar olması kusmak davet ediyor. Cupertino'da bir şey çok yanlış gidiyor, ya da en azından bu modulemap karmaşasından sorumlu olan herkesle
Anton Tropashko

82

Bir Swift çerçevesinde CommonCrypto'yu başarıyla kullanan bir GitHub projesi buldum: SHA256-Swift . Ayrıca, sqlite3 ile aynı sorun hakkında bu makale faydalı oldu.

Yukarıdakilere dayanarak, adımlar şunlardır:

1) CommonCryptoProje dizini içinde bir dizin oluşturun . İçinde bir module.mapdosya oluşturun . Modül haritası CommonCrypto kütüphanesini Swift içinde bir modül olarak kullanmamıza izin verecektir. İçeriği:

module CommonCrypto [system] {
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/usr/include/CommonCrypto/CommonCrypto.h"
    link "CommonCrypto"
    export *
}

2) Derleme Ayarları'nda, Swift Derleyici - Arama Yolları içinde , CommonCryptodizini Yolları İçe Aktar ( SWIFT_INCLUDE_PATHS) öğesine ekleyin .

Derleme Ayarları

3) Son olarak, CommonCrypto'yu Swift dosyalarınızın içine diğer modüller gibi aktarın. Örneğin:

import CommonCrypto

extension String {

    func hnk_MD5String() -> String {
        if let data = self.dataUsingEncoding(NSUTF8StringEncoding)
        {
            let result = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))
            let resultBytes = UnsafeMutablePointer<CUnsignedChar>(result.mutableBytes)
            CC_MD5(data.bytes, CC_LONG(data.length), resultBytes)
            let resultEnumerator = UnsafeBufferPointer<CUnsignedChar>(start: resultBytes, length: result.length)
            let MD5 = NSMutableString()
            for c in resultEnumerator {
                MD5.appendFormat("%02x", c)
            }
            return MD5
        }
        return ""
    }
}

Sınırlamalar

Özel çerçeveyi başka bir projede kullanmak derleme zamanında hatayla başarısız olur missing required module 'CommonCrypto'. Bunun nedeni, CommonCrypto modülünün özel çerçeveye dahil olmadığı görülüyor. Çözüm, Import Pathsçerçeveyi kullanan projede 2. adımı (ayarı ) tekrarlamaktır .

Modül haritası platformdan bağımsız değildir (şu anda belirli bir platforma işaret etmektedir, iOS 8 Simulator). Şu anki platforma göre başlık yolunu nasıl yapacağımı bilmiyorum.

İOS 8 için güncellemeler <= Başarılı bir derleme elde etmek için "CommonCrypto" satır bağlantısını kaldırmalıyız .

GÜNCELLEME / DÜZENLE

Aşağıdaki derleme hatası almaya devam ettim:

ld: mimari x86_64 için -lCommonCrypto için kitaplık bulunamadı clang: hata: linker komutu çıkış kodu 1 ile başarısız oldu (çağrıyı görmek için -v kullanın)

Çizgiyi kaldırıldı sürece link "CommonCrypto"gelen module.mapdosyanın ben yarattı. Bu çizgiyi kaldırdığımda tamam inşa etti.


30
Gee, Apple elbette işleri zorlaştırmak istiyor. Swifties'i, tüm bu BS'lerden geçmek zorunda kalmadan dosyaları / çerçeveleri içe aktarmamıza izin verecek mi?
zaph

4
$SDKROOTDeğişken, agnostik yolları platform haline getirmeniz gerektiğinden bu sinir bozucu , ancak Swift'te buna nasıl ulaşacağım hakkında hiçbir fikrim yok.
danimal

2
Benim link "CommonCrypto"için module.map dosyasından kaldırılana kadar işe yaramadı .
Teo Sartori

1
Herkes Xcode 7.3 üzerinde çalıştığını onaylayabilir misiniz? Güncellemeden sonra bu çözüm benim için durdu.
Nikita Kukushkin

1
Correnction: simülatör için geliştirdiğimde iyi çalışıyor, ancak "ld: mimari arm64 için -lCommonCrypto için kütüphane bulunamadı" ile bir iOS 9.3 cihazı için oluşturduğumda @ bağlantısında başarısız oluyor
Nikita Kukushkin

50

Bu cevap, bir çerçevede ve Cocoapods ve Carthage ile nasıl çalışacağını tartışıyor.

🐟 modül haritası yaklaşımı

Kullandığım modulemapCommonCrypto etrafında ambalajında https://github.com/onmyway133/arcane , https://github.com/onmyway133/Reindeer

Almak için header not found, lütfen bir göz atın https://github.com/onmyway133/Arcane/issues/4 veya çalıştırınxcode-select --install

  • CCommonCryptoİçeren bir klasör oluşturunmodule.modulemap

      module CCommonCrypto {
        header "/usr/include/CommonCrypto/CommonCrypto.h"
        export *
      }
    
  • Yerleşik Ayarlar -> Yolları İçe Aktar'a gidin

      ${SRCROOT}/Sources/CCommonCrypto

Mod Modül haritası yaklaşımına sahip Cocoapod'lar

🐘 genel başlık yaklaşımı

Public Kamusal başlık yaklaşımına sahip Cocoapod'lar

🐝 İlginç ilgili yayınlar


1
Vaov! Şaşırtıcı bir şekilde, en üst yaklaşımdan (module.modulemap dosyasını oluşturma) başlık yolu, daha önce modulemap dosyaları çok sayıda soruna neden olduğunda harika çalıştı. XCode olarak yeniden adlandırılan insanlar için manuel modifikasyon gerektiren, /CommonCrypto/CommonCrypto.hiçinde mutlak bir yola sahip bir module.modulemap dosyası kullanarak bir süredir bununla uğraşıyordum Applications/XCode.app/Contents/Developer/Platforms/iPhoneOS..... Bakmak için bu satırı değiştirmek "/usr/include/CommonCrypto/CommonCrypto.h", birkaç XCode sürümüne sahip bir ekip için iyi çalışıyor gibi görünüyor. Çok teşekkür ederim!
Natalia

3
Bir bölme oluşturuyorum, ben SWIFT_INCLUDE_PATHS ve preserve_paths ayarlayın. Çalıştığımda pod lib lint, ancak derleme hatayla başarısız olduğunda: böyle bir modül 'CommonCrypto' yok. Bununla nasıl başa çıkabilirim.
Klein Mioke

1
Sorunla ilgili değil ama emoji'nin mermi olarak kullanılmasını seviyorum! 😊
Fomentia

2
@ onmyway133 Değiştirmeye eğer yerel kalkınma pod çalışmalarını kullanma $(PODS_ROOT)/CommonCryptoSwift/Sources/CCommonCryptoile $(PODS_TARGET_SRCROOT)/Sources/CCommonCrypto. PODS_TARGET_SRCROOTyerel kapsüller için doğru ayarlanmış.
Orkhan Alikhanov

Harika cevap, hayatımı kurtardı! Bir milyon teşekkürler
Hassan Shahbazi

45

İyi haberler! Swift 4.2 (Xcode 10) sonunda CommonCrypto!

import CommonCryptoHızlı dosyanızı ekleyin .


Harika haber! Bağlantıyı belgelere ekleyebilir misiniz?
Kryštof Matěj

Ben Xcode 10. It burada geçici çözümlerden birini iki bulabildiğim şikayet vardı bir proje derlemek çalışırken ben belgelerine bir bağlantı yok, ben bu keşfettim CommonCryptoböylece benim çözüm kaldırıldı Apple şimdi sağlanan şüphe, modülleri ve 'lo! Doğruydu. Bu konuda tweet attım ve bir Apple mühendisi amaçlandığını doğruladı.
mxcl

1
App store bana sadece 9.4.7 sürümünü mevcut bir güncelleme olarak gösteriyor, Xcode 10'u nasıl buldunuz?
Hammad Tariq

1
Önemsiz bir Google aramasının size söylediği gibi beta sürümündedir.
mxcl

1
@SomoyDasGupta evet. Sadece önceki içe aktarmayı kaldırın ve tekrar derleyin. Başka bir deyişle, MikeWeller cevabından
COLD ICE

7

UYARI: iTunesConnect, bu yöntemi kullanan uygulamaları reddedebilir .


Ekibimdeki yeni üye yanlışlıkla en iyi cevaplardan biri tarafından verilen çözümü kırdı, bu yüzden onu CommonCryptoModule adlı küçük bir ambalaj projesinde birleştirmeye karar verdim . Manuel olarak veya Cocoapods aracılığıyla kurabilirsiniz:

pod 'CommonCryptoModule', '~> 1.0.2'

Ardından, tek yapmanız gereken modülü ihtiyacınız CommonCryptoolan yere aktarmaktır, şöyle:

import CommonCryptoModule

Umarım başka biri bunu faydalı bulur.


Uyarı: Bu yöntemi kullanırsanız başvurunuz reddedilir!
18'de Segabond

Evet, biz de reddedildik, çok garip, çünkü bu yöntemi kullanarak birkaç ay boyunca sorunsuz bir şekilde yüklüyorduk.
Nikita Kukushkin

5

Sanırım Mike Weller'in mükemmel işinde bir gelişim var.

Compile SourcesBu bash'ı içeren aşamadan önce bir Run Script aşaması ekleyin :

# This if-statement means we'll only run the main script if the
# CommonCrypto.framework directory doesn't exist because otherwise
# the rest of the script causes a full recompile for anything
# where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger
# the rest of the script to run

FRAMEWORK_DIR="${BUILT_PRODUCTS_DIR}/CommonCrypto.framework"

if [ -d "${FRAMEWORK_DIR}" ]; then
echo "${FRAMEWORK_DIR} already exists, so skipping the rest of the script."
exit 0
fi

mkdir -p "${FRAMEWORK_DIR}/Modules"
cat <<EOF > "${FRAMEWORK_DIR}/Modules/module.modulemap"
module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
EOF

ln -sf "${SDKROOT}/usr/include/CommonCrypto" "${FRAMEWORK_DIR}/Headers"

Bu komut dosyası, module.map ile doğru yerde çıplak bir kemik çerçevesi oluşturur ve ardından Xcode'un otomatik BUILT_PRODUCTS_DIRçerçeve aramasına dayanır .

Orijinal CommonCrypto include klasörünü çerçevenin Headers klasörü olarak bağladım, böylece sonuç Objective C projeleri için de çalışmalıdır.


Bkz dvdblk cevabını bir iyileştirme CocoaPods içinde kapakları kullanım söyledi.
jjrscott


4

@mogstad, @ stephencelis çözümünü bir Cocoapod'a sarmak için yeterince nazikti:

'libCommonCrypto' bölmesi

Mevcut diğer kapsüller benim için çalışmadı.


4

Modulemap çözümleri iyi olabilir ve SDK değişikliklerine karşı dayanıklıdır, ancak bunları pratikte kullanmak için garip buldum ve başkalarına dağıtırken istediğim kadar güvenilir değilim. Her şeyi daha kusursuz hale getirmek için farklı bir yol izledim:

Başlıkları kopyalamanız yeterlidir.

Biliyorum kırılgan. Ancak Apple neredeyse hiçbir zaman CommonCrypto'da önemli değişiklikler yapmıyor ve sonunda CommonCrypto'yu modüler bir başlık haline getirmeden önemli bir şekilde değiştirmeyecekleri hayalini yaşıyorum.

"Başlıkları kopyala" derken, ihtiyacınız olan tüm başlıkları kesip ön işlemcinin yaptığı gibi projenizdeki tek bir büyük başlığa yapıştırın. " Kopyalayabileceğiniz veya uyarlayabileceğiniz bunun bir örneği olarak, bkz. RNCryptor.h .

Tüm bu dosyaların APSL 2.0 altında lisanslandığını ve bu yaklaşımın telif hakkı ve lisans bildirimlerini kasıtlı olarak koruduğunu unutmayın. Birleştirme adımım MIT altında lisanslanmıştır ve bu yalnızca bir sonraki lisans bildirimi için geçerlidir).

Bunun güzel bir çözüm olduğunu söylemiyorum, ancak şimdiye kadar hem uygulama hem de destek için inanılmaz derecede basit bir çözüm gibi görünüyor.


Bunu güvenilir bir şekilde derlemek için buldum ve çok basit. Çerçeveyi kullanan uygulamanın özel bir şeye bağlanması gerekiyor mu yoksa CommonCrypto her zaman kullanılabilir mi?
codingFriend1

1
Bence Security.frameworkotomatik olarak bağlantılı (yeni bir projeye başlanmasından bu yana biraz zaman geçmesi). Hata alırsanız, bağlantı çerçevesi budur.
Rob Napier

Bu en basit çözüm gibi görünüyor ve bir makinede harika çalışıyor, ancak çerçeveyi başka bir çerçevede veya uygulamada her kullandığımda 'eksik modül' hatası alıyorum.
richever

2

Bunun eski bir soru olduğunu biliyorum. Ama Swift projesinde kütüphaneyi kullanmanın alternatif bir yolunu buluyorum, bu da bu cevaplarda sunulan çerçeveyi içe aktarmak istemeyenler için yararlı olabilir.

Swift projesinde, Objective-C içinde bir Objective-C köprü üstbilgisi oluşturun, NSData kategorisi (veya kitaplığı kullanmak için özel sınıf) oluşturun. Tek dezavantajı Objective-C tüm uygulama kodunu yazmak zorunda olacaktır. Örneğin:

#import "NSData+NSDataEncryptionExtension.h"
#import <CommonCrypto/CommonCryptor.h>

@implementation NSData (NSDataEncryptionExtension)
- (NSData *)AES256EncryptWithKey:(NSString *)key {
    //do something
}

- (NSData *)AES256DecryptWithKey:(NSString *)key {
//do something
}

Ve sonra objektif-c köprüleme başlığınıza şunu ekleyin:

#import "NSData+NSDataEncryptionExtension.h"

Ve sonra Swift sınıfında benzer bir şey yapın:

public extension String {
func encryp(withKey key:String) -> String? {
    if let data = self.data(using: .utf8), let encrypedData = NSData(data: data).aes256Encrypt(withKey: key) {
        return encrypedData.base64EncodedString()
    }
    return nil
}
func decryp(withKey key:String) -> String? {
    if let data = NSData(base64Encoded: self, options: []), let decrypedData = data.aes256Decrypt(withKey: key) {
        return decrypedData.UTF8String
    }
    return nil
}
}

Beklendiği gibi çalışır.


Bu çok sorunsuz çalışır ve hatta iç kısımları içte tutmanıza izin verir ( NSData+NSDataEncryptionExtension.hhalka açık olmak zorunda değildir).
Raphael

Ama bu şeyi kullanmak için hangi işletim sistemi çerçevesine bağlanmalıyım? Diğerlerinden farklı olarak - bir Obj-C projesinde CommonCrypto ile çalışmak zorundayım ve bu sadece MacOS-10.13 SDK ile Xcode 9'u kırıyor
Motti Shneor

@MottiShneor 10.9 veya üstü işletim sistemlerini bağlayın. Aynı ortamda çalışıyorum ve iyi çalışıyor.
Terence

2

Cocoapods kütüphanenizde CommonCrypto kullanmanız gerektiğinde jjrscott'un cevabına bazı cocoapods büyüsü ekledim.


1) Bu satırı podspec'inize ekleyin:

s.script_phase = { :name => 'CommonCrypto', :script => 'sh $PROJECT_DIR/../../install_common_crypto.sh', :execution_position => :before_compile }

2) Bunu kütüphane klasörünüze veya istediğiniz yere kaydedin (ancak script_phase değerini buna göre değiştirmeyi unutmayın ...)

# This if-statement means we'll only run the main script if the
# CommonCrypto.framework directory doesn't exist because otherwise
# the rest of the script causes a full recompile for anything
# where CommonCrypto is a dependency
# Do a "Clean Build Folder" to remove this directory and trigger
# the rest of the script to run
FRAMEWORK_DIR="${BUILT_PRODUCTS_DIR}/CommonCrypto.framework"

if [ -d "${FRAMEWORK_DIR}" ]; then
echo "${FRAMEWORK_DIR} already exists, so skipping the rest of the script."
exit 0
fi

mkdir -p "${FRAMEWORK_DIR}/Modules"
echo "module CommonCrypto [system] {
    header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}" >> "${FRAMEWORK_DIR}/Modules/module.modulemap"

ln -sf "${SDKROOT}/usr/include/CommonCrypto" "${FRAMEWORK_DIR}/Headers"

Tıkır tıkır çalışıyor :)


Pod spec dosyası ile birlikte demo veya örnek çerçeve projesi sağlayabilir misiniz?
Gowtham

0

Xcode 9.2 ile bir şeyin değişip değişmediğinden emin değilim ama şimdi bunu başarmak çok daha kolay. Yapmam gereken tek şey, çerçeve proje dizinimde "CommonCrypto" adlı bir klasör oluşturmak ve içinde "cc.h" adı verilen iki dosya oluşturmak.

#include <CommonCrypto/CommonCrypto.h>
#include <CommonCrypto/CommonRandom.h>

Ve bir diğeri de module.modulemap:

module CommonCrypto {
    export *
    header "cc.h"
}

(Neden bir modulemap dosyasında doğrudan SDKROOT alanından başlık dosyalarına referans veremediğinizi bilmiyorum ama işe yaramadım)

Üçüncü şey "İçe Aktarma Yolları" ayarını bulmak ve $ (SRCROOT) olarak ayarlamaktır. Aslında, kök düzeyinde istemiyorsanız, CommonCrypto klasörünün altında olmasını istediğiniz herhangi bir klasöre ayarlayabilirsiniz.

Bundan sonra kullanabilmelisiniz

import CommonCrypto

Herhangi bir hızlı dosya ve tüm türleri / fonksiyonları / etc. mevcut.

Yine de bir uyarı kelimesi - uygulamanız libCommonCrypto (veya libcoreCrypto) kullanıyorsa, çok karmaşık olmayan bir hacker'ın uygulamanıza bir hata ayıklayıcı eklemesi ve bu işlevlere hangi anahtarların geçirildiğini öğrenmesi son derece kolaydır.


0

Aşağıdaki sorunla karşılaşırsanız:

ld: -lapple_crypto için kütüphane bulunamadı clang: error: linker komutu çıkış kodu 1 ile başarısız oldu (çağrıyı görmek için -v kullanın)

Xcode 10'da Swift 4.0. CommonCrypto, çerçevenin bir parçasıdır.

Ekle

 import CommonCrypto

Kaldırmak

  • Bağlantı ikili dosyasındaki CommonCrpto lib dosyası Derleme aşamalarındaki kitaplıklarla
  • import CommonCrypto Bridging başlığından

Bu benim için çalıştı!


-1

Xcode'u güncelledikten sonra da aynı şey oldu. Cocoapod'ları yeniden yüklemek ve projeyi temizlemek gibi yapabileceğim her şeyi denedim, ama işe yaramadı. Şimdi sistemi yeniden başlattıktan sonra çözüldü .


-13

Çok basit. Ekle

#import <CommonCrypto/CommonCrypto.h>

bir .h dosyasına (projenizin köprüleme üstbilgisi dosyası). Bir kural olarak, ProjenizName-Bridging-Header.h diyebilirsiniz.

Ardından projenizin Yapı Ayarları'na gidin ve Swift Derleyici - Kod Üretimi'ni arayın. Altında, köprüleme başlığınızın adını "Objetive-C Köprüleme Başlığı" girişine ekleyin.

Sen bittin. Swift kodunuzda içe aktarmaya gerek yoktur. Bu köprüleme başlık dosyasında listelenen herkese açık Objective-C başlıkları Swift tarafından görülebilir.


yönteminiz hata döndürüyor: çerçeve hedefleri ile köprü üstbilgilerinin kullanılması desteklenmiyor
gorgi93

5
@ gorgi93 Hatanın da belirttiği gibi, bir çerçeve hedefinde bir köprü üstbilgisi kullanamazsınız. Tek seçenek maalesef ana çerçeve başlık dosyasına koymaktır.
Charles

1
Eğer gerçekten bu iş parçacığının başlığını kırmızı olsaydı, adamın CommonCrypto kütüphanesini bir Swift çerçevesine aktarmak istediğini görürdünüz. Köprü başlıklarını çerçevelerde kullanamazsınız ve CommonCrypto çerçevesini şemsiye başlığına aktaramazsınız.
miken.mkndev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.