Tuesday, February 23, 2016

[iOS] Top exception fixed by specifying -ObjC in your "Other Linker Flags"

failed: caught "NSInvalidArgumentException", "-[NSInvocation mkt_retainArgumentsWithWeakTarget]: unrecognized selector sent to instance 0x7fc2f1a93080"
(
0   CoreFoundation                      0x0000000105818e65 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x0000000104dc9deb objc_exception_throw + 48
2   CoreFoundation                      0x000000010582148d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3   CoreFoundation                      0x000000010576e90a ___forwarding___ + 970
4   CoreFoundation                      0x000000010576e4b8 _CF_forwarding_prep_0 + 120
5   beaconatorTests                     0x000000011825ac70 -[MKTInvocationContainer setInvocationForPotentialStubbing:] + 59

6   beaconatorTests                     0x000000011825dc8c -[MKTBaseMockObjec

Wednesday, February 17, 2016

[iOS] Cocoapods Warning - CocoaPods did not set the base configuration of your project because because your project already has a custom config set

When I duplicate an existing application from project target in Xcode and which needs to have a different dependence, so I add a new target in Podfile for it. Then I got the cocoapods warning as the below:
[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `Sample-Prod` to `Pods/Target Support Files/Pods-Sample-Prod/Pods-Sample-Prod.development.xcconfig` or include the `Pods/Target Support Files/Pods-Sample-Prod/Pods-Sample-Prod.development.xcconfig` in your build configuration.

[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `Sample-Prod` to `Pods/Target Support Files/Pods-Sample-Prod/Pods-Sample-Prod.testing.xcconfig` or include the `Pods/Target Support Files/Pods-Sample-Prod/Pods-Sample-Prod.testing.xcconfig` in your build configuration.

[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `Sample-Prod` to `Pods/Target Support Files/Pods-Sample-Prod/Pods-Sample-Prod.production.xcconfig` or include the `Pods/Target Support Files/Pods-Sample-Prod/Pods-Sample-Prod.production.xcconfig` in your build configuration.

[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `Sample-Prod` to `Pods/Target Support Files/Pods-Sample-Prod/Pods-Sample-Prod.staging.xcconfig` or include the `Pods/Target Support Files/Pods-Sample-Prod/Pods-Sample-Prod.staging.xcconfig` in your build configuration.

What you need to do is to go to project base configuration to change the configuration file setting to None for the two Pods-related targets, then run pod install again.

Tuesday, February 16, 2016

[iOS] Instruments Great Features


  1. Automate UI Testing in iOS

[iOS]Cocoapods Packager: publish pods framework from a library

When you created iOS/Mac OS library project as well as the sample app to use the library, one day you want to make the library as a framework:


  1. Install Cocoapods by $ sudo gem install cocoapods
  2. Install Cocoapods packager by $ sudo gem install cocoapods-packager
  3. Create you framework class to include all the public header files
  4. Public the header files by adding them to target library > Build Phases > Copy Files, you have to import those files in the library project like  #import <FRAMEWORK_NAME/CLASS_NAME.h> instead of #import "CLASS_NAME.h", otherwise you would get a lot of duplicated constants and classes.
  5. Make you .podspec file
    Pod::Spec.new do |s|
      s.name     = 'FRAMEWORK_NAME'
      s.version  = '0.0.1'
      s.license  = 'MIT'
      s.summary  = 'name'
      s.homepage = 'https://github.com'
      s.authors  = { 'Phunware' => 'info@company.com' }
      s.source   = { :git => 'https://github.com/**.git', :branch => 'BB'  }
      s.requires_arc = true
      s.dependency 'PODS_NAME'
      s.default_subspec = 'Production'
    
      s.ios.deployment_target = '8.0'
    
      s.public_header_files = 
      'FRAMEWORK_NAME/**/PUBLIC_CLASS.h',
      'FRAMEWORK_NAME/**/PUBLIC_CLASS.h'
    
      s.source_files  = 'FRAMEWORK_NAME/**/*.{h,m}'
      s.xcconfig      = { 'FRAMEWORK_SEARCH_PATHS' => '"$(PODS_ROOT)/PWCore/**"',
      'ENABLE_BITCODE' => 'YES' }
    
      s.subspec 'Production' do |prod|
        prod.public_header_files = 
      'FRAMEWORK_NAME/**/PUBLIC_CLASS.h',
      'FRAMEWORK_NAME/**/PUBLIC_CLASS.h'
    
        prod.source_files  = 'FRAMEWORK_NAME/**/*.{h,m}'
        prod.prefix_header_contents = <<-eos data-blogger-escaped-__objc__="" data-blogger-escaped-configuration_production="" data-blogger-escaped-define="" data-blogger-escaped-end="" data-blogger-escaped-endif="" data-blogger-escaped-eos="" data-blogger-escaped-foundation="" data-blogger-escaped-ifdef="" data-blogger-escaped-import="" data-blogger-escaped-pre="" data-blogger-escaped-uikit="">
  6. Then you can make the framework locally by $ pod package FRAMEWORK_NAME.podspec --subspecs=Production --spec-sources=PRIVATE_SPECS --verbose
  7. Valid your framework before publishing by $ pod spec lint FRAMEWORK_NAME.podspec --sources= PRIVATE_SPECS --use-libraries --verbose --allow-warnings
  8. Publish you framework to cocoapods repo $ pod trunk push FRAMEWORK_NAME.podpec

Note: When do package locally you may meet issues, just upgrade the cocoapads to latest version. Like upgrade ruby to the version you want by $ rvm upgrade current_version version_you_wanted

Wednesday, May 6, 2015

[iOS]Generice Xcode Archive vs iOS App Archive

The type of Generice Xcode Archive can't be submit to Apple store or Crashlytics, but you directly debug running on device and simulator, it's in the Other Items rather than iOS Apps in Archives(Xcode > Window > Organizer) window.

Check the settings below when this happened:

  1. Skip install is NO for the main project target
  2. Skip install is YES for framework (sub-projects) targets
  3. In Build Phases for sub-projects, Copy Headers needs to be in Project, not Public (does not apply if building static library)
  4. Installation Directory under Deployment is valid (/Applications for example)

NOTE: since Xcode 7, the solution above doesn't work, what you have to do is to remove all the reference library sources from app target > Build Phases > Target Dependencies & Linked Binary with Libraries

Thursday, April 30, 2015

[iOS]Appledoc Shell Script Example

It's very easy to generate objc documentation for you with AppleDoc, here are the steps to setup in Xcode:

  1. Select you project name
  2. Try add add a target, and in the popped window select iOS > Other > Aggregate to create target named PROJECTDocs
  3. Then select new added target, to add "New Run Script Shell" to add the script like the below:
    export HOMEDIR=`pwd`
    echo "Generating AppleDocs!"
    echo "Current directory is $HOMEDIR"
    
    /usr/local/bin/appledoc \
    --project-name "$PROJECT_NAME" \
    --project-company "Company, Inc." \
    --company-id "com.company" \
    --output "${HOMEDIR}/build_products/" \
    --logformat xcode \
    --keep-undocumented-objects \
    --keep-undocumented-members \
    --keep-intermediate-files \
    --no-repeat-first-par \
    --no-warn-invalid-crossref \
    --ignore "*.m" \
    --ignore "*Private.h" \
    "$SOURCE_ROOT/$PROJECT_NAME"

Thursday, November 6, 2014

[iOS]Cocoapods: manage library dependencies for your Xcode projects

CocoaPods manages library dependencies for your Xcode projects

1. $ sudo gem install cocoapods
It requires your ruby is >= v1.9.x, if it isn't, you need to upgrade as the following steps:
 1.1. Suggest to install rvm (Ruby Version Manager) with the following command line:
$ curl -L https://get.rvm.io | bash -s stable --ruby
1.2. Check available version
$ rvm list known
1.3. Select one to install
$ rvm install ruby-2.1.1

2. $ sudo gem install cocoapods again if update needed.

3. Go to you project directory to do the following command
 I suppose there's been a Podfile there:
$ pod intall
it will automatically generate the *.xworkspace project and Pods project for your project.

Reference URL: http://guides.cocoapods.org/using/getting-started.html