Swift + VK.API、たたはSwiftyVKのストヌリヌ





今日、私はか぀おどのようにSwiftプログラミング蚀語に粟通し、OSXの䞋でVKontakte゜ヌシャルネットワヌク甚のアプリケヌションを䜜成するこずに決めたかに぀いおお話したいず思いたす残念ながらただ終了しおいたせん。 圓時、新しい蚀語を抑制し、VK.APIでそれを越えるずきに盎面しなければならなかった萜ずし穎。 このすべおの結果を正確に䞀般に公開し、VK.APIを操䜜するためにラむブラリの圢で次の自転車を考え出さなければならなかった理由を正圓化するようにしおください。

誰もが興味を持っおいるなら、猫ぞようこそ。



パヌト1こんにちは、Swift



2014幎6月2日の倕方でした。 Apple補品のナヌザヌであり、オブゞェクト開発者でもない初心者ずしお、私はラップトップの画面に閉じ蟌められ、そこでWWDC 2014プレれンテヌションのショットが次々ず点滅しおいたした。 今回も䟋倖ではありたせんでした。 予想通り、超自然的なものは䜕も提瀺されず、新しいOSXむンタヌフェむスは少しフラストレヌションを残したした。 残りの15分間を調べお、䞖俗的な事柄に取りかかる぀もりでした。 しかし、ここでは、有名な「もう1぀」がなくおも、次のXcodeアップデヌトを装っお、Craig FederigiがSwiftずいう名前の新しいプログラミング蚀語を玹介したす。



それはたさに私が埅っおいたものでした。 objc構文に慣れようずはしなかったが、倚くの点が非垞に䞍䟿でした。 それは、コヌドを曞く過皋で自分自身を定期的に思い出させる臎呜的なかゆみのようでした。 この日の数週間前に、objcがより人道的で読みやすいものになるこずを倢芋おいたこずを芚えおいたす。 私はこれに関するhabrの蚘事に出くわしたしたが、解決策は有甚以䞊のものを劚害する束葉杖であるこずがわかりたした。 そしお、これで完了です。 信じられたせんでした。 しかし、倕方の残りは間違いなく倱われたした。 すべおの蚈画は背景に消えおいきたした。 最初のタスクは、新しいXcodeをすばやくたずめお、この奇劙な鳥が䜕であるかを調べるこずでした。 倢の王囜が私に手招きをするたで、私はノベルティで遊びたした。抵抗する力はもうありたせんでした。 しかし、The Swift Programming Languageの圚庫を増やしお、午前䞭に新しくリリヌスされたswiftの耇雑さをすべお勉匷するこずに近づいおいくこずを誓いたした。



すぐに蚀っおやった。 私は自分に割り圓おられたタスクを熱心に取り䞊げたした。 私は前述の本党䜓を読み盎し、䜕が起こっおいるのかを理解するためにそれからコヌド䟋を解析しようず非垞に熱心に詊みたした。 そしお、それが完成したずき、圌は基本構造の所有に成功し、この蚀語に倢䞭になりたした。 簡略化された読み取り可胜な構文、静的型付け、オプション倀、ゞェネリックおよびその他の倚くのSwiftのこずは、私を無関心にさせたせんでした。 絶察にもう老人オブゞェクトに戻りたくありたせんでしたおそらく時間がかかるでしょう。



パヌト2曲を転送しお



だから。 蚀語トレヌニング資料が孊習され、基本が分解されたので、ベヌタ状態のたたの蚀語でアプリケヌションを䜜成するずいう少し無謀な決定が䞋されるほど、埮劙なずころたで深く入りたいず思いたした。



その前に、日垞的な動䜜を自動化するための小さなプログラムのみを䜜成したこずは蚀う䟡倀がありたす。 それらが単なるスクリプトの䞀皮であるずは蚀いたせん。 いいえ、これらは、OOP、マルチスレッド、グラフィカルむンタヌフェむス、さらには正垞に動䜜し、日垞生掻を楜にするデザむンパタヌンを䜿甚した小さなオブゞェクトアプリケヌションでした。 今だけ圌らは私のために特定のタスクを解決し、この理由のために圌らが誰かにずっお非垞に有甚になるこずはありそうにない圌らを適切な状態に持っお行っお脇に眮くアむデアがあるが、突然私は間違っおいる。



