Swift3.0 正規表現 について

過去の Swift バージョンで記述したコードが Swift3.0 でコンパイルした際に警告を出力していたので書き直した.

簡単に個人的なメモ
– Swift は正規表現は,NSRange などを使用する必要があるため少し面倒.
– 正規表現を扱うには,NSRegularExpression インスタンスを使用する.
– 正規表現の検索結果を参照する必要がある場合,regex.matches を参照する.
– String クラスの characters.count は文字列の文字を,全角半角関係なく1文字と数える.
– NSString クラスの length は,全角文字を半角文字2文字分として数える.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import Foundation
extension String {
    var count: Int {
        let string_NS = self as NSString
        return string_NS.length
    }
 
    // 正規表現で検索する.
    // .caseInsensitive 大文字小文字の区別を無視する
    func pregMatche(pattern: String, options: NSRegularExpression.Options = [.caseInsensitive]) -> Bool {
        guard let regex = try? NSRegularExpression(pattern: pattern, options: options) else {
            return false
        }
        let matches = regex.matches(in: self, options: [], range: NSMakeRange(0, self.count))
        return matches.count > 0
    }
 
    // 正規表現で検索する.(検索結果を使用)
    func pregMatche(pattern: String, options: NSRegularExpression.Options = [.caseInsensitive], matches: inout [String]) -> Bool {
        guard let regex = try? NSRegularExpression(pattern: pattern, options: options) else {
            return false
        }
        let targetStringRange = NSRange(location: 0, length: self.count)
        let results = regex.matches(in: self, options: [], range: targetStringRange)
        for i in 0 ..< results.count {
            for j in 0 ..< results[i].numberOfRanges {
                let range = results[i].rangeAt(j)
                matches.append((self as NSString).substring(with: range))
            }
        }
        return results.count > 0
    }
}

2016年 iOS 開発手法,使用しているライブラリなどまとめ

年末なので,聞いたり,自分が経験した iOS 開発手法についてまとめておこうと思います.

個人的にはようやく今年の後半になって Swift3 のみで書かれたアプリ開発に参加しました.
以下のライブラリ,ツールの選定についても Swift3 を考慮した選定となっていると思います.
また,開発手法に関してもオブジェクトの配置は,コードベースの AutoLayout を採用したりと変化がありました.
来年もさらに,デバイスのスクリーン サイズが増えそうなので,AutoLayout まわりの知識はより必要となっていくと思われます.
以前,AutoLayout についてざっとチェックした際には,InterfaceBuilder での作業が繁雑であること.また,コードベースの AutoLayout は馴染みのない記載方法だと感じ,あまりいい印象はなかったのですが,最近では AutoLayout + ライブラリ(snapkit など)の利用でレイアウト制約を記述する負担を軽減する手法も紹介されつつあるようです.
今後の技術トレンドとしては,プロトコル指向についてウォッチしていきたいなと考えています.

▼ 開発ツール,ライブラリ

Xcode これがないと始まらない標準 IDE
CocoaPods ライブラリ管理
Carthage ライブラリ管理
Bundler CocoaPodsのバージョンを管理.
SwiftLint コードの品質チェックツール
Swimat Swift の Formatter
mergepbx pbxファイルのマージ用
SnapKit AutoLayout を DSL 風に記述できる.
R.swift Storyboard名や画像名をプロパティーとして取得できる.
Alamofire 通信ライブラリ
ObjectMapper
AlamofireObjectMapper
Kingfisher 画像ダウンロード
XCGLogger ロガー
KeychainAccess Keychainを簡単に使うライブラリ
RealmSwift データベース

▼ SwiftLint

https://github.com/realm/SwiftLint
インストール方法
brew install swiftlint

SwiftLintを試してみた

▼ mergepbx

Xcode プロジェクトの構成情報 pbxproj ファイルを Git でマージするときに手助けしてくれるツール.

インストール方法
$ git clone https://github.com/simonwagner/mergepbx
$ cd mergepbx/
$ ./build.py
$ sudo cp mergepbx /usr/local/bin/

mergepbxを使ってみる

▼ SnapKit

https://github.com/SnapKit/SnapKit#installation
http://snapkit.io/docs/

▼ R.swift

StoryboardからViewControllerを取得する
画像リソースを取得する
フォントやLocalizable Stringを取得する

さらに便利になったR.swiftの実力を見るがいい

R.swiftを使ってStoryboard名や画像名のTypoを0にする

▼ Kingfisher

KingFisher は,SDWebImageを参考にSwiftで実装されていそうです.

[Swift]KingFisherで画像URLから画像データをダウンロード

▼ KeychainAccess

SwiftでKeychainを簡単に使うライブラリ “KeychainAccess” を書きました

▼ RealmSwift

公式ドキュメント
https://realm.io/jp/docs/swift/latest/

