ラベル swift の投稿を表示しています。 すべての投稿を表示
ラベル swift の投稿を表示しています。 すべての投稿を表示

2017年9月26日火曜日

Xcode8のままiOS11ビルドをする

どうも俺です。


iOS11がリリースされ、それに合わせてXcode v9もリリースされました。
Xcodeをバージョンアップするためには、
先にMacOSをバージョンアップする必要があって...いつもながら超面倒です。

Xcode8のままだとiOS11用にビルドできない...とお思いのみなさん、
裏技を使ってそのままiOS11ビルドできます。

※動作保証はできませんので、自己責任で行って下さい。


(1) Xcode 9をダウンロードする
https://developer.apple.com/download/more/
からXcode 9をダウンロードし解凍します。
結構時間かかります。

(2) Xcode 9.appを適当なディレクトリへおく
/Application/Xcode-9.app などへ移動させましょう。

(3) Xcode 8を適当な名前にリネームしておく。
仮に、Xcode-8.app としておきましょう。

(4) Xcode 8.appにXcode 9.app内にあるiOS11ディスクイメージのシンボリックを貼る

$ sudo ln -s /Applications/Xcode-9.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/11.0\ \(15A5278f\) /Applications/Xcode-8.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/11.0

(5) Xcode 8.appを再起動
再起動したら準備OK。iOS11端末をつなげてビルドできます。




ここに答えが。
Use Xcode 8 with iOS 11 | stack overflow



以上でぇぇぇぇす。

2017年8月8日火曜日

linker command failed with exit code 1が出た時の解決方法案

どうも、俺です。

Xcodeで開発してて目にすると1時間はその解決に費やしてしまうこともある地獄のエラー文言。
そう、それが
linker command failed with exit code 1


※Xcode 8.3.3

今日はこのエラーが出た時「これやったら直った」というあらゆる手段をお伝えします。


■プロビジョニングプロファイルは正しく設定されているか

人により設定方法は様々ですが、僕の場合、
・General>SigningにあるAutomatically manage signingのチェックをはずす

・Build Settings内、
 ProvisioningProfile (Deprecated)とProvisioning Profileの2箇所に適切なプロビジョニングプロファイルを設定。
 Code Signing Identityに正しい証明書を設定。
 最後にDevelopment Teamにチーム名を設定。

としています。
このミスの際は、ちゃんと「プロビジョニングプロファイル間違えているよ」というエラーが出ることが多い...。


■Enable Bitcodeの設定を間違えていないか

Build Settings>Build Options内にあるEnable Bitcodeが「Yes」になっているとアカン場合がある。
組み込んだフレームワークがbitcodeとやらに対応していないかもしれないので、速攻「No」に設定し直す。




■存在しないリソース(画像etc)を取り入れようとしていないか

Build Phases>Copy Bundle Resources内に存在しないリソースがないか要チェック。
無いものが含まれている場合は削除します。



■Deployment Targetを間違えていないか

General>Deployment InfoにあるDeployment Targetに無茶な値を入れていないか。
古すぎるターゲットなどに設定している場合は、よく考えて適切な値にします。



■Info.plistの設定Target Membershipは大丈夫か

Info.plistを選択してTarget Membershipにチェックが入っているとアウト。
チェックを外します。



■Xcodeを再起動しよう

この方法を使うと90%の確率でビルドが成功します。
試してみる価値あり。



■Mac本体ごと再起動しよう

この方法を使うと50%の確率でビルドが成功します。
試してみる価値あり。




上記以外でこのエラーの対処方法があれば教えてください。


※※※2017.08.18追記
このエラーが出た時に詳細ログが見れないのでモヤモヤしてたのですが、ログを見る方法が分かりました!
command+8 !!
LogNavigatorというやつらしいです!
これで具体的にエラー内容確認できます!


以上でぇぇぇぇす。

2016年7月7日木曜日

[Swift] NSURLSessionでカスタムヘッダーを追加する

どうも俺です。

 NSURLSessionに独自のユーザーエージェントなど、ヘッダー内をカスタマイズする方法。
Swift v2です。

let url = NSURL(string:"http://hogehoge.com")
let config = NSURLSessionConfiguration.defaultSessionConfiguration()

// ここからヘッダー追加
config.HTTPAdditionalHeaders = ["User-Agent": "MyOriginalUserAgent"]
config.hTTPAdditionalHeaders = ["Custom-Header": "This is MyCustomHeader"]

let session = NSURLSession(configuration: config)
let request = NSURLRequest(URL: url)
let task = session.dataTaskWithRequest(request)
task.resume()

これで追加できます。
サーバー側でログを確認すると、
HTTP_USER_AGENT : MyOriginalUserAgent
HTTP_CUSTOM_HEADER : This is MyCustomHeader

のように、
・PREFIXに「HTTP_」が付く。
・全て大文字に変換される。
・「-(ハイフン)」は「_(アンダースコア)」に変換される。
という変換処理が内部的に走るようです。


以上でぇぇぇす。

2016年6月30日木曜日

UITableView#reloadData()がうまく動かん

どうも、俺です。
最近はSwiftをいろいろ触っています。

さてタイトルのとおり、
例えば、NSURLSessionを使って
サーバーから取得したデータをUITableViewの各セルに表示させようとして、

  func hoge()
  {
    let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
    let request = NSURLRequest(URL: NSURL("https://xxxx.example.com"))
    let task = session.dataTaskWithRequest(request, completionHandler: self.getData)
    task.resume()
  }

  func getData(data:NSData?, res:NSURLResponse?,error:NSError?)
  {
    // ここで取得したデータをゴニョニョして...


    // ↓reload()してんのに表示変わらん!
    self.tableView.reloadData()
  } 

このような現象になっている場合。
安心してください。大丈夫です。
上記の例の場合、tableViewのreloadData()がメインスレッドから呼ばれていないことが原因なので、
reloadData()の呼び出しは


  dispatch_async(dispatch_get_main_queue(), {
    self.tableView.reloadData()
  })

こうしてやればOKです。

以上でェェェえす。