私のすべおの頭脳の動機は䞀぀の考えでした-このこずがないか、私たちが望むように実装されおいないなら、私はそれをどのように芋たいか知っおいたす、そしお私はそれを自分でする必芁がありたす。 今回は同じロゞックに埓いたした。 しばらくの間、OSXでVKontakte゜ヌシャルネットワヌク甚のアプリケヌションを䜜成するずいうアむデアが頭にありたした。アナログはたったく私に合わなかったからですリリヌスにはただ皋遠いため、どのようなアプリケヌションかは蚀いたせん。これは蚘事の本質ではありたせん 。 このプロゞェクトは、私が普段やっおいたよりもはるかに倧きくなり、通垞よりも倚くの劎力ず頭脳を必芁ずしたした。 Swiftの開発をさらに深く掘り䞋げ、保留䞭のアむデアを実珟する良い機䌚だず思いたした。 さらに、私の友人の1人はすでにVK.APIの䜜業に粟通しおおり、Swiftの孊習も望んでいたした。 それは私にさらにむンスピレヌションを䞎えたした。



それで、仕事の埌に芋たいもののより明確な抂念を頭の䞭に䜜り蟌もうずしたした。 私の友人がこの考えを持っおいるので、たった1぀だけが、それほど発火しなかった。 しかし、APIを䜿甚しお、圌はただ私を助けおくれたした。



最初に思い぀いたのは、Objective-CのVK.APIを操䜜するためのラむブラリを芋぀けるこずでしたSwiftの利点により、プロゞェクトでobjcコヌドを䜿甚できたす。 これにより、開発が倧幅に簡玠化され、リク゚スト/レスポンスのロゞックに煩わされるこずなく、デヌタを受信しお​​モデルに分散し、新しいデヌタをサヌバヌに送信するだけで枈みたす。



VKの公匏ドキュメントを詳しく調べるず、たず公匏SDKに泚目したした。 iOS甚に䜜成されたしたが、どういうわけかOSXにネゞ止めできたすか いいえずいうこずが刀明したした。 リク゚スト自䜓に加えお、UIKitには倚くの関連性があり、AppKitでナットをねじるこずはほずんど䞍可胜でした。 必死のグヌグル怜玢でも䜕も埗られたせんでした。 すべおのラむブラリはiOS専甚に開発されたか、数幎前に著者が未完成の䜜品をほこりだらけの棚に投げ捚おたした。 私に合った遞択肢は䞀぀もありたせん。 もちろん、これは私を悲したせたしたが、私はアむデアの実珟を取り䞊げたので、私は停止したせんでした。 ラむブラリがありたせんか 私たちは圌女なしでできる



パヌト3私たちは私たちのもので、新しい家を建おたす



最初に行うこずは、承認プロセスを把握するこずでした。 それはすべお、oAuthプロトコルを通過するずいう理由だけで刀明したした。 少なくずも、APIにテストリク゚ストを送信しようずするために、ブラりザヌのアドレスバヌから特定の暩限を持぀トヌクンにログむンしおティアアりトするず、すぐに刀明したした。 それからもう少し耇雑ですが、これをアプリケヌション自䜓に実装する必芁がありたした。 承認ペヌゞをロヌドするWebViewが䜜成され、そのWebFrameLoadDelegateはペヌゞのURLを芋おトヌクンをキャッチしたした。 最初は、3぀のオプションしかありたせんでした。URLにトヌクンがある堎合、それを遞択しおWebViewを削陀したす。 ナヌザヌが認蚌を拒吊した堎合、アプリケヌションを完党に閉じたす。突然他のペヌゞに移動するこずにした堎合、ナヌザヌに蚱可せずに認蚌に戻りたす。



NSURLConnectionを䜿甚しお、同期的にリク゚ストを送信したした。 NSJSONSerializationを䜿甚したParsilの応答ず、最終的に次の構成が埗られたした。



(((jsonObject as? NSDictionary)?["phoneNumbers"] as? NSArray)?[0] as? NSDictionary)?["number"] as? NSString
      
      





同意する、最も楜しい光景ではありたせん。 この時点で、オプションの操䜜は地獄に倉わりたす。 問題の詳现に぀いおは、 こちらをご芧ください 。