RealmSwift入門編

Realm Swiftのまとめ

▼ 参考:

妄想iOSアプリ新規開発

iOSアプリケーションでコードベースのレイアウトを積極利用する

▼ 今後,チェックしたい技術トレンドなど

オブジェクト指向とプロトコル指向
画面遷移(ルーティング)

UIActivityViewController の使用方法について

先日,LINEで送る機能を実装したのが,UIActivityViewController を使用する際に iOS仕様で悩んだ点があったので,メモしておく.

従来よりアプリに「LINEで送る」機能を実装する場合,line://msg/ といった URLをオープンすることで LINE アプリを起動してメッセージを送信する手法を利用していたのだが,今回は UIActivityViewController を使用してみた.

まず,UIActivityViewController についてよく分からなかったのが,上段/下段がどのようなルールで分けられているのか?という点.

調べてみると iOS としては,Share (Share Extension) / Action (Activity) で分けたいようだ.
(サンプルとしてみた資料に上段,下段ともに Evernote の色つきアイコンと白黒アイコンが並んでいる様子をみて,最初意味が分からなかった.それぞれのアイコンでどこが違うの?)

これは,少し分かりづらい仕様だと思います.
(実際には,下段に表示される Activity でもプロパティー設定により,上段で表示することが可能.)

UIActivityViewController
これらを把握しておけば,簡単に実装できます.

Acitivity を理解したければ,以下のライブラリのコードをざっとみれば確認できます.

以下,調べた事柄をメモしておきます.

▼ iOS アプリから「LINEで送る」には?

LINE 公式
https://media.line.me/ja/

▼ iOS「LINE で送信」を行えるライブラリ

LineActivity
https://github.com/OopsMouse/LINEActivity

LineKit
https://github.com/dlackty/LineKit

▼ UIActivityViewController を使用する方法

上記のライブラリを使用して,UIActivityViewController に LINE のアクティビティを表示するには,以下のようにする.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NSArray *activities = @[[[LINEActivity alloc] init]];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[shareText]
                                                                         	applicationActivities:activities];
// 使用しないアクティビティタイプ
NSArray *excludedActivityTypes = @[ UIActivityTypePostToWeibo,
                                    UIActivityTypeSaveToCameraRoll,
                                    UIActivityTypePrint,
                                    UIActivityTypeCopyToPasteboard,
                                    UIActivityTypeAirDrop,
                                    UIActivityTypeAssignToContact,
                                    UIActivityTypeAddToReadingList,
				    UIActivityTypeMail,
                                    UIActivityTypeMessage ];
activityVC.excludedActivityTypes = excludedActivityTypes;
[self presentViewController:activityVC animated:YES completion:NULL];

– iOS 7からUIAcitivityが上段と下段に分かれたデザインが採用されている.
+ (UIActivityCategory)activityCategory に以下の値を指定することで表示位置が指定できる.
上段: UIActivityCategoryShare
下段: UIActivityCategoryAction

▼ 注意点

– URLスキームがiOS9から使用方法が変更されている点
・iOS9から従来のopenURLメソッドを実行するだけでは,カスタムURLスキームが使用できなくなっている.

・カスタムURLスキームを使用するには,Info.plist に以下の設定を追加する.
custom_url_scheme は,「://」が必要ないことに注意.

1
2
3
4
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>custom_url_scheme</string>
</array>

通知センターにウィジェット(Widgets)背景色が黒色になる件

先日,通知センターのウィジット背景色が黒色のものがあることに気がついた.
ウィジットのコードを調べ,背景色を黒 → 白にする方法で少し悩んだのでメモしておく.

today_extension_%e8%83%8c%e6%99%af%e8%89%b2

結論としては,iOS 10 で背景色を白にするには Xcode 8 でビルドすればよいようだ.

iOS 8 から通知センターにウィジットを設置できるようになったが,iOS 10 では通知センターのデザインなどが変更されており,基調色,形状のデザインが変更されているが,それらに対応するには Xcode 8 以降でアプリをビルドする必要があるようです.

ついでにウィジットについてよく知らなかったので,ウィジットについても調べてみた.

▼ ウィジットとは?

・iOS 8 から通知センターにウィジットを設置できるようになった.
・ウィジットは Extension のひとつ.
・iOS では,以下の6種類の Extension ポイントというのがある.

