Migrating from UIWebView / WebView to WKWebView

WKWebView has been the preferred API since iOS 8. But if your app still hasn’t made the switch, be advised that UIWebView and WebView are formally deprecated in iOS 12 and macOS Mojave, and you should update to WKWebView as soon as possible.

To help make that transition, here’s a comparison of the APIs of UIWebView and WKWebView:


var scrollView: UIScrollView { get } var scrollView: UIScrollView { get }
  var configuration: WKWebViewConfiguration { get }
var delegate: UIWebViewDelegate? var UIDelegate: WKUIDelegate?
  var navigationDelegate: WKNavigationDelegate?
  var backForwardList: WKBackForwardList { get }



func loadRequest(request: URLRequest) func load(_ request: URLRequest) -> WKNavigation?
func loadHTMLString(string: String, baseURL: URL?) func loadHTMLString(_: String, baseURL: URL?) -> WKNavigation?
func loadData(_ data: Data, mimeType: String, characterEncodingName: String, baseURL: URL) -> WKNavigation?  
  var estimatedProgress: Double { get }
  var hasOnlySecureContent: Bool { get }
func reload() func reload() -> WKNavigation?
  func reloadFromOrigin(Any?) -> WKNavigation?
func stopLoading() func stopLoading()
var request: URLRequest? { get }  
  var URL: URL? { get }
  var title: String? { get }



  func goToBackForwardListItem(item: WKBackForwardListItem) -> WKNavigation?
func goBack() func goBack() -> WKNavigation?
func goForward() func goForward() -> WKNavigation?
var canGoBack: Bool { get } var canGoBack: Bool { get }
var canGoForward: Bool { get } var canGoForward: Bool { get }
var loading: Bool { get } var loading: Bool { get }

Javascript Evaluation


func stringByEvaluatingJavaScriptFromString(script: String) -> String  
  func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((AnyObject?, NSError?) -> Void)?)



var keyboardDisplayRequiresUserAction: Bool  
var scalesPageToFit: Bool  
  var allowsBackForwardNavigationGestures: Bool


WKWebView currently lacks equivalent APIs for paginating content.

  • var paginationMode: UIWebPaginationMode
  • var paginationBreakingMode: UIWebPaginationBreakingMode
  • var pageLength: CGFloat
  • var gapBetweenPages: CGFloat
  • var pageCount: Int { get }

출처 : https://nshipster.com/wkwebview/

Posted by 예배하는 프로그래머

iOS6 에서 부터 Safari 기본 쿠키설정이 항상에서 허용된곳 으로 바뀌었습니다.

PG사의 결제모듈을 진행중 세션 및 쿠키를 이어가는 중 최종 결제 페이지로 넘어가지 않는 현상이 일어나서 찾던중의 

NSHTTPCookieStorage sharedHTTPCookieStoragesetCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

을 발견하였습니다. 

위의 코드는 Safari에서는 항상 허용으로 설정하는 것과 같은 의미라 보시면 됩니다. 
해당 웹뷰에 복사에서 써주세요.

Posted by 예배하는 프로그래머

Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

xcode디버깅을 하다가 종종 발하는 오류인데, 다른 프로젝트를 import 하거나 샘플을 받아 할 경우 armv6 과 armv7의 Build Active를 일치를 시켜줄 경우 무리없이 된다. 찾아본 경과 64-bit 의 시뮬레이션의 더이상 xcode 5.1의 제공하는 것을 받을수 없는거 같은데... 확실함은 잘 모르겟다. 

나는 아래와 챕쳐처럼 해결을 하였는데, 경우에 수에 따라 아래의 링크에서 확인하여 조치할 수 있을거 같습니다. 

그외 다른 방법들은 아래를 참고하여 해결해보세요~

 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386). 

These are my target build settings:

Xcode target build settings

I tried changing “Build Active Architecture” to No, as well as adding “i386″ to the “Valid Architectures”, unfortunately neither worked. Thanks for any suggestions!

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

Add arm64 to the target’s valid architectures. Looks like it adds x86-64 architecture to simulator valid architectures as well.

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