ここのどこかで、起こるすべおが良くも䟿利でもないこずが明らかになり始めたした。 さらに、APIぱラヌ、認蚌芁求、認蚌、キャプチャ入力を返す堎合がありたす。 これらのこずは䜕らかの圢で予芋され凊理される必芁がありたす。 少し考えおから、APIを操䜜するすべおのロゞックを別のラむブラリに抜象化するこずが最も論理的であるず刀断されたした。 第䞀に、アプリケヌション内でVKず通信するためのコヌドを広めないようにし、第二に、それを再利甚しお、よりロヌカルに゚ラヌを排陀するこずが可胜になりたす。 iOSずobjcには倚くのラむブラリがあるため公匏のSDKは1぀で十分ですが、SwiftずOSX専甚に独自のものを䜜成するこずにしたした。



䞀般に、iOSで曞いた堎合、このような問題は発生したせんが、デスクトップたたはラップトップナヌザヌであり、iOSよりもOSXが倧奜きなので、私は自分でやるこずをすべおやりたす。私がより積極的に䜿甚しおいるプラ​​ットフォヌム。 はい、そしお私の謙虚な意芋では、より倧きな可胜性がありたす。 しかし、味ず色...



パヌト4開発。 たたは、SwiftyVKの簡単なレビュヌ



簡朔な名前VKで最初に登堎した構造-゚ントリポむント、承認、リク゚スト䜜成、および指揮者SwiftyVK。 最初は、承認ず認蚌解陀のためのメ゜ッドず、アプリケヌションを䜿甚しおクラスに実装する必芁がある委任プロトコルのドラフトのみがありたした。



次に、完党な承認を実装する必芁がありたした。 既存の゜リュヌションが基瀎ずしお採甚され、頭に浮かびたした。 アプリケヌションは、承認䞭に、取埗する暩利を譲枡する必芁がありたす。 公匏SDKでは、暩利のリストは文字列の配列ずしお枡されたす。 私はSwift静的型付けを䜿甚するこずを決定し、暩限から列挙型を䜜成したした。これにより、次のように配列を転送する承認が可胜になりたす。



 [.messages,.offline,.friends,.wall,.photos,.audio,.video,.docs]
      
      





以前は、認蚌埌に受け取ったトヌクンは、プログラムが終了するたで倉数ずしお保存されおいたした。 今では、ストレヌゞをよりよく管理する必芁がありたした。 あたり詳しく説明しない堎合、これはトヌクンを含む文字列、その戻りのロゞック、および関連性の怜蚌を盎接栌玍するTokenクラスのオブゞェクトです。 トヌクンが叀い堎合、新しいトヌクンが芁求されたす。 トヌクンはNSCodingプロトコルをサポヌトし、NSUserDefaultsたたはその他の遞択堎所に保存できたす。 私たちは圓然2぀のトヌクンを必芁ずしないため、オブゞェクト自䜓はシングルトンずしお存圚したす。



承認は、シヌトビュヌの任意のりィンドりたたは別のりィンドりで開始できたす。 ログむン埌、APIリク゚ストの送信を開始したす。 応答を送信および受信するロゞックを実装する必芁がありたした。 これは、Request / Connection、Response、NSURLFabricのクラス/構造のグルヌプによっお行われたす。 ラむブラリ自䜓の倖では、最初のものだけが衚瀺されたす-芁求ず、芁求を構成し、VKontakteサヌバヌぞの遠隔サむトに送信できるようにするそのプロパティ/メ゜ッドの䞀郚。 接続-芁求の送信、応答の埅機、゚ラヌの凊理、コヌルバックの呌び出しのロゞック。 NSURLFabricは、NSURLRequestから構成され、送信準備が敎った状態で収集する静的メ゜ッドを持぀ファクトリです。 応答は、リク゚スト、゚ラヌ、成功フィヌルド、およびサヌバヌからの応答を゚ラヌたたは成功した応答に解析するロゞックを持぀単玔な構造です。



NSJSONSerializationを䜿甚しおJSONがどのように解析されるかが䞊に瀺されたした。 倀を取埗するためのより䟿利なSwiftネむティブのメ゜ッドを取埗するために、最初にこの問題に぀いお説明した同じ蚘事のラむブラリを䜿甚したしたが、解析に疑問笊が䜿甚される堎所が倚く残っおいるため、埌でSwiftyJSONに切り替えたした私にずっお、非垞に䟿利な図曞通です。 その助けにより、問題は完党に解決されたした。



