betahikaruのブログ

まとめる前の頭の内容を吐き出す。まとめた物はQiitaなどで。

iOSシミュレータでiOS8.1だとHTTP通信がエラーに

1・2年ぶりにiOSアプリの勉強を再開しています。が、早速ヤクの毛狩りに精を出してました。その結果をメモしていきます。

現象

iOSのバージョンによって、HTTP通信がエラーになったり通ったりする。 ログは以下。

2015-01-19 01:07:51.739 NetworkTest[11594:478081] error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo=0x7fdcb270bd70 {NSUnderlyingError=0x7fdcb266a910 "The network connection was lost.", NSErrorFailingURLStringKey=http://api.tiqav.com/search/random.json, NSErrorFailingURLKey=http://api.tiqav.com/search/random.json, _kCFStreamErrorDomainKey=1, _kCFStreamErrorCodeKey=57, NSLocalizedDescription=The network connection was lost.}

HTTP/HTTPS通信の可否とiOSのバージョンの対応。色々試した感じ、こうなった。iPhone6/plusはiOS8以降しか無いので、iPhone5sと同じだった。

2015/03/28 追記

原因は、ウイルスバスター for Mac でした。

これで解決!

Thanks for ... ios.steppers-hi.net

環境

検証ソース

(NSString)getHttpDataWithUrl:(NSString)url メソッドを見てください。

NetworkTest/ViewController.m at master · betahikaru/NetworkTest · GitHub

Qiita情報

明らかに以下と同じ現象だが、ウイルスバスター for Mac を一時的に切ってもうまくいかなかったりした。もう少し、(シミュレータ、XcodeMacの再起動、シミュレータ内のAllow HTTPS なんとかオプションのきりかえを)試してみようと思う。

iOS SimulatorでiOS8を動作させるとHTTP通信ができない - Qiita

経緯

そもそもは、iOSで非同期通信をしてJSONを読む処理を、以下の記事を参考に実装したかった。

SwiftでWebAPIアプリを作った時の要点 - Qiita

たまたま既存のObjective-Cのアプリがあったので、そこに書くために必死こいてObjective-C化した。 そしたらエラーになったので、原因が分かるまで(厳密にはまだ特定できてないが)大変な時間がかかった。。。

まとめ

むずかしいっすよiOSアプリ。

parse.com のrubyラッパー

Parse.com を使いたい。 Parse.comのSDKとして用意されているのは以下。

また、Parse.com 上で処理するCloud Code (Node.js with Express)もある。

ただ、Parse.comのSDKは、アプリ固有のキーを使って初期化する必要があるので、Javascriptのように外部にキーが公開されるのはよろしくない。やっぱりサーバサイドで処理を書きたい。。。

javaな人なのでrubyは勉強中ですが、今回SDKを組み込みたいソフトウェア(拙作のaws-portal)がruby製なので、Parse.comのREST APIrubyラッパーがないか?と探してみた。

Parse.comのrubyラッパー

たぶん以下の2つが主なGEMだとおもう。GitHubのページ見たら、作者が同じだった。

parse_resource

RailsActiveRecordのようなインタフェースでREST APIを使えるActiveResourceというgemのがあるのだが、ActiveResourceのインタフェースっぽくParse.comのAPIを使える。というものらしい。最新versionは 1.8.0(2013年リリース...)。

README.mdから、使い方を引用します。

modelはこんな感じに定義したり、検索したり、保存できるらしい。

class Post < ParseResource::Base
  fields :title, :author, :body

  validates_presence_of :title
end

p = Post.new

# validations
p.valid? #=> false 
p.errors #=> #<ActiveModel::Errors:0xab71998 ... @messages={:title=>["can't be blank"]}> 
p.title = "Introducing ParseResource" #=> "Introducing ParseResource" 
p.valid? #=> true 

# setting more attributes, then saving
p.body = "Ipso Lorem"
p.date = Time.now
p.save #=> true

# ActiveRecord style find commands
Post.find_by_title("Uncrunched") #=> A Post object

# batch save an array of objects
Post.save_all(array_of_objects)

ユーザ作成(Sign up)とログイン・ログアウトはこんな感じ。

# app/models/user.rb
class User < ParseUser
  validates_presence_of :username
  fields :name, :bio
  fields :email
end

# create a user
user = User.new(:username => "adelevie")
user.password = "asecretpassword"
user.save #=> true

# check if a user is logged in
User.authenticate("adelevie", "foooo") #=> false

# A simple controller to authenticate users
class SessionsController < ApplicationController
  def new
  end
  def create
    user = User.authenticate(params[:username], params[:password])
    if user
      session[:user_id] = user.id
      redirect_to root_url, :notice => "logged in !"
    else
      flash.now.alert = "Invalid username or password"
      render "new"
    end
  end
  def destroy
    session[:user_id] = nil
    redirect_to root_url, :notice => "Logged out!"
  end
end

すごく、"Railsっぽい"という印象。

parse-ruby-client

今多分一番使われている?っぽいGEM。公式のSDKと同じような使用感になっているっぽい。ところどころ"TODO: Implement this!"となっているのがやや気になるが…。 こちらも、README.mdから、使い方を引用します。

オブジェクトの作成は以下。

#ruby
game_score = Parse::Object.new("GameScore")
game_score["score"] = 1337
game_score["playerName"] = "Sean Plott"
game_score["cheatMode"] = false
result = game_score.save
puts result

これ、Javascript SDKとかiOSAndroid SDKのものと凄く近い。

// JavaScript
var GameScore = Parse.Object.extend("GameScore");
var gameScore = new GameScore();
 
gameScore.set("score", 1337); 
gameScore.set("playerName", "Sean Plott");
gameScore.set("cheatMode", false);
gameScore.save(null, {
  success: function(gameScore) {
    // ...
  },
  error: function(gameScore, error) {
    // ...
  }
});
// Ojbective-C
PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
gameScore[@"score"] = @1337;
gameScore[@"playerName"] = @"Sean Plott";
gameScore[@"cheatMode"] = @NO;
[gameScore saveInBackground];

ユーザの作成(Sign up)、ログイン・ログアウトは以下。

# sign up
user = Parse::User.new({
  :username => "cooldude6",
  :password => "p_n7!-e8",
  :phone => "415-392-0202"
})
user.save

# login
user = Parse::User.authenticate("cooldude6", "p_n7!-e8")

# sign up by twitter o-auth
twitter_user = Parse::User::Twitter.new({
  "id" => "12345678",
  "screen_name" => "ParseIt",
  "consumer_key" => "SaMpLeId3X7eLjjLgWEw",
  "consumer_secret" => "SaMpLew55QbMR0vTdtOACfPXa5UdO2THX1JrxZ9s3c",
  "auth_token" => "12345678-SaMpLeTuo3m2avZxh5cjJmIrAfx4ZYyamdofM7IjU",
  "auth_token_secret" => "SaMpLeEb13SpRzQ4DAIzutEkCE2LBIm2ZQDsP3WUU"
})
twitter_user.save

あれ、ログアウトは、userをnilにすればいいのかな。 関係ないけど、rubyのnullってnilだっけ?swiftnilだけど。

まとめ

とりあえず parse-ruby-client を使えばいいんじゃないかな。

2015年 年始の状況

最近、またGitHubにソースをアップしだした。 作りたいものはたくさんあるので、忘れないようにブログに記録していきたい。

BaaS

今、BaaSを使ってみたい、Parse.comが使いたいという気持ちが高まっている。(DBの管理をしたくない) とりあえず以前作った、AWS APIの習作であるaws-portal に認証機能を付けてみたい。

betahikaru/aws-portal · GitHub

aws-portalは、「AWSマネジメントコンソールわからん!」「必要なとこだけみしてよ」という自分の不満を解消するために作った。 自分のアカウントのEC2やElasticBeanstalkの情報を確認したり、インスタンスを起動したりできる。実装言語はRubyで、フレームワークSinatraを使っている。

現時点では環境変数にIAMの情報を登録して使う形になっているが、Basic認証すらないため、アクセスした人すべてが何でも操作できてしまう。 Parse.comの提供している認証周りのAPIを使えば、楽にアカウントごとにIAMの情報を登録できるようになるのでは??Twitter連携とかも何も考えずに作れるのでは?という妄想をしている。

関連書籍は、パーフェクトRubyWEB+DB PRESS plus Ruby徹底攻略、他。

パーフェクトRuby

パーフェクトRuby

Ruby徹底攻略 (WEB+DB PRESS plus)

Ruby徹底攻略 (WEB+DB PRESS plus)

Swift

今度、2人暮らしをする事になった。こまごまとしたタスクやスケジュールを常に見える場所に置きたいな〜ホワイトボード買う?ほかに何か無いかな〜と考えていたら、会社のデジタルサイネージが目に入った。

家庭内デジタルサイネージ作りたい。

ちょうどいい事に、iPad miniも最近手に入れた。リビングにiPad miniを置いて、デジタルサイネージ的な情報が表示されてたらかっこいいのでは!?

ネイティブアプリの開発者は供給が足りていないと聞くし、いっちょSwiftiOSアプリ作れるようになりたい! (ぶっちゃけ、作るとしても普通のWebアプリかWebビューのネイティブアプリになるとおもう。)

関連書籍は、 WEB+DB PRESS Vol.84 のSwift@__gfx__ さんの記事、(と、iOS5時くらいの古い書籍…)

WEB+DB PRESS Vol.84

WEB+DB PRESS Vol.84

iOSプログラミング 第2版

iOSプログラミング 第2版

  • 作者: アーロン・ヒレガス,ジョー・コンウェイ,Aaron Hillegass,Joe Conway,木南英夫,上堀幸代,内橋真吾
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2011/12/21
  • メディア: 単行本(ソフトカバー)
  • 購入: 11人 クリック: 175回
  • この商品を含むブログ (11件) を見る

JavaEE

そうはいっても、学生時代からずっとJavaをやってきて、仕事でもJ2EEサーバを使っている自分としては、Javaの最新情報も知っておきたい。 つい最近までJava6だったし、JSFなんて存在さえ知らずJSP使っていたしで、かなり乗り遅れている感がある。 とりあえずやってみたいが、JavaEEはとりあえずやるには重厚すぎる…?とくにEJB

Spring Bootとかは、軽め?に見える。転職サイトの使用フレームワークにもSpringは結構あった。 Play Framework (+ Scala) とかは、正直面白そうだが、多分やらないと思う。

関連書籍は、Javaエンジニア養成読本、わかりやすいJavaEE ウェブシステム入門。

Javaエンジニア養成読本 [現場で役立つ最新知識、満載!] (Software Design plus)

Javaエンジニア養成読本 [現場で役立つ最新知識、満載!] (Software Design plus)

わかりやすいJavaEEウェブシステム入門

わかりやすいJavaEEウェブシステム入門

まとめ

とりあえずHelloWorld程度のリポジトリを量産して放置、というのが続いている。 aws-portal○×ゲームレベルのものは作ったが、胸を張って人に見せれるレベルまでは行ってない。

自分の代表作というか、ずっとメンテしていく価値のあるものを作りたい。

Webサイト運営のあれこれについて

負荷テストとかセキュリティチェックなど、色々な先人の知見を生かしたい。 以下のサイトなどを見て勉強しよう。