【App Extensionsの種類】
• “Today”
「今日(Today)」ビューに組み込む Extension をウィジェット (widget) .
• “Share”
「Share」Extensionは、情報投稿サイト、アップロードサービスなどを利用し、情報を共有する ための便利な手段を提供する.
• “Action”
「Action」Extensionは、ホストのアプリケーションのコンテンツを表示または転送するために使用する.
• “Photo Editing”
iOSでは、「Photo Editing」Extensionを「写真(Photos)」アプリケーション内で、写真や動画を 編集するために使用する.
• “Finder Sync”
OS Xの、「Finder Sync」Extensionでは、Finderのユーザインターフェイスを、ファイルの同期 状況やコントロールを表すよう安全ですっきりした方法で変更できる.
• “ドキュメントプロバイダ”
iOSでは、よく使う形式のドキュメントを遠隔保管するアプリケーションは、「Document Provider」Extensionの実装を検討すること.
• “カスタムキーボード”
カスタムキーボードは、システムキーボードに代わるもので、斬新なテキスト入力法を求めるユー ザ、iOSが未対応の言語を入力しようとするユーザなどを対象としている.

参考:App Extensionsプログラミングガイドより
参考:iOS 8から導入されたウィジェット機能を使ってみる
参考:Today ウィジェットの実装方法~導入から Tips まで #ios8yahoo

では!

「Apple Music カード 12ヶ月」が Mac の iTunes から登録できないことがある件

最近,Apple Music で音楽を聴いています.
とても便利ですね.
若かりし頃に買いそびれたアルバムなど聞いています.

これから改善していって欲しい部分もありますが,大変便利に利用させていただいています.
(iOS 10 のミュージック アプリの UI は如何なものかと思いますが…)

先日,「Apple Music カード 12ヶ月」9,800円の登録時にエラーが発生し,メンバーシップが適切に延長されないという経験をしたので,メモしておきます.

同じような操作でエラーを見たような…という方は,メンバーシップの延長が行われているか?確認されることをお勧めします.

▼ 「Apple Music カード 12ヶ月」9,800円 とは?

「Apple Music カード 12ヶ月」9,800円 は,9,800円で12ヶ月のメンバーシップを延長できるというカード(もしくは,コード)です.
通常は年間 980円 x 12ヶ月 = 11,760円 かかる費用が,9,800円となるため,実質2ヶ月間無料となり,少しお得というカードです.

▼ Mac の iTunes から Apple Music カードの12ヶ月コード登録でエラーが発生

ソフトバンクオンラインショップで,Apple Music コードを購入し,Mac の iTunes で登録したのですが,エラーが発生.
結果,メンバーシップの延長がされていなかったようです.
(通常は,オンラインショップの購入でコードが提示され,コード(リンクになっている)をクリックすることで iTunes が起動し,コードが登録できるようです.)
利用環境: macOS Sierra バージョン 10.12

本来であればメンバーシップの延長が行われ,以下の方法で1年間の延長がされたことが確認できます.

▼ “Apple Music メンバーシップ” 契約状態の確認方法

iPhone の [設定] – [iTunes StoreとApp Store] – Apple IDを選択.[Apple IDを表示]を選択.
[登録]の”管理”を選択.
“Apple Music メンバーシップ”画面より”個人(1年)”という契約が確認できます.

実際には延長は行われず,マイアカウントに 9,800円が加算された状態となっていました.
実質2ヶ月無料というコードを購入しているわけですから,通常の 9,800円のみ課金した状態では,意味がありません.

上記のような状態の方は,Apple のサポートに連絡し,再度,コード登録をされた方がいいと思います.

私の場合は,サポートに連絡し,コードの解除を行ってもらい,再度,24時間後に iPhone の iTunes Store からコード登録することでメンバーシップの延長を行うことができました.

メンバーシップの確認

▼ Apple サポートへのお問い合わせ

Apple サポートへのお問い合わせ
サポートの方法は,上記リンクより「メール」,「今すぐアドバイザーと話す」,「指定した日時に電話してもらう」方法が選択できます.

iPhone でのコード登録手順は,以下で説明されています.

iPhone、iPad、iPod touch、Mac のカメラで iTunes Card や Apple Music ギフトカードを使う

では!

メールタイトル:Your app(iOS) status is Pending Contract を受け取ったら確認すること

先日,iTunes Connect から以下のメールが届いた.
契約の意味がよく分からなかったのだが,「Apple Developer Program – Membership for one year」の更新を行っていなかったことを思い出した.

早速,契約の更新を行い事なきを得たのだが,メール文面に「Apple Developer Program – Membership for one year」の文言がなく少しフリーズしてしまったので,メモしておく.

メールの文面は正しいと思うんですが,少し不親切じゃないのかな?

メールタイトル:Your app(iOS) status is Pending Contract

The status for the following app has changed to Pending Contract.
(省略)
To make changes to this app, go to My Apps on iTunes Connect.

変数に警告を定義する方法

プログラム中の変数に警告を定義するには以下のようにすれば良い.

この変数属性は、ARM コンパイラでサポートされている GNU コンパイラの拡張機能

extern int Variable_Attributes_deprecated_0 __attribute__ ((deprecated));

参考:RealView Compilation Tools コンパイラリファレンスガイド
4.5.4. __attribute__((deprecated))