Try removing all previous architectures (i.e. remove the ARCHS_STANDARD setting) at the same time as you add i386 to the Architectures. This should change the active architecture to i386. I encountered a similar issue when I tried to build for armv7 by default, but it kept trying to build for arm64. I changed ARCHS_STANDARD to ARCHS_STANDARD_32_BIT, and this changed the active architecture chosen.

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

Add: Architectures: $(ARCHS_STANDARD_INCLUDING_64_BIT)

Valid architectures: arm64 armv7 armv7s

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

I had the same error message after upgrading to XCode 5.1. Are you using CocoaPods? If so, this should fix the problem:

  1. Delete the “Pods” project from the workspace in the left pane of Xcode and close Xcode.
  2. Run “pod install” from the command line to recreate the “Pods” project.
  3. Re-open Xcode and make sure “Build Active Architecture Only” is set to “No” in the build settings of both the “Pods” project and your own project.
  4. Clean and build.

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

What you need to do is just set the ONLY_ACTIVE_ARCH to NO (at least works for me). Below is a screenshot for it:



As far as I know (please point it out if there’s something wrong, thanks), if you set ONLY_ACTIVE_ARCH to YES, it means the Xcode will only build for the active architecture (which refers to the device that’s active in Xcode currently). Seems Xcode’s default setting is set Debug to YES, so it won’t build binaries for other architectures when you only want to build for a special device that connected to your Mac.

The reason failed to build might be that, the project does not support the architecture of the device you connected. So the best solution is to add the right architecture for your device. Below is a list for architectures & the devices that support:

  • ARMv8/ARM64: iPhone 5siPad AirRetina iPad Mini
  • ARMv7s: iPhone 5iPhone 5ciPad 4
  • ARMv7: iPhone 3GSiPhone 4iPhone 4SiPod 3G/4G/5GiPadiPad 2iPad 3iPad Mini
  • ARMv6: iPhoneiPhone 3GiPod 1G/2G

So why “set the ONLY_ACTIVE_ARCH to NO works? Because the device can still run the binary that built for all architectures you added (pass the build), but will lose some performance. This’s just a quick solution, but not best.

Note: The more architectures you added, the bigger the binary will be generated. So it’s good to choose right architectures for your project. ;)

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

If you are using CocoaPods, the most likely problem is because your Pods project Build Settings for Build Active Architecture Only is set to Yes for Debug.

The solution is simple. Change it to No.

Similarly, change to No for your application project.

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

I had similar issue. Got it solved by changing “Architecture” to “$(ARCHS_STANDARD_32_BIT)” in Build Settings for Project.

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

I faced the same problem when running my app on iPad using xcode 5.1. It got resolved by removing armv7s from ‘valid architectures’ and setting the ‘build active architectures only’ value to No. Both these fields can be found in your app->targets->build settings->architectures.

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

In acrhiecture – sometimes to support 6.0 and 7.0 , we exlude arm64

In architectures – > acrchitecture – select standard architecture arm64 armv7 armv7s. Just below in Valid acrchitecture make user arm64 armv7 armv7s is included. This worked for me.

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

Just add arm64 in valid architecture.i hope it will work for you.

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

My problem was that the Pods project was targeting OS X, despite my Podfile having platform :ios. I’m using cocoapods 0.35.0.rc2.

To fix it, select the Pods project in the project navigator, and check that the Pods PROJECT node (mind you, not the Pods target) is targeting iOS. That is, the architectures build settings should be:

  • Architectures: $(ARCHS_STANDARD)
  • Base SDK: iOS 8.1
  • Supported Platforms: iOS
  • Valid architectures: $(ARCHS_STANDARD)

I also wanted to build all architectures, so I added the following to the Podfile:

post_install do | installer | installer.project.build_configurations.each do |config| config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' end end 

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

To avoid having “pod install” reset only_active_arch for debug each time it’s run, you can add the following to your pod file

# Append to your Podfile post_install do |installer_representation| installer_representation.project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO' end end end 

Answer: Xcode 5.1 – No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

Just in case, for anyone still encountering the issue despite following the above, check that the simulator you are running is also the supported one. I had mine specified to arm7 and arm7s but was trying to run the app on a 64 bit simulator.

Posted by 예배하는 프로그래머

ASIHTTPRequest 는 더 이상 ARC( Automatic Reference Counting) 제공하지 않는다. 

