アプリ内課金ローカル認証(デバッグ用)
サーバー側で検証に使うレシートの内容をアプリ内で確認したい場合のコード
func receiptValidation() {
let receiptUrl = Bundle.main.appStoreReceiptURL
let receiptData = try! Data(contentsOf: receiptUrl!)
let requestContents = [
"receipt-data": receiptData.base64EncodedString(options: .endLineWithCarriageReturn),
"password": "共有シークレット"
]
let requestData = try! JSONSerialization.data(withJSONObject: requestContents, options: .init(rawValue: 0))
var request = URLRequest(url: URL(string: "https://sandbox.itunes.apple.com/verifyReceipt")!)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField:"content-type")
request.timeoutInterval = 5.0
request.httpMethod = "POST"
request.httpBody = requestData
let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in
guard let jsonData = data else {
return
}
do {
let json:Dictionary<String, AnyObject> = try JSONSerialization.jsonObject(with: jsonData, options: .init(rawValue: 0)) as! Dictionary<String, AnyObject>
guard let receipts:Dictionary<String, AnyObject> = json["receipt"] as? Dictionary<String, AnyObject> else {
return
}
print(receipts)
} catch let error {
print("SKPaymentManager : Failure to validate receipt: \(error)")
}
})
task.resume()
}
Carthageを使ってフレームワークを導入
導入するもの
1. Alamofire
2. ObjectMapper
3. RxSwift
プロジェクトの配下で以下のコマンドをうつ
$ touch Cartfile
$ vim Cartfile
Vimに導入したいライブラリを記載
github "Alamofire/Alamofire" github "Hearst-DD/ObjectMapper" github "ReactiveX/RxSwift"
ビルドする
$ carthage update --platform iOS
プロジェクトを以下のように変更する
1.+ボタンから、Add Otherをタップ
プロジェクト > Carthage > Build > iOS >追加したいフレームワークを選択

Build Phase に以下を追加
$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework $(SRCROOT)/Carthage/Build/iOS/RxSwift.framework $(SRCROOT)/Carthage/Build/iOS/ObjectMapper.framework

以上
Swift: CollectonViewの列と行を設定する
CollectoinViewの列と行を変更していきたいと思います。
開始の状態
参考: Swift: カスタムCollectionViewセル - ichi6161’s diary
手順
- 準備
- セルの大きさを設定
- マージンを設定
1. 準備
UICollectionViewDelegateFlowLayoutを採用する
class FirstViewController: UIViewController, UICollectionViewDelegateFlowLayout,
UICollectionViewDataSource {
viewDidLoadにcollectionViewのdelegateをselfにセット
(UICollectionViewDelegateFlowLayoutはUICollectionViewDelegateを継承している)
collectionView.delegate = self
2. セルの大きさを設定
ここまでできたら、実際にCollectionViewの列と行を決めていく
例)2列にする場合
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
// 横幅を画面サイズの約半分にする
let cellSize:CGFloat = self.view.bounds.width/2 - 4
return CGSize(width: cellSize, height: cellSize)
}
結果

このように1列になってしまった。
セルの横幅が画面サイズの半分であれば、2列で表示されるはずなのに...。
Stroryboardの設定を確認

Min Spacingが10に設定してあるため、思うようにいかなかったらしい。
試しに Min Spacingを変更してみる
(For Cells :2 , For Lines :2)
結果

2列を表示することには成功!!
が、しかし、4行目のセルが半分見えている状態になっている。
この状態から、3行目までが表示されている状態に修正を加える。
3. Marginの設定
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
//外枠のマージン(top , left , bottom , right)
return UIEdgeInsetsMake(20 , 2 , 20 , 2 )
}
// 水平方向におけるセル間のマージン
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
// セルの左右に
return 0
}
// 垂直方向におけるセル間のマージン
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 20
}
結果

できた。
(端末によっては、3行きっかり表示されない可能性があるので、
さらに細かい修正は必要になる。)
Swift: カスタムCollectionViewセル
- StorryboardにCollectionViewを設定
- CollectionviewのdataSourceを設定
- カスタムセル用のクラスを作成 (xibファイルもセットで)
- StorryboardにCollectionViewのセルをタップして、identiferとクラスを設定
- コードでCell用に作成したxibファイルをCollectionViewに登録
- datasource実装
1 StorryboardにCollectionViewを設定

2 CollectionviewのdataSourceを設定
import UIKit
class FirstViewController: UIViewController, UICollectionViewDataSource {
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.detaSource = self
}
// 以下省略
3 カスタムセル用のクラスファイルを作成する
セルにラベルを設定する場合はIBOutletをこのクラスに結びつける。
4 StorryboardにCollectionViewのセルをタップして、identiferとクラスを設定

5. コードでCell用に作成したxibファイルをCollectionViewに登録(xibファイル名とitdentiferが必要)
ViewDidLoadに以下のコードを追加する
self.collectionView.register(UINib (nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCell")
6. datasource実装
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{
return 10
}
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell
return cell
}

以上
isHeddenの注意点
TebleViewの上にViewがあって、そのViewがisHedden = trueにもかかわらず、
cellタップが効かない!と思ったら、
Autorayout でUserInteractionEnabled のチェックを外す。
複数のストーリーボード
複数のストーリーボードを使って、NavigationControllerで画面遷移する場合
①ストーリーボードを追加する(今回、ファイル名はStoryboard.storyboard)
②identity inspectorで、対応するViewControllerとStoryboard ID を設定する。

③コードを追加
//定数にストーリーボードのファイル名を指定 let storyboard: UIStoryboard = UIStoryboard(name: "Storyboard", bundle: nil) //ここで、ストーリーボードとViewControllerを結びつけ let next = storyboard.instantiateViewController(withIdentifier:"Storyboard") as?ToDoViewController //画面遷移 self.navigationController?.pushViewController(next!, animated: true)
以上
Navigation Controller関係
ナビゲーションバーにボタンをつけたいとき
Bar Button Itemを選択して、Itemを置きたい場所にドロップすればいいだけ。「Bar Button Item」を選択することに注意
複数のストーリーボードでナビゲーションバーを使うとき
それぞれのストーリーボードでナビゲーションコントローラーを挿入する。