SQLite を C/C++ のインタフェースでアクセスする方法

2016年現在では,iOS アプリでローカルのデータベースへアクセスする手法はライブラリを使用する方法が主流だと思います.
Magical Record,新しいデータベースとしては,Realm (レルム)とかでしょうか.

ですが,過去に作成されたアプリの回収など,C/C++ のインターフェースを用いたアクセスを行っているアプリを改修する機会もあるかと思います.

今回そのような機会があったので,簡単に概要を把握できる資料を探してみました.
以下に簡単に記しておきます.

【cocos2d-x】sqlite3のドキュメントを訳してみた

C インタフェースの説明が記されています.
これらのインタフェースを把握するだけで,とりあえず SQL文の発行ができるので,事足ります.

SQLiteの基本的な使い方

サンプルソースが記されています.
上記で把握したインタフェースの使用方法が理解できます.
とりあえずこれだけ読めば,10分程度で SQLite に SQL文が使用できるようになります.

Xcode のログをフィルタリングする方法

複数人のチームで開発しているプロジェクトの場合,ログ出力でアプリの動作を検証しようとしても既にたくさんのログが出力されていて目的のログを見つけるのが大変だったりします.

今回はデバッグ出力をフィルタリングする Xcode プラグインを導入することで対処します.
ついでに,コードエディタのカレント行をハイライトするプラグインも導入します.
→ カレント行に下線を引くプラグインが見つけられなかった. 😉

Xcode のプラグラインは,Package Manager で管理することができます.

Alcatraz (The package manager for Xcode)
http://alcatraz.io

インストール方法

curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh

アンインストール方法

rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin

全てのキャッシュデータを削除する

rm -rf ~/Library/Application\ Support/Alcatraz

MCLog (ログ出力をフィルタリングできる)
https://github.com/yuhua-chen/MCLog

Backlight (コードエディタのカレント行をハイライトする)
https://github.com/limejelly/Backlight-for-XCode

Xcode の Edit – Backlight に設定項目が追加されます.

カラーを #FFFFCC に設定するといい感じです.

カラーを #FFFFCC に設定するといい感じです.


🙂

AppStore にバージョンアップしたアプリを公開する手順

自分で iOS アプリをリリースしてたので,手順・気づいた点をメモしておきます.

1. アプリをアップロードする.

Xcode – Product – Archive メニューからアプリをビルドし,
Xcode – Window – Organizer からアプリをアップロードする.
(アップロード前には,Validate して申請上問題がないか?確認する.)

アプリを Organizer からアップロードする

アプリを Organizer からアップロードする

以下に詳細な手順が説明されている.
【iOS, 申請】iOSアプリの申請プロセスについてPart3 〜リリース用アーカイブファイル作成編〜

アプリのアップロード後は,iTunes Connect に反映されるまで,15分程度かかる.(2016/3 現在)

2.アプリの最新情報を作成する.

App Storeに表示するバージョン情報の文言を用意する.
(多言語対応している場合は,それぞれの言語で用意する.)

アプリのバージョン情報を記入する.

アプリのバージョン情報を記入する.

スクリーンショットの準備について

スクリーンショットを変更する場合は,それぞれの言語用にスクリーンショットも用意する.
スクリーンショットを用意するのは,3.5 〜 5.5 インチの画像(4 x 5パターン)が必要.また,多言語対応している場合,それぞれの言語用に作成しなければならない.
作成枚数がかなり多いので,私は以下のサービスを利用してスクリーンショットを用意している.
(無料ユーザでも作業できるので,一度利用してみるのがいいと思います.)

LaunchKit – Screenshot Builder

アプリのアップロード後は,iTunes Connect に反映されたら,アプリを設定する.

アプリのアップロード後は,iTunes Connect に反映されたら,アプリを設定する.

3. アプリを審査に提出する.

iTunes Connect の“審査に提出する”ボタン押下後に以下の設問に回答する.
・輸出コンプライアンス
・広告ID(Advertising Identifier又はIDFA)

AdMob を利用している場合,以下のように回答し,問題なく公開されました.(2016/3 現在)

AdMob を使用している場合

AdMob を使用している場合

▼ その他,気づいた点など

・公開までのおおよその日数を知るには?

以下のサービスで,公開までのおおよその日数を知ることができます.
Average App Store Review Times

・多言語対応したアプリを公開する場合,プライマリ言語を英語にする.
サポート言語以外の国ではプライマリ言語でアプリ情報が表示されるため,プライマリ言語を英語にしておく方がよいです.

・AppStore で表示されるアプリ名を変更するには,新しいバージョンのアプリをリリースする必要がある.
多言語対応している場合,それぞれの言語でアプリ名を設定することができます.
しかしながら,すでに公開しているアプリに関しては,新しいバージョンのアプリをリリースする必要があるため,注意が必要です.