기존의 소스 및 프로젝트를 참고할 사항이 있어 매우 곤란한 사항에 처해 있었을때 아래와 같이 해결을 하였습니다. 

1. ASIHTTPRequest Library 의 모든 파일에 -fno-objc-arc 플래그를 넣어줍니다. 

click project name -> select target -> build phase -> compile sources

Set compile flags -fno-objc-arc for all ASIHTTPRequest source files.

2. 해당 관련 플레임워크를 임포트 해준니다. 





Posted by 예배하는 프로그래머

No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)

CocoaPods 의 프레임웍을 설치 후 

No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386) 의 에러를 발견하였다면 아래와 같은 작업을 하면 처리가 됩니다. 

1. Xcdoe에 물려 있는 Pods 플젝을 삭제하고 xcode을 종료합니다.
2. 필요한 pod install 을 하여 다시 리크래이트합니다 .
3. 다시 xcode을 오픈하여 
   a. build Activie Architecture Only 을 No 로 설정합니다. 여기서 메인 프로젝트와 Pod에 관련한 target  프로젝트에도 모두 No 로 설정해줘야 합니다. 
4. 클린 그리고 빌드힙니다. 


Posted by 예배하는 프로그래머

CocoaPods 설치정 및 시행착오

터미널에서 시스템 사용자 권한으로 아래의 명령을 실행하면 설치 완료.


$ sudo gem install cocoapods

$ pod setup

위 2줄 처리완료되면 아래는 그냥 넘어감———— 

설치가 안된다면 gem 업데이트.


$ gem update --system


마운틴 라이언에서 gcc경로 때문에 설치가 안되는 경우가 발생할 있음.

그때는 심볼릭 링크를 만들어서 해결


$ sudo -ln s /usr/bin/gcc /usr/bin/gcc-4.2




프로젝트 디렉토리에 Podfile 생성. (프로젝트 디렉토리는 . xcodeproj 파일이 포함된 디렉토리를 의미한다.)


$ touch Podfile

$ open Podfile

Podfile 아래와 같은 양식으로 프로젝트를 설정한다.


platform :ios, '7.1'

pod 'AFNetworking', '~> 2.4'

pod 'JSONKit',       '~> 1.4'

pod 'Reachability',  '~> 3.0.0'


Podfile 저장하고 Pod 설치.


$ pod install

 Analyzing dependencies

Downloading dependencies

Installing AFNetworking (2.5.0)

Installing PKRevealController (2.0.6)

Generating Pods project

Integrating client project

설치가 완료되면 Pods 폴더와 .xcworkspace 파일이 생성된다.

.xcworkspace 파일을 열어서 확인해 보면 자신의 프로젝트와 추가한 라이브러리들이 의존성 연결 되어 있음을 있다.

Podfile 편집만으로 쉽게 라이브러리들을 관리하고 사용할 있게 되었다.

만약 열려 있던 Test.xcodeproj 프로젝트는 닫고 

Test.xcworkspace 를 다시 오픈한다. 

$ Open test.xcworkspace


기타 ———————————————

Pod 사용할 있는 프로젝트 찾기


$ pod search JSONKit


Pod 전체 리스트


$ pod list


[!] From now on use `test.xcworkspace`.

$ open test.xcworkspace

pod install 완료되고 나면, Pods 라는 디렉토리가 생성되고, 지정했던 프로젝트들이 다운로드 되어 있는걸 있습니다.

저의 경우에는 AFNetworking, PKRevealController 추가 했기때문에 프로젝트 구조가 아래와 같이 되었습니다.

cocoapods 리스트


인스톨 시 오류사항 해결 ————————————————————————

pod install

