2016년 10월 26일 수요일

trobleshooting installation issue with CocoaPods

CocoaPods

http://mtsparrow.blogspot.kr/2016/03/cocoapod.html

github에서 좋은 오픈소스를 찾아 iOS프로젝트에 추가 하려고 하면
CocoaPods을 주로 사용 했다.

 프로젝트에 프레임워크를 추가 하기 좋긴 한대 가끔 이게 문제가 생기고
이유 없는 빌드 에러를 만들어 내면 남감 하다.

Xcode에서 이유없는 빌드 에러를 만나거나 오동작 할때는 가끔씩
rm -rf ~/Library/Developer/Xcode/DerivedData

여기를 정리 하곤 한다.

CocoaPods 도 무언가 오동작을 하거나 계속되는 이유없는 빌드 에러를 만날때 
해볼 만한 방법은

pod cache clean frameworkName1
pod cache clean frameworkName2
pod cache clean frameworkName3
pod cache clean frameworkName4
pod deintegrate || rm -rf Pods
pod install --verbose
rm -rf ~/Library/Developer/Xcode/DerivedData


요즘은 Carthage 를 많이 사용하는 것 같다.

하지만 아직 사용방법을 모른다.

나중에 새로운 프로젝트를 시작 할때는 참조 프레임워크를 Carthage로 추가 해봐야 겠다.

2016년 10월 23일 일요일

2007 mid mac mini ubuntu install




요약 :
우분투 32비트 설치를 위한 USB부팅 이미지를 만든다.
efi/boot/boot.iso

우분트 32비트 설치 이미지를 boot.iso로 이름을 변경해서 mac mini에 USB를 꽂은 다음 alt (option) 키로 부팅 하면
부팅 디스크 설정에서 usb선택시 32비트 우분투를 설치 할 수 있다.

설치 중간에 boot-repair를 이용해서 부트를 수정 하여 이제 옵션 키를 누르지 않고 바로 부팅이 가능하게 만든다.
다시 usb로 부팅해서 파티션을 나눈다. 32비트 우분투는 20기가 정도 설정한다.

UNetbootin 을 32비트 우분트에 설치해서 64비트 우분트를 내려 받고 설치 한다.


아래에 링크를 따라 하면 설치 할 수 있다.

http://digiecologist.blogspot.kr/2015/12/installing-ubuntu-on-2007-mac-mini-a1176.html


아래의 내용은 따라 하면 에러가 난다.
sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
sudo apt-get install -y boot-repair
boot-repair

이과정에서 key 에러가 나면
http://askubuntu.com/questions/308760/w-gpg-error-http-ppa-launchpad-net-precise-release-the-following-signatures

The link above provides detailed explanation with screenshots. It also has some other simple methods that could be tried before doing this manually. Since it is not accessible from some regions let me describe the method that worked for me.

Go to the OpenPGP Public Key Server. There you can enter your key into the Search String field, leaving everything else as is, then click "Search!".
When searching for a key, always prepend 0x to it! This means that, for example, you have to search for 0x6AF0E1940624A220 instead of 6AF0E1940624A220.
Click on the link provided in the pub section. This should take you to page containing the key. The page's heading should be similar to Public Key Server -- Get "0x6AF0E1940624A220"
Copy everything from underneath the title (starting from -----BEGIN PGP PUBLIC KEY BLOCK-----) and save it in a file (e.g. key1).
Once you have the file, run the following command
sudo apt-key add key1

http://keyserver.ubuntu.com
위 내용으로 처리


몇시간 삽질을 하니 이 사이트에 도움되로 잘 설치 된다.
이제 맥미니 2007은 우분트 14.04로 다시 태어 났다.

2016년 10월 1일 토요일

C# FCM 푸시 전송 어플리케이션 만들기

FCM firebase Cloud Message
https://firebase.google.com/docs/cloud-messaging/?hl=ko

GCM에서 FCM으로 변경 되고 있다.

