Hassan Ahmed Khan

24 dec. 2017 · 4 min de citire

Recent m-am confruntat cu o situație în care a trebuit să folosesc o bibliotecă terță parte în proiectul meu, dar acea bibliotecă nu era disponibilă pe Cocoa Pods.

crearea

Swifter este un cadru Twitter foarte frumos scris în Swift. Are un număr mare de stele (like-uri) și furculițe. Dar, din păcate, acest cadru nu este disponibil pe Cocoa Pods (cel puțin până la 22/12/2017).

Singura metodă de importare a proiectului este să tragi întregul proiect Xcode în propriul tău proiect. Deoarece acest proiect are cadre separate pentru Mac, iOS și aplicații demo și pentru iOS și Mac, acest lucru îl face un proiect greoi care trebuie adăugat în propriul dvs. proiect.

După ce am folosit Cocoa Pods pentru gestionarea bibliotecii pentru o perioadă foarte lungă de timp, nu am vrut să încorporez un întreg proiect în propriul meu proiect. Nu mi s-a părut corect. Așa că am început călătoria de a găsi căi alternative.

Cea mai ușoară soluție este să încorporați cadrul iOS produs de bibliotecă în proiectul dvs. Se poate face în 4 pași.

  1. Selectați-vă cadrul și platforma.

2. Construiți și extrageți cadrul din folderul produse.

3. Încorporați cadrul extras în „Binare încorporate”

4. Acum importați modulul și utilizați-l.

Tehnica de mai sus funcționează. Dar problema aici este că am creat platforma simulatorului de direcționare cadru. Deci binarul generat a fost doar de arhitectură specifică simulatorului (x86).

Dacă încercați să construiți proiectul pentru dispozitiv, acesta va eșua. Motivul aici este că arhitectura specifică dispozitivului lipsește din cadrul pe care l-am adăugat în ultimul pas.

Puteți repeta pașii de mai sus și puteți crea un cadru pentru dispozitiv în loc de simulator, dar apoi nu va funcționa pentru simulator.

Deci, pentru a rezolva această problemă permanent, trebuie să găsim o modalitate de a încorpora atât arhitecții (x86, cât și brațul) într-un singur cadru. Soluția este o bibliotecă de grăsimi.

O bibliotecă grasă este pur și simplu o bibliotecă cu mai mulți arhitecți. În cazul nostru va conține arhitecți x86 și arm. Numele propriu este „Biblioteca statică universală”. Dar vom rămâne cu „grăsimea bibliotecii”, deoarece este mai mică de scris și exact așa ar fi biblioteca noastră rezultată. Gras. cu mai mulți arhitecți în el.

Există multe articole disponibile pe internet pentru crearea unei biblioteci grase. Toate sunt foarte tehnice, greu de urmat și au șanse mari de eșec.

Am găsit o modalitate nouă și foarte ușoară de a crea o bibliotecă de grăsime. Acest lucru nu implică niciun script complex. Pașii sunt simpli și ușor de urmat.

Vom folosi proiectul Swifter pentru a crea o bibliotecă de grăsimi.

  1. Descărcați proiectul de aici și deschideți-l în Xcode.
  2. Construiți „SwifteriOS” țintă pentru simulatorul iOS și extrageți cadrul din folderul de produse de pe desktop.
  3. Redenumiți cadrul în SwifteriOS-sim.framework, astfel încât să se poată distinge ulterior.
  4. Repetați pașii 2 și 3 pentru dispozitivul iOS. Puteți selecta „Dispozitiv iOS generic”. Nu uitați să redenumiți cadrul în Swifter-dev.framework.
  5. Utilizați următoarea comandă pentru a combina ambele binare într-un singur fișier binar fat (Asigurați-vă că sunteți pe desktop în timp ce executați această comandă).

7. Copiați fișierul binar SwifteriOS creat în pasul de mai sus și înlocuiți-l cu binarul din folderul SwifteriOS-dev.framework.

8. Deschideți fișierul „Info.plist” din același folder.

9. Adăugați șirul „iPhoneSimulator” în matricea „CFBundleSupportedPlatforms”.

10. Fișierul plist final ar arăta astfel:

copiați „x86_64.swiftdoc” și „x86_64.swiftmodule” și lipiți-le în

12. Urmând pașii de mai sus, ați convertit SwifteriOS-dev.framework de pe dispozitiv numai într-un cadru universal de grăsime. Redenumiți-l în SwifteriOS.framework.

13. Includeți acest cadru prin opțiunea „Încorporat binare” în Xcode. Importați modulul în fișierul dvs. și îl veți putea compila cu succes.

Am testat această tehnică în Xcode 10 și 11 cu limbaje Swift și Objective-C.

Dacă ți-a plăcut această postare, atunci nu uita să bat din palme:)