/Library/Ruby/Gems/2.0.0/gems/cocoapods-0.35.0/lib/cocoapods/user_interface/error_report.rb:13:in `report': incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)

위의 오류는 외국, 국내 의 블로그를 카피하여 붙여 넣으면서 캐릭터 코드가 안 맞아서 벌여지는 현상이다. 예를 들어 아래의 글을 복사해서 넣었다면

platform :ios, ‘7.0’

pod 'AFNetworking', '~> 2.1.0'

pod 'PKRevealController', '~> 2.0.6'

아래의 글로 다시 복사해서 붙여 넣으면 된다. 폰트가 작아 잘 눈엔 띄이진 않지만 확대를 해보면.,,,

platform :ios, '7.1'

pod 'AFNetworking', '~> 2.4'



platform :ios, ‘7.0’

platform :ios, '7.1'

세미콜론의 차이를 확인할 수 있다. ^^

Posted by 예배하는 프로그래머

Undefined symbols for architecture x86_64:

  "_OBJC_CLASS_$_GAI", referenced from:

      objc-class-ref in HackersAppDelegate.o

  "_OBJC_CLASS_$_GAITrackedViewController", referenced from:

      _OBJC_CLASS_$_CmUIViewController in CmUIViewController.o

  "_OBJC_CLASS_$_KalViewController", referenced from:

      objc-class-ref in LearnPlan.o

  "_OBJC_METACLASS_$_GAITrackedViewController", referenced from:

      _OBJC_METACLASS_$_CmUIViewController in CmUIViewController.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

위의 경고 또는 메세지는 libGoogleAnalytics.a, missing required architecture x86_64

You're not doing anything wrong. I'm pretty sure google has not yet provided a arm64 version of their libGoogleAnalyticsServices.a, which is really annoying ...it has been weeks since the public the release of Xcode 5GM.

xcode  - architecture base


Standard architectures (armv7, arm64)

를 아래와 같이 설정해주면 되네요.

armv7, armv7s

Posted by 예배하는 프로그래머

아이폰6을 구매했습니다. 중고폰으로 구매를 하려 하다가 SKT 의 조건을 따져 보니 괜찮겠다 생각이 들었지요

중고로 사서 유심을 끼어 사용하려 했는데 찬한가족할인_4회선이란 좋은 조건이 있어 당장 가입하였습니다. 

착한 가족 할인 으로 인해 매달 5,500원을 할인 받게 되었습니다. <-- 11월 14일까지입니다. 

그래서 총 5만 7천원 정도이네요.

와이프님이 게임을 잘 안하셔서 아이폰 16기가 골드입니다. 

유심은 기존 아이폰4s 을 잘라 나노 유심으로 만들어 사용하였습니다. 두번 껏다키니까 잘되네요.

마이크로 유심을 나노 유심으로 바꾸도록


 파일도 함께 첨부해 드립니다. 

프린트 하셔서 아래 그림처럼 테잎으로 붙여서 자르고 가위로도 잘라 보세요. ^^(7000원 아낌)

기존 아이폰4s의 설정 -  icloud 계정 로그인 - 백업을 눌러 저장합니다. 

아이폰6 실행시 아이폰4S의 계정 그대로 로그인 하면 내가 기존의 사용하였던 그 정보 그대로 (전화, 메세지, 앱 설치, 노트, 메모 심지어 카톡 리스트 까지) 받아 올 수 있습니다. 

Posted by 예배하는 프로그래머

아이폰 인앱 개발에 있어 아래와 같이 테스트폰 또는 시뮬레이터로 테스트 할때 나오는 메세지입니다. 

테스트를 할 수 있도록 하기 위해서는

1. A 계정(스토어 판매 계정) 을 아이튠즈에서 로그아웃한다. 

2. B 계정(아이듄즈 커넥터에서 테스트 계정)을 만듭니다. 

3. B 계정에는 신용카드 정보, 아이튠즈 스토어 로그아웃 유지합니다.

위의 3가지를 해결하면 결제 테스트를 할수 있습니다. 

참고 링크 : http://iphonedevsdk.com/forum/iphone-sdk-development/63008-app-purchase-test-account-verification-required-cant-get-passed.html

Posted by 예배하는 프로그래머

1단계 해당 파일 다운로드

2단계 (첨부파일 + unlock 만들기)
./fastboot oem unlock

ADB install 파일준비
Fastboot system-wide 파일 준비

3. Volume Down + Power button

fastboot 모드로 진입

4. Flashing the image

2단계 압축푼 해당 디렉토리에 가서

fastboot devices - 기기를 인식하는지 유무를 확인할 수 있다.

설치 방법은 아래와 같습니다.



5. Re-locing the bootloader
./fastboot oem lock

Posted by 예배하는 프로그래머