푸시를 전송 하는 것은 구글 사이트에 요청 하면 된다.
결국 http url request 를 하면 되는 것이고 그것을 어떠한 언어로든 구현 하면 된다.

전송되는 메세지는 json 포멧으로 전달 하면 된다.

이런 것을 지원 해주는 앱으로 구글 포스트 맨도 있다.
https://www.getpostman.com

FCM으로 변경되면서 직접 테스트로 push를 발송 해보는 페이지도 있으니 사실 테스트 어플리케이션이나 포스트맨 어플은 필요 없을수도 있다.

하지만 이번에 개발을 하면서 이미 구현된 서버가 C#으로 구현되어 있다.
모바일 앱과 동작 하는 앱서버가 C#으로 구현 되어 있고
여기에 푸시 기능을 추가 하려 하니 당연히 C# 코드가 필요 했다.

https://github.com/UniverseBryan/FCMWinServer

여기 코드를 참고 해서 간단한 윈폼 어플을 개발 해 보았다.

C#언어로 개발 해본 경험이 없지만
아주 생산성이 좋은듯 하다. 그동안 M$ 개발툴을 너무 멀리 하고 있었는데.
최근 파이썬을 비줠스튜디오로 만지면서 비줠스튜디오 커뮤니티 에디션을 조금 만저 봣는데
나름 C#도 생산성이 좋은 언어 인듯 하다.

아래의 코드가 푸시 전송 코드이다.
폼에 텍스트 입력 두개와 버튼 하나를 언지고
git에서 어든 dll파일을 추가해서 참조에 추가 하고 아래의 코드를 폼 코드에 추가 하면 된다.


using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string res = SendNotification("app registration token key string 152 bytes here", textBox2.Text);
        }


        public string SendNotification(string deviceId, string message)
        {
            string SERVER_API_KEY = "API KEY STRING";
           
            var value = message;
            string resultStr = "";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://fcm.googleapis.com/fcm/send");
            request.Method = "POST";
            request.ContentType = "application/json;charset=utf-8;";
            request.Headers.Add(string.Format("Authorization: key={0}", SERVER_API_KEY));

            var postData =
            new
            {
                data = new
                {
                    title = textBox1.Text,
                    body = message,
                },

                // FCM allows 1000 connections in parallel.
                to = deviceId
            };

            //Linq to json
            string contentMsg = JsonConvert.SerializeObject(postData);
            Debug.WriteLine("contentMsg = " + contentMsg);

            Byte[] byteArray = Encoding.UTF8.GetBytes(contentMsg);
            request.ContentLength = byteArray.Length;

            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            try
            {
                WebResponse response = request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);
                resultStr = reader.ReadToEnd();
                Debug.WriteLine("response: " + resultStr);
                reader.Close();
                responseStream.Close();
                response.Close();
            }
            catch (Exception e)
            {
                resultStr = "";
                Debug.WriteLine(e.Message);
            }

            return resultStr;

        }

    }

   

}






2016년 9월 26일 월요일

UINavigationbar 1px bottom line 제거 하기

http://stackoverflow.com/questions/19226965/how-to-hide-ios7-uinavigationbar-1px-bottom-line

네비게이션 바를 추가 하면 위와 같이 네비게이션바의 색상과 view의 색상이 일치 할때도 
1px  라인이 하나 있다.

이것을 제거 하려면 어떻게 해야 하는가?


stackoverflow에 아름다운 방법이 있었다.

저 밑줄의 view를 찾아 내서 hidden 시켜 버리는 것이다.

private var shadowImageView: UIImageView?
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        
        if shadowImageView == nil {
            shadowImageView = findShadowImage(under: navigationController!.navigationBar)
        }
        shadowImageView?.hidden = true
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        
        shadowImageView?.hidden = false
    }
    
    private func findShadowImage(under view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1 {
            return (view as! UIImageView)
        }
        
        for subview in view.subviews {
            if let imageView = findShadowImage(under: subview) {
                return imageView
            }
        }
        return nil
    }