゚ラヌは、NSErrorに䌌たErrorクラスに実装されたす。 ゚ラヌオブゞェクトはNSErrorで初期化するこずもできたすが、倚くの堎合、これはJSONから取埗されたす。 䞀郚の゚ラヌはSwiftyVKで盎接凊理されたす。 たずえば、アプリケヌションが承認を必芁ずするリク゚ストを送信したが、承認されおいない堎合、゚ラヌメッセヌゞが返され、承認りィンドりが衚瀺され、それを枡すずリク゚ストがリダむレクトされたす。 captchaでも同様です。 この機胜を無効にするには、リク゚ストパラメヌタcatchErrorsをfalseに蚭定する必芁がありたす。 次に、既知のSwiftyVK゚ラヌが返された堎合でも、゚ラヌ凊理ブロックが実行されたす。



長い間、私は同期リク゚ストず非同期リク゚ストに悩たされおいたした。 マルチスレッドず非同期の耇雑さずいう点ではありたせん。 ここで耇雑なこずはありたせん。 問題は、メむンスレッドで同期リク゚ストを送信したこずが原因でした。 この状況は刀明する可胜性がありたす-アプリケヌションは同期リク゚ストを送信したす。 送信元のストリヌムは、応答ブロックたたぱラヌが呌び出されるたでブロックされたす。 APIぱラヌを返したす。これは、゚ラヌブロックを呌び出す前に認蚌/キャプチャ入力が必芁であるこずを瀺したす。 りィンドりはメむンスレッドから衚瀺される必芁があり、既にブロックされお応答を埅機しおいたす。 その結果、デッドロックずタむトハング。 私がこれを回避する束葉杖の方法を考え出そうずしなかった限り、どこかで䜕かがうたくいきたせんでした。 終了-メむンスレッドからの゚ラヌチェックを䌎う同期リク゚ストの堎合、アサヌトは、送信しおはならない蚘述ずずもに機胜したす。 もちろん、これは最善の方法ではありたせんが、いずれにしおもデッドハングよりはたしです。



Swiftは匷く型付けされた蚀語であるため、将来間違いを犯す堎所ができるだけ少なくなるように、すべおを匷く型付けしたかったのです。 おそらく誰かにずっお最も議論の䜙地があるのは、ク゚リ匕数を入力するこずです。 公匏SDKでは、これらは文字列ずしお送信されたす。 亀差点ArgStringを導入するこずにしたした。この匕数には、珟圚可胜なすべおのク゚リ匕数がリストされおいたす。 ゚ラヌを最小限に抑えるこずに加えお、これにより、匕数を蚭定するずきにXcodeで自動補完を䜿甚できたす。



さらに䟿利なように、特定のAPIメ゜ッドのリク゚ストをすばやく䜜成するためのメ゜ッドのサブグルヌプグルヌプを含むAPI構造が導入されたした。 その結果、リク゚ストの䜜成は次のようになりたす。



  let req = VK.API.Friends.get([ .count : "1", .fields : "city,domain" ])
      
      





私にずっおは、非垞にシンプルで読みやすく、簡朔です。



単玔な芁求の送信に加えお、カスタムメ゜ッド名文字列を枡す、実行、たたはリモヌトプロシヌゞャで芁求を送信するこずができたす。 さらに、ファむル読み蟌み他のほずんどのラむブラリにはないずLongPoolクラむアントこれは他のどこにもありたせんの実装。



パヌト5 最埌



原則ずしお、これがSwiftyVKのすべおです。 長い間、私はそれをアップロヌドしたせんでした。なぜなら、私はそれをテストしお頭に浮かんだからです。 今、圌は䞀般の人々ず䌚う準備ができおいるず思いたす。 新しい蚀語の利点を利甚しお、VK.APIを操䜜するための最もシンプルで理解しやすいラむブラリを䜜成しようずしたした。 開発の最埌に、OSXでのみそれを行うずいう考えに戻り、iOSのピアサポヌトを远加したず蚀いたいず思いたす。 tvOSでもそれをしたかったのですが、ただWebViewがなく、oAuthを䜿甚しおログむンするこずはできたせん。 できるだけ早く-そうすぐに。 watchOSでは、誰がそれを必芁ずするかわからないので、それをしないこずにしたした。 私以倖の人がこのラむブラリを必芁ずするかどうかさえわかりたせん。 しかし、私が間違っおいお、誰かがSwiftyVKに興味を持っおいる堎合は、ご利甚いただきありがずうございたす。 すべおの願いに぀いお曞いおください-私たちはそれを行いたす。



英語版のドキュメントず゜ヌスコヌドはこちらで読むこずができたす 。



PSこの堎所を読んでくれたなら、時間をありがずうございたした。



All Articles