ページ

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

2018年3月10日土曜日

App ExtensionのShare Extensionを試す 【Swift】

App Extension

以下引用
App Extensionには、基盤となるアプリケーションの機能や能力を拡大する働きがあります。ユーザは、他のアプリケーションまたはシステムとやり取りしながらでも、その機能や能力を活用できます。
つまりはアプリの拡張(まんまw)

Share Extension

↓これ
image.png (65.3 kB)

:computer:環境構築


プロジェクトを作成して、Share Extension用のTargetを追加
image.png (120.6 kB)
image.png (70.5 kB)
Targetを追加すると以下のように聞かれる
image.png (31.9 kB)
-> 「Activate」を選択
Targetが追加されると ShareViewController.swiftが追加されている
swift
import UIKit
import Social

class ShareViewController: SLComposeServiceViewController {

    override func isContentValid() -> Bool {
        // Do validation of contentText and/or NSExtensionContext attachments here
        return true
    }

    override func didSelectPost() {
        // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.

        // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }

    override func configurationItems() -> [Any]! {
        // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
        return []
    }

}

App Groupの設定

もともとのTargetと追加したTargetの Keychain Sharing と App Groups をONにする
image.png (140.3 kB)

Info.plistの編集

扱えるデータ型を定義する
例) テキストを利用する、画像3枚、WebページのURLを1つまでとする場合
  <key>NSExtensionAttributes</key>
  <dict>
   <key>NSExtensionActivationRule</key>
   <dict>
    <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
    <integer>1</integer>
    <key>NSExtensionActivationSupportsImageWithMaxCount</key>
    <integer>3</integer>
    <key>NSExtensionActivationSupportsText</key>
    <true/>
   </dict>
  </dict>

この時点で一回実行させてみる:eyes:

追加したTarget(Share Extension実装用)を選択して実行すると

↑のようなダイアログが表示され、どのアプリケーションから Share Extension を動かすか選択できる
image.png (36.1 kB)image.png (72.7 kB)
ちゃんと表示されている!!!
今は選択すると
image.png (18.3 kB)
↑こんな感じになる

:pencil: 実装


ShareViewController.swift側の実装を後は好きなようにやる
既にあるメソッドの意味
メソッド何をするメソッドか?
isContentValidバリデーション(Postを押せる状態か?)
didSelectPostPostが押された後の処理
configurationItems追加項目のリスト管理

2016年6月8日水曜日

いつものアラートに飽きた時のオシャレなアラート Sweet Alert iOS


iOSにしてもAndroidにしても標準のアラートは味気ないものです。。
今回はそんな味気ない標準のアラートをシャレたアラートにしてくれる
Sweet Alert iOSを使ってみます。

標準のアラート

まずは標準のアラートです。
sweet_alert_1
はい、いたってシンプルです。

メッセージのみ

ではSweet Alert iOSを使ってアラートを表示させてみます。
まずはシンプルなメッセージのみのアラート
SweetAlert().showAlert("message")
sweet_alert_2
表示する時にアニメーションが付いてリッチな感じです。

タイトル + Success

次はアラートにタイトルを付け、Successのアラートスタイルで表示させてみます。
SweetAlert().showAlert("message", subTitle: "subTitle", style: AlertStyle.Success)
sweet_alert_3
アラートスタイルはenumで定義されており、
  • Success
  • Error
  • Warning
  • None
  • CustomImag(imageFile:String)
の5種類が設定できます。格段オシャレになりました。

ボタンイベント

最後にアラートにカスタムボタンを表示されてみます。
SweetAlert().showAlert("message", subTitle: "subTitle", style: AlertStyle.Warning, buttonTitle:"Cancel", buttonColor:UIColor.redColor() , otherButtonTitle: "OK", otherButtonColor: UIColor.blueColor()) { (isOtherButton) -> Void in
    if isOtherButton == true {

        print("Cancel Button Pressed")
    }
    else {
        SweetAlert().showAlert("OK", subTitle: "subTitle", style: AlertStyle.Success)
    }
}
sweet_alert_4
OKボタンが押されると別のアラートを表示させています。
アラート一つで雰囲気が全然変わりますね〜。



2016年3月27日日曜日

SwiftでRSpecみたいに書けるQuickを使ってみる 2


前回の続きになりますが、
色々な使い方を見てみたいと思います。
Nimbleassertionにどんなものがあるか確認してみます。

等価


同じ値を持っているか?をテストする
// 等しければテスト成功
expect(実際の値).to(equal(期待値))
expect(実際の値) == 期待値

// 等しくなければテスト成功
expect(実際の値).toNot(equal(期待値))
expect(実際の値) != 期待値

// 浮動小数点の等価テスト
expect(実際の値).to(beCloseTo(期待値, within: マージン値))
比較するオブジェクトはEquatableComparableプロトコルを実装または、
NSObjectのサブクラスでないと正しく比較されない
また、浮動小数点の等価テストの場合マージン値を設定します。
例)
expect(10.01).to(beCloseTo(10, within: 0.1)) // -> テスト成功

同一性


同じアドレスを指しているオブジェクトか?をテストする
// 同じアドレスを指していればテスト成功
expect(実際の値).to(beIdenticalTo(期待値))
expect(実際の値) === 期待値

// 同じアドレスを指していなければテスト成功
expect(実際の値).toNot(beIdenticalTo(期待値))
expect(実際の値) !== 期待値

比較


expect(実際の値).to(beLessThan(期待値))
expect(実際の値) < 期待値

expect(実際の値).to(beLessThanOrEqualTo(期待値))
expect(実際の値) <= 期待値

expect(実際の値).to(beGreaterThan(期待値))
expect(実際の値) > 期待値

expect(実際の値).to(beGreaterThanOrEqualTo(期待値))
expect(実際の値) >= 期待値
こちらもComparableプロトコルを実装しているオブジェクトである必要があります

クラス型


インスタンスのクラスが期待値のクラス又はサブクラスかテストします
// インスタンスがクラスのインスタスである場合テスト成功
expect(インスタンス).to(beAnInstanceOf(クラス))

// インスタンスがクラス又は寒クラスのインスタスである場合テスト成功
expect(インスタンス).to(beAKindOf(クラス))

Error Handling


Swift2.0のError Handlingのテストです。
Error Handlingとは?
Swift2.0から導入されたJava等で言う例外処理のこと
例)
// ErrorTypeプロトコルを実装したenumを作成
enum MyError: ErrorType {
    case InvalidNumber
    case OutOfRange
}
// エラーを投げる可能性があるメソッド
func something(number: Int?) throws {
    if (number == nil) { // 不正な値
        throw MyError.InvalidNumber
    }
    if (number > 50) { // 範囲外
        throw MyError.OutOfRange
    }
}
// エラーハンドリング
do {
    try something(60)
} catch {
    print("catch error") // エラーをキャッチ
}
上のようなMyErrorをthrowするメソッドのテストをQuickで行う場合
throwErrorを使用してテストを行う。
// エラーがthrowされればテスト成功
// (引数に70を指定しているのでMyError.OutOfRangeがthrowされる)
expect{ try something(70) }.to(throwError())
// エラーの型が`MyError`であればテスト成功
// 引数がnilの為`MyError.InvalidNumber`をthrowする
expect{ try something(nil) }.to(throwError(errorType: MyError.self))

2016年3月19日土曜日

SwiftでRSpecみたいに書けるQuickを使ってみる 1



Quickとは?
SwiftやObjective-CでRSpecみたいに書けるテストフレームワーク
公式ページ
また、Quickを使うにはNimbleが必要らしい。

Nimbleって?
ざっくりな説明ですが・・・
以前にXcodeに含まれる標準のXCTestを軽く紹介しましたが、
このXCTestで例えば 1 + 1 = 2のテストを書くと、
XCTAssertEqual(1 + 1, 2, "1足す1は2!!")
とこうなるが、Nimbleでは
expect(1 + 1).to(equal(2))
こう書くことができる。直感的です^^

インストール


早速インストール・・の前に今回テスト用のプロジェクトを作成します。
テンプレートとしてSingle View Applicationを選択。

プロジェクト名をQuickSampleとしました。
※ Testにチェックを忘れずに入れる
そしてインストールはCocoaPodsを使ってインストールしていきます。
※ CocoaPodsに関してはこちらを参照
作成したプロジェクト直下にPodfileを以下の内容で作成。
use_frameworks!

def quick_pods
    pod 'Quick', '~> 0.9.0'
    pod 'Nimble', '3.0.0'
end

target 'QuickSampleTests' do
    quick_pods
end
インストールを実行
$ pod install
インストールが成功するとQuickSample.xcworkspaceが作成されているので、
こちらを開きます。
$ open QuickSample.xcworkspace

これでインストールは完了です。

テストを書いてみる


実際にテストを書いてみたいと思います。
プロジェクト内にQuickSampleTestsが作成されていると思うので、
まず名前をQuickSampleSpecに変更します。
次にQuickSampleSpecを以下に編集します。
import Quick
import Nimble

class QuickSampleSpec: QuickSpec {
    override func spec() {
        describe("sample test") {
            it("1 + 1 = 2!!") {
                expect(1 + 1).to(equal(2))
            }
        }
    }
}
いたってシンプルですが、RSpecのような構文になっているかと思います。
当然テスト結果は成功になります。

また、配列に含まれているかのテストも↓のように書けます。
it("array contain") {
    expect(["luffy", "chopper", "zoro"]).to(contain("zoro"))
}
他にも便利なものがたくさんありますが、今回はここまで。

2015年12月6日日曜日

CocoaPodsを使ってみる



CocoaPodsとは
OSXのアプリやiOSアプリでのライブラリ管理ツール

   インストール


gemで提供されているので、rvmで専用のgemsetを作成する
$ rvm gemset create pod
CocoaPodsインストール
$ gem install cocoapods

$ which pod
/Users/XXXXXXX/.rvm/gems/ruby-2.1.0@pod/bin/pod
セットアップ
$ pod setup
Setting up CocoaPods master repo
Setup completed
とりあえずセットアップまではこれで完了

   実際に使う


使いたいプロジェクトへ移動 
※今回はiOSアプリ開発プロジェクトとして新規作成したTestSwiftプロジェクトを使用
$ cd TestSwift
Podfileをプロジェクト直下に作成し、以下内容に編集
platform :ios, "6.0"
pod 'AFNetworking', '~> 2.0'
↑例としてAFNetworkingライブラリをiOS開発プロジェクトに取り込む
ライブラリ取り込む前のファイル一覧
$ ls
Podfile             TestSwift           TestSwift.xcodeproj TestSwiftTests
ライブラリ取り込み
$ pod install
Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Installing AFNetworking (2.5.4)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `TestSwift.xcworkspace` for this project from now on.
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod
installed.
↓インストール後のファイル
$ ls
Podfile               Pods                  TestSwift.xcodeproj   TestSwiftTests
Podfile.lock          TestSwift             TestSwift.xcworkspace
作成されたTestSwift.xcworkspaceを開いて開発を行う
  • Xcodeを開いた様子
依存ライブラリ用のPodsアーカイブが作成されている
また、今回はSwiftからObjective-Cのライブラリを使用する為、 ブリッジ用のヘッダを作成する
#ifndef _AFTest_Bridging_Header_h
#define _AFTest_Bridging_Header_h

#import <AFNetworking/AFNetworking.h>

#endif /* _AFTest_Bridging_Header_h */
これをプロジェクトに追加しSwift Compiler - Code GenerationObjective-C Bridging Headerに設定してやる

これでAFNetworkingライブラリが使用可能になればOK