UIImage 이면서 height 가 1인 view를 찾아서 그것을  viewWillAppear() 메서드에서 hidden을 시키는... UIImage height가 1인 디자인을 추가 하지 않는한 정상적으로 동작 한다.


2016년 9월 19일 월요일

XCode 이전 버젼 다운 받기

https://developer.apple.com/download/more/



다행이도 7.3.1 을 받을 수 있다.


Xcode 7.3.1.dmg

XCode 8로 업그레이드 했다가 다른 라이브러리들이 지원을 하지 못하는 경우 어쩌나!

돌아 갈 수 있다.

2016년 9월 17일 토요일

XCode 8 , swift 2.3, 3.0 코드 컨버트

9월 14일 XCode 8이 출시 하였다.

업그레이드를 해야 하나 ....

이전에 swift2.0 2.1, 2.2등에 마이너 업그레이드 시에 자동으로 소스 코드를 변환 시켜줘서 문제 없이 동작 하기에 감행한 적은 있었다.

XCode 8은 swift 2.3과 3을 동시에 지원 하며 변환도 선택적으로 가능 한 듯 하다.
swift는 아직도 진화 중이다.



Convert 버튼을 누르면 다음과 같은 화면이 나타난다.



일단 디폴트는 3.0이지만 2.3을 선택 해보았다.



프로젝트에서 이용하는 다른 프레임워크도 변환 하는 체크가 있다.


생각 보다 적은 수의 파일이 변환해야 한다는 프리뷰 화면이 뜬다.
대부분 옵셔널 (!) 을 추가 해주는 변환이 많더라

swift 2.2 상태로 그대로 빌드 하면 어떻게 되나 해보았다.
XCode 8로 업그레이드 했지만 이전 코드를 그대로 빌드 할 수 있다면
구지 변환 하지 않고 그냥 그대로 고고 하고 싶다.



역시나 swiftJSON, Alamofire 등 다른 프레임워크에 문제가 있다.


swift 3.0으로 변환 하니 와우! 엄청나게 많은 파일을 수정 해야 한다는 preview...


신규 프로젝트는 3.0으로 가야 겟지만...
나머지는 그냥 2.3으로 가자 ㅠ.ㅠ








android - retrofit + gson 삽질기

아이폰에서 RESTfull API를 통한 서버 통신 앱을 만든다고 한다면
Alamofire + swiftyJSON 을 이용하면 간단하게 REST API 통신을 하고 JSON 파싱을 통해 데이터를 이용 할 수 있다.

안드로이드에서 같은 기능을 수행하는 라이브러리는 retrofit과 gson 조합이다.
retrofit + gson


https://github.com/square/retrofit
공식 github 사이트

여기에 보면 github 서비스 예제가 있다.
테스트해보면 잘된다.

하지만 나 처럼 안드로이드 개발 초보 입장에서 삽질은 여럿 도사리고 있었다.

삽질 항목을 나열 한다.

retrofit 2 버젼 기준으로. 이전 버젼은 사용해보지 못했으니 모른다.

1. interface에서 부분 URL이 되는 곳에서 백슬레쉬 /으로 시작 되면 안된다.

public interface Login {
    @GET("Login")
....


여기서 /Login 안된다

baseURL에서 포트 번호가 문제인지. 한참을 고생 했다. 결국 baseURL 쪽에 /로 끝내고
인터페이스 쪽에서는 /로 시작 하지 않게 하니 되더라

다른 인터넷 예제를 보면 그렇게 하지 않아도 되는 코드 들이 잇는 것으로 보아 정확한 문제를 모르겠다. 하지만 2.1.0에서 분명 문제가 발생 한다.


2. github 예제 처럼 @Path 만 있는게 아니다.
https://futurestud.io/tutorials/retrofit-multiple-query-parameters-of-same-name
여기를 참고 하면 파라메터 전달에 대해 @Query()를 쓰는게 참고가 되더라


이렇게 두어가지 문제로 삽질좀 하고 나니 나름 편하게 사용할 수있는 라이브러리 같다.