iOS project bootstrap aimed at high quality coding.

Overview

Version License Platform

iOS Project bootstrap

How do you setup your iOS projects?

Since we are approaching 2015 I’m working on refreshing my project bootstrap. I’ve decided to open source it so other can benefit or contribute.

I think it’s pretty neat but decide for yourself.

It’s still WIP so pull requests are most welcomed.

Basic setup and configuration

A project by default has 3 configurations:

  1. Debug
  2. Release
  3. Adhoc

Each configuration can be put side by side on same device, and you can clearly distinguish each build. Easier to find issues across different versions and branches.

Looking at each of the icon you get following informations:

  • Build number: 29
  • Branch: Master
  • Commit hash
  • Version: 1.0
  • Configuration that the app was built with

You can also use KZBootstrap API to query those informations while running your application.

Code Quality and Warnings

Warnings were added by compiler team for a reason, as such I start with Weverything and disable few warnings:

  • Wno-objc-missing-property-synthesis - don’t want to do @synthesize on properties
  • Wno-unused-macros - annoying when doing DSL
  • Wno-disabled-macro-expansion - needed for DSL/Metaprogramming
  • Wno-gnu-statement-expression - helpful
  • Wno-language-extension-token - language extensions are useful
  • Wno-overriding-method-mismatch - so I can change id to specific type and avoid unnecesary local variables

Also treat warnings as errors is a must.

That’s not all, let’s add some scripts:

  • turn all todo/fixme into warnings
  • warnings when files get too big
    • add KZBIgnoreLineCount anywhere in file to disable warning generation for that file.
  • Automatically generate macro for current developer, that way a team can have different code paths while they are working on features, or different logging levels. Without git changes.
	#if merowing
	//! my code
	#endif 

One more thing, let’s add some macros: To prevent nil passed in as arguments:

  • KZB_REQUIRE_ALL_PARAMS
  • KZB_REQUIRE_PARAMS(1,2)

When your subclasses should call super:

  • KZB_REQUIRE_SUPER

When you want to avoid spelling errors:

  • KZB_KEYPATH
  • KZB_KEYPATH_T

Environments

Often when working with big clients, you need to have multiple environments for Staging / Production / QA etc. They usually differ in some kind of configuration, eg. different URL endpoints.

Too many times I’ve seen people creating separate targets for each of them, which leads to maintenance costs and unnecessary bloat/clutter.

As such I’ve created a different approach, with some nice automation:

  • Default environments can be changed either via xcodebuild user variable (on Jenkins) or via launch argument inside your schema.
    • on jenkins, xcodebuild … KZBEnv=@”Production” build
    • in custom Schema: Edit Scheme->Arguments->Launch Arguments-> “-KZBEnvOverride Production”
  • Environments can be changed without reinstalling application, even while it’s running.
  • All environments variables are created in a single plist
    • If any of the variables are missing an entry for one of the environments you get compile time error. You can even click on it to go to the configuration file.
    • Settings bundle will be automatically injected to give you environment switching.
    • You can register for callback when env changes, useful if you need to reset your database etc.
    • Production builds will remove all variables for other environments to prevent exposing non-production and unused configurations.

Logging - Optional

If you are using CocoaLumberjack you can include KZBootstrap/Logging subspec to get log formatting that works as clickable links in AppCode.

Debugging - Optional

If you decide to include KZBootstrap/Debug subspec, you will get:

  • assertions when UIKit is layouted/displayed on background thread, so you can fix your code.
  • API interception capabilities for AFNetworking, which you can either display yourself (or send me PR with universal UI). Or just look at during debuging by calling
[KZBResponseTracker printAll]

Installing KZBootstrap

KZBootstrap is available through CocoaPods. To install it, simply add the following line to your Podfile:

  • KZBootstrap - for core functionality
  • KZBootstrap/Logging - additional logging functionality
  • KZBootstrap/Debug - additional debugging functionality

There are few things you need to do with your project, you can either use my crafter setup tool to make it automatic or do it manually:

  • KZBEnvironments.plist with KZBEnvironments key containing array of all environments. All extra keys are treated as env variables and should have a value for each of the allowed env’s.
  • BUNDLE_DISPLAY_NAME_SUFFIX _and BUNDLE_ID_SUFFIX should be added to User-Defined settings
    • In your target .plist file append both display name and bundle identifier keys with those variables eg. app${BUNDLE_DISPLAY_NAME_SUFFIX}
  • Add KZBEnv user-defined setting with value of default env for each configuration then in preprocessor macros add KZBDefaultEnv=${KZBEnv}
  • Add empty file named KZBootstrapUserMacros.h anywhere in your project, and include it into your *prefix.pch file. Include that file in your .gitignore.
  • Set warnings as described above.
  • You should have Settings.bundle in the project so the code can inject it with environment switching functionality.
  • Add script execution at the end of your Build Phases "${SRCROOT}/Pods/KZBootstrap/Pod/Assets/Scripts/bootstrap.sh" You can selectively enable features by passing arguments to bootstrap.sh
    • -l will enable line-count warnings
    • -t will enable TODO warnings
    • -u will enable user macros
    • -n will enable build-number automation
    • -i will enable icon versioning. (This also enables build-number automation.)

Base crafter setup might look like this, replace CUSTOM with your preferred steps:

# All your configuration should happen inside configure block
Crafter.configure do

  # This are projects wide instructions
  add_platform({:platform => :ios, :deployment => 7.0})
  add_git_ignore
  duplicate_configurations({:adhoc => :release})

  # set of options, warnings, static analyser and anything else normal xcode treats as build options
  set_options %w(
    RUN_CLANG_STATIC_ANALYZER
    GCC_TREAT_WARNINGS_AS_ERRORS
  )

  set_build_settings({
    :'WARNING_CFLAGS' => %w(
    -Weverything
    -Wno-objc-missing-property-synthesis
    -Wno-unused-macros
    -Wno-disabled-macro-expansion
    -Wno-gnu-statement-expression
    -Wno-language-extension-token
    -Wno-overriding-method-mismatch
    ).join(" ")
  })

  set_build_settings({
    :'BUNDLE_ID_SUFFIX' => '.dev',
    :'BUNDLE_DISPLAY_NAME_SUFFIX' => 'dev',
    :'KZBEnv' => 'QA'
  }, configuration: :debug)

  set_build_settings({
    :'BUNDLE_ID_SUFFIX' => '.adhoc',
    :'BUNDLE_DISPLAY_NAME_SUFFIX' => 'adhoc',
    :'KZBEnv' => 'QA'
  }, configuration: :adhoc)

  set_build_settings({
    :'BUNDLE_ID_SUFFIX' => '',
    :'BUNDLE_DISPLAY_NAME_SUFFIX' => '',
    :'KZBEnv' => 'PRODUCTION'
  }, configuration: :release)
  
  # CUSTOM: Modify plist file to include suffix and displayname
  # CUSTOM: Add empty KZBootstrapUserMacros.h file to your project and .gitignore
  # CUSTOM: Add KZBEnvironments.plist with list of your environments under KZBEnvironments key

  # target specific options, :default is just a name for you, feel free to call it whatever you like
  with :default do

    # each target have set of pods
    pods << %w(KZAsserts KZBootstrap KZBootstrap/Logging KZBootstrap/Debug)
    
    # add build script for bootstrap
    scripts << {:name => 'KZBootstrap setup', :script => '"${SRCROOT}/Pods/KZBootstrap/Pod/Assets/Scripts/bootstrap.sh"'}

  end
end

In you want to support dynamic env switching app delegate you can add something like this:

 NSLog(@"user variable = %@, launch argument %@", @"d", [[NSUserDefaults standardUserDefaults] objectForKey:@"KZBEnvOverride"]);
  KZBootstrap.defaultBuildEnvironment = KZBEnv;
  KZBootstrap.onCurrentEnvironmentChanged = ^(NSString *newEnv, NSString *oldEnv) {
    NSLog(@"Changing env from %@ to %@", oldEnv, newEnv);
  };
  [KZBootstrap ready];
  
  NSLog(@"KZBootstrap:\n\tshortVersion: %@\n\tbranch: %@\n\tbuildNumber: %@\n\tenvironment: %@", KZBootstrap.shortVersionString, KZBootstrap.gitBranch, @(KZBootstrap.buildNumber), KZBootstrap.currentEnvironment);

License

KZBootstrap is available under the MIT license. See the LICENSE file for more info.

Author

Krzysztof Zablocki, [email protected]

My blog

Follow me on twitter.

Attributions

All of this wouldn’t be possible if we didn’t have such a great community, based on my own previous work but also countless others. Tried to reference everything but if you think I missed something please let me know.

References:

http://stackoverflow.com/questions/10497552/how-to-configure-independent-sets-of-runtime-settings-in-xcode

https://github.com/crushlovely/Amaro

https://github.com/crushlovely/Sidecar

http://swwritings.com/post/2013-05-20-concurrent-debug-beta-app-store-builds

https://gist.github.com/dulaccc/a52154ac4c007db2be55

https://gist.github.com/steipete/5664345

http://blog.manbolo.com/2013/05/17/passing-user-variable-to-xcodebuild

http://blog.jaredsinclair.com/post/97193356620/the-best-of-all-possible-xcode-automated-build

https://github.com/krzysztofzablocki/crafter

https://github.com/krzysztofzablocki/IconOverlaying

Big thanks goes to Lextech Global Services for supporting my community work, they are awesome. If you need a mobile app for your enterprise, you should talk to them.

Comments
  • Extract icon versioning

    Extract icon versioning

    I'm referring to the first screenshot from the README which adds information to the app's icon.

    Upon running the example project, the app has no icon, hence no git information:

    ios simulator screen shot 9 sep 2015 15 43 16

    Also, is it possible to extract only this feature and use it in an existing big project? I tried doing so to no avail. I don't know what the bootstrap.sh is doing at all; how can I debug it?

    opened by revolter 8
  • Rethink naming

    Rethink naming

    Just a little hint to think about: using "KZ" as a Prefix maybe not the smartest thing. And topping that a "SS" for the subspec in the Podspec makes it even worse.

    You should think of changing that.

    opened by bitboxer 6
  • Using iconVersioning.sh standalone

    Using iconVersioning.sh standalone

    I'm trying to use the iconVersioning script standalone in my project. It works, but I need to delete the derived data folder for the icon to update after it has been changed by the script the first time. However, when I look inside the derived data folder, the icons are correctly updated there.

    Any ideas how I can make the script work standalone? Are there any thing from the other scripts that needs to be included?

    opened by schjonhaug 5
  • UILabel fade out after launch.

    UILabel fade out after launch.

    After Integrated KZBootstrap in my own project. all text in the label disappeared. I've also tried add a label in the example project. The UILabel fade out after launch.

    see https://www.youtube.com/watch?v=ktFVhwdxuqk

    start from 10s

    opened by caoer 5
  • Swift 2.0 compatibility

    Swift 2.0 compatibility

    Hello! I have a swift 2.0 branch that updates processEnvironment. https://github.com/lumenlunae/KZBootstrap

    If you want to create a branch for swift 2.0, I can make a pull request. Thanks for this project!

    opened by lumenlunae 4
  • Can run archive on example project

    Can run archive on example project

    after fix the obvious KZEnv not defined issue. run into this: fatal error: unexpectedly found nil while unwrapping an Optional value looks like "${bundled_plist}" "${src_plist}" "${bundled_settings}" is not being set?

    /usr/local/bin/convert
    Updated /Users/awesomeuser/Library/Developer/Xcode/DerivedData/KZBootstrap-aycmzgmweixqafdkazvxmtdcqjzb/Build/Intermediates/ArchiveIntermediates/KZBootstrap/InstallationBuildProductsLocation/Applications/KZBootstrap.app/Info.plist
    1.0 (48)\nmaster->\naa5deb5
    Print: Entry, "CFBundleIcons:CFBundlePrimaryIcon:CFBundleIconFiles", Does Not Exist
    base path /Users/awesomeuser/Library/Developer/Xcode/DerivedData/KZBootstrap-aycmzgmweixqafdkazvxmtdcqjzb/Build/Intermediates/ArchiveIntermediates/KZBootstrap/BuildProductsPath/Release-iphoneos/KZBootstrap.app/
    base path /Users/awesomeuser/Library/Developer/Xcode/DerivedData/KZBootstrap-aycmzgmweixqafdkazvxmtdcqjzb/Build/Intermediates/ArchiveIntermediates/KZBootstrap/BuildProductsPath/Release-iphoneos/KZBootstrap.app/
    base path /Users/awesomeuser/Library/Developer/Xcode/DerivedData/KZBootstrap-aycmzgmweixqafdkazvxmtdcqjzb/Build/Intermediates/ArchiveIntermediates/KZBootstrap/BuildProductsPath/Release-iphoneos/KZBootstrap.app/AppIcon76x76~ipad.png
    cp: /Users/awesomeuser/Library/Developer/Xcode/DerivedData/KZBootstrap-aycmzgmweixqafdkazvxmtdcqjzb/Build/Intermediates/ArchiveIntermediates/KZBootstrap/BuildProductsPath/Release-iphoneos/KZBootstrap.app/AppIcon76x76~ipad.png and ./AppIcon76x76~ipad.png are identical (not copied).
    base path /Users/awesomeuser/Library/Developer/Xcode/DerivedData/KZBootstrap-aycmzgmweixqafdkazvxmtdcqjzb/Build/Intermediates/ArchiveIntermediates/KZBootstrap/BuildProductsPath/Release-iphoneos/KZBootstrap.app/AppIcon76x76@2x~ipad.png
    cp: /Users/awesomeuser/Library/Developer/Xcode/DerivedData/KZBootstrap-aycmzgmweixqafdkazvxmtdcqjzb/Build/Intermediates/ArchiveIntermediates/KZBootstrap/BuildProductsPath/Release-iphoneos/KZBootstrap.app/AppIcon76x76@2x~ipad.png and ./AppIcon76x76@2x~ipad.png are identical (not copied).
    /Users/awesomeuser/Documents/Projects/OpenSourceProjects/KZBootstrap/Example/KZBootstrap/KZBViewController.m:1: warning: File /Users/awesomeuser/Documents/Projects/OpenSourceProjects/KZBootstrap/Example/KZBootstrap/KZBViewController.m has more than 250 lines ( 265 ), consider refactoring or add KZBIgnoreLineCount.
    /Users/awesomeuser/Documents/Projects/OpenSourceProjects/KZBootstrap/Example/KZBootstrap/main.m:9: warning: TODO: example
    fatal error: unexpectedly found nil while unwrapping an Optional value
    0  swift                    0x00000001036cfa68 llvm::sys::PrintStackTrace(__sFILE*) + 40
    1  swift                    0x00000001036cff54 SignalHandler(int) + 452
    2  libsystem_platform.dylib 0x00007fff9527d5aa _sigtramp + 26
    3  libsystem_platform.dylib 000000000000000000 _sigtramp + 1792551536
    4  libsystem_platform.dylib 0x00000001077803df _sigtramp + 1917857359
    5  libsystem_platform.dylib 0x000000010777f678 _sigtramp + 1917853928
    6  swift                    0x0000000102d44a79 llvm::JIT::runFunction(llvm::Function*, std::__1::vector<llvm::GenericValue, std::__1::allocator<llvm::GenericValue> > const&) + 329
    7  swift                    0x0000000102ff0fb3 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, char const* const*) + 1523
    8  swift                    0x0000000102c2d51a swift::RunImmediately(swift::CompilerInstance&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, swift::IRGenOptions&, swift::SILOptions const&) + 1066
    9  swift                    0x0000000102a1654b frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 5275
    10 swift                    0x0000000102a1396d main + 1677
    11 libdyld.dylib            0x00007fff909eb5fd start + 1
    12 libdyld.dylib            0x0000000000000011 start + 1868646933
    Stack dump:
    0.  Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret /Users/awesomeuser/Documents/Projects/OpenSourceProjects/KZBootstrap/Example/../Pod/Assets/Scripts/processEnvironments.swift -target x86_64-apple-darwin13.4.0 -target-cpu core2 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -module-name processEnvironments --  /Users/awesomeuser/Documents/Projects/OpenSourceProjects/KZBootstrap/Example/KZBootstrap/KZBEnvironments.plist  PRODUCTION 
    /Users/awesomeuser/Documents/Projects/OpenSourceProjects/KZBootstrap/Example/../Pod/Assets/Scripts/bootstrap.sh: line 18: 76427 Illegal instruction: 4  env -i xcrun -sdk macosx swift ${DIR}/processEnvironments.swift "${bundled_plist}" "${src_plist}" "${bundled_settings}" "PRODUCTION"
    
    opened by caoer 4
  • Icon versioning over complicated and not working

    Icon versioning over complicated and not working

    I don't understand why the icon versioning script is so complicated and how do you guys use it when it's not working.

    Firstly, why does it search certain files with some (iPad) exception instead of finding all the AppIcon*.png files?

    Secondly, it's not working on iPad, at all! There is the comment:

    # Workaround to fix issue#16 to use wildcard * to actually find the file
    

    which points to #16 which isn't related to this at all. And the find fails with find: AppIcon72x72~ipad.png: unknown primary or operator error, so the icon is not versioned on iPad. Changing those lines to:

    processIcon "AppIcon72x72~ipad.png"
    processIcon "AppIcon72x72@2x~ipad.png"
    processIcon "AppIcon76x76~ipad.png"
    processIcon "AppIcon76x76@2x~ipad.png"
    

    fixes it.

    opened by revolter 3
  •  unwrapping an Optional value

    unwrapping an Optional value

    Hi, this error has confused me for along time

    fatal error: unexpectedly found nil while unwrapping an Optional value 0 swift 0x0000000109dc3fbb llvm::sys::PrintStackTrace(_sFILE) + 43 1 swift 0x0000000109dc46fb SignalHandler(int) + 379 2 libsystem_platform.dylib 0x00007fff8f3e4eaa _sigtramp + 26 3 libsystem_platform.dylib 0x00007fff6f181568 _sigtramp + 3755591384 4 libsystem_platform.dylib 0x000000010c579a23 _sigtramp + 2098809747 5 libsystem_platform.dylib 0x000000010c57660f sigtramp + 2098796415 6 swift 0x00000001083329bf llvm::MCJIT::runFunction(llvm::Function, std::__1::vector<llvm::GenericValue, std::_1::allocatorllvm::GenericValue > const&) + 271 7 swift 0x00000001083350f6 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits, std::1::allocator > > > const&, char const const) + 1190 8 swift 0x00000001081c6d8c swift::RunImmediately(swift::CompilerInstance&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits, std::1::allocator > > > const&, swift::IRGenOptions&, swift::SILOptions const&) + 2188 9 swift 0x0000000107eb5151 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef, int&) + 13425 10 swift 0x0000000107eb1ad3 frontend_main(llvm::ArrayRef<char const*>, char const, void) + 2691 11 swift 0x0000000107eae154 main + 2324 12 libdyld.dylib 0x00007fff9432c5ad start + 1 13 libdyld.dylib 0x000000000000000f start + 1808611939 Stack dump: 0. Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret /Volumes/OXT/Project/Hime/Pods/KZBootstrap/Pod/Assets/Scripts/processEnvironments.swift -target x86_64-apple-darwin15.3.0 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -module-name processEnvironments --
    /Volumes/OXT/Project/Hime/Pods/KZBootstrap/Pod/Assets/Scripts/bootstrap.sh: line 74: 13157 Illegal instruction: 4 env -i xcrun -sdk macosx swift "${DIR}/processEnvironments.swift" "${bundled_plist}" "${src_plist}" "${bundled_settings}"

    opened by oit63 2
  • Are you thinking about Swift support?

    Are you thinking about Swift support?

    Came across this project thanks to your work on the IconOverlay. This seems like a great utility! I'll definitely be using a lot of ideas for our next project.

    Are you considering updating this for Swift projects as well?

    opened by SpacyRicochet 2
  • Compilation errors in XCTest

    Compilation errors in XCTest

    I want to add KZBootstap to my simple project. I've installed crafter, set base crafter setup like in KZBootstap, but when I try to compile I've got errors in XCTest.framework:

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework/Headers/XCAbstractTest.h:32:1: Treating #import as an import of module 'Foundation'

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework/Headers/XCTestCase.h:68:5: Unknown command tag name

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework/Headers/XCTestCase.h:75:5: Unknown command tag name

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework/Headers/XCTestCase.h:77:5: Unknown command tag name

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework/Headers/XCTestSuite.h:41:51: Unknown command tag name

    /Users/bazyl/Projects/:1:1: Header '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework/module.map' is included in module 'XCTest' but not listed in module map

    /Users/bazyl/Projects/:1:1: Header '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/include/module.map' is included in module 'XCTest' but not listed in module map

    opened by MaciejGad 2
  • In Test Target, with -Weverything, get warning/error:

    In Test Target, with -Weverything, get warning/error: "Treating #import as an import of module 'Foundation' in XCAbstractTest.h"

    I've found that when I include a test target with KZBootstrap, The test target fails to compile, because many of the XCTest classes (like XCAbstractTest) are using #import instead of the module import (@). These are warnings from the compiler, but with "Treat Warnings As Errors" turned on, they stop the compilation. I can't figure out which warning flag I'd need to disable.

    I notice that when I remove -Weverything from the test target's warning flags setting, the warnings disappear. I can even use -Wall and -Wextra, and everything builds nicely. Does anyone know if there is a specific warning flag I could turn off to stop the compiler from worrying about this? I've looked for it, but I can't figure out which one it might be. Where might I look?

    OR; have I messed something up in the Podfile? I've seen this in two separate projects when trying to get KZBootstrap set up, but it could be something in MY configuration that's causing problems.

    screen shot 2014-11-26 at 3 28 24 pm

    opened by churowa 2
  • Update for Swift Version

    Update for Swift Version

    this repo is awesome! Is this project still maintain? And will it support Swift3.2/4+ and Xcode 10+ ? and will the /Logger, /Debugger still work for xcode10+ ?

    opened by takeTrace 0
  • Missing Values for Environment Variables Errors

    Missing Values for Environment Variables Errors

    When I archive I get numerous errors stating that my production environment is missing values, 1 for each environment variable. This has no effect on my build (all the environment variables work) and I don't see the error at all when building for debug. The issue is, this crashes Xcode Build and by extension my continuous integration build automation process.

    /Users/altyus/Development/MakeSpace/iOS/MakeSpaceConsumerApp/MakeSpace/support/KZBEnvironments.plist:1: missing value of variable googleAnalyticsTrackingId for env @\"PRODUCTION\" available values {
        DEVELOPMENT = "xxxxxxxxxxxxx";
        LOCALHOST = "xxxxxxxxxxxxx";
        PRODUCTION = "xxxxxxxxxxxxx";
        STAGING = "xxxxxxxxxxxxx";
    }
    /Users/altyus/Development/MakeSpace/iOS/MakeSpaceConsumerApp/DerivedData/MakeSpace/Build/Intermediates/ArchiveIntermediates/MakeSpace/InstallationBuildProductsLocation/Applications/MakeSpace.app/KZBEnvironments.plist
    /Users/altyus/Development/MakeSpace/iOS/MakeSpaceConsumerApp/DerivedData/MakeSpace/Build/Products/Debug-iphoneos/MakeSpace.app/KZBEnvironments.plist
    /Users/altyus/Development/MakeSpace/iOS/MakeSpaceConsumerApp/DerivedData/MakeSpace/Build/Products/Debug-iphonesimulator/MakeSpace.app/KZBEnvironments.plist
    /Users/altyus/Development/MakeSpace/iOS/MakeSpaceConsumerApp/MakeSpace/support/KZBEnvironments.plist:1: missing value of variable webBaseURLString for env @\"PRODUCTION\" available values {
        DEVELOPMENT = "https://xxxxxxxxxxxxx.com";
        LOCALHOST = "https://xxxxxxxxxxxxx.com";
        PRODUCTION = "https://xxxxxxxxxxxxx.com";
        STAGING = "https://xxxxxxxxxxxxx.com";
    }
    
    Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure
    
    opened by altyus 4
Releases(1.0.0)
Owner
Krzysztof Zabłocki
Dev, Speaker, Creator. Currently Lead iOS @NYTimes My code powers up more than 70 000 apps.
Krzysztof Zabłocki
decoupling between modules in your iOS Project. iOS模块化过程中模块间解耦方案

DecouplingKit 中文readme Podfile platform :ios, '7.0' pod 'DecouplingKit', '~> 0.0.2' DecouplingKit, decoupling between modules in your iOS Project. D

coderyi 139 Aug 23, 2022
The project used in the iOS Architect Crash Course lectures

iOS Architect Crash Course • August 2nd-8th • EssentialDeveloper.com https://www.essentialdeveloper.com/ios-architect-crash-course/aug-2021-a5220 It's

Aleksei Korolev 1 Jul 20, 2022
An xcconfig (Xcode configuration) file for easily turning on a boatload of warnings in your project or its targets.

Warnings This is an xcconfig file to make it easy for you to turn on a large suite of useful warnings in your Xcode project. These warnings catch bugs

Peter Hosey 438 Nov 8, 2022
iOS tool that helps with profiling iOS Memory usage.

FBMemoryProfiler An iOS library providing developer tools for browsing objects in memory over time, using FBAllocationTracker and FBRetainCycleDetecto

Facebook Archive 3.4k Dec 7, 2022
Find memory leaks in your iOS app at develop time.

中文介绍 | FAQ中文 MLeaksFinder MLeaksFinder helps you find memory leaks in your iOS apps at develop time. It can automatically find leaks in UIView and UIV

Tencent 5.3k Dec 22, 2022
Find memory issues & leaks in your iOS app without instruments

HeapInspector Find memory issues & leaks in your iOS app HeapInspector is a debug tool that monitors the memory heap with backtrace recording in your

Christian Menschel 1.8k Nov 24, 2022
iOS library to help detecting retain cycles in runtime.

FBRetainCycleDetector An iOS library that finds retain cycles using runtime analysis. About Retain cycles are one of the most common ways of creating

Facebook 4.1k Dec 26, 2022
Awesome bug reporting for iOS apps

Buglife is an awesome bug reporting SDK & web platform for iOS apps. Here's how it works: User takes a screenshot, or stops screen recording User anno

Buglife 498 Dec 17, 2022
In-app memory usage monitoring for iOS

What's Stats Stats displays load statuses such as the memory usage, the CPU load, and the number of subviews in-app, and in realtime. How to use Just

Shuichi Tsutsumi 170 Sep 18, 2022
Makes it easier to support older versions of iOS by fixing things and adding missing methods

PSTModernizer PSTModernizer carefully applies patches to UIKit and related Apple frameworks to fix known radars with the least impact. The current set

PSPDFKit Labs 217 Aug 9, 2022
Flexible bug report framework for iOS

Clue is a simple smart-bug report framework for iOS, which allows your users to record full bug/crash report and send it to you as a single .clue file

Ahmed Sulaiman 279 Nov 3, 2022
Skredvarsel app - an iOS, iPadOS, and macOS application that provides daily avalanche warnings from the Norwegian Avalanche Warning Service API

Skredvarsel (Avalanche warning) app is an iOS, iPadOS, and macOS application that provides daily avalanche warnings from the Norwegian Avalanche Warning Service API

Jonas Follesø 8 Dec 15, 2022
A library that enables dynamically rebinding symbols in Mach-O binaries running on iOS.

fishhook fishhook is a very simple library that enables dynamically rebinding symbols in Mach-O binaries running on iOS in the simulator and on device

Meta 4.9k Jan 8, 2023
Simple iOS app blackbox assessment tool. Powered by frida.re and vuejs.

Discontinued Project This project has been discontinued. Please use the new Grapefruit #74 frida@14 compatibility issues frida@14 introduces lots of b

Chaitin Tech 1.6k Dec 16, 2022
An iOS application enables you explore art works provided by DeviartArt.com with high quality UX.

Iris.iOS Iris is a model mobile application based on iOS. It provides basic functions allow users to explore on DeviantArt and check Daily Arts, Notif

Xueliang Chen 63 Dec 13, 2022
High-quality Interactive Audio/Video iOS SDK

腾讯云实时音视频 TRTC SDK 产品介绍 腾讯实时音视频(Tencent Real-Time Communication,TRTC),将腾讯多年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开发者快速搭建低成本、低延时、高

LiteAVSDK 8 Nov 3, 2022
High-quality source code, easy implementation

High-quality source code, easy implementation

T.M 0 Nov 8, 2021
High Quality Image ScrollView using cropped tiled images.

THTiledImageView Feature ?? THTiledImageView fully support UIScrollView. You can subclass it and use it. ?? Support Async Image Downloading & Caching.

null 28 Oct 28, 2022
High-quality Interactive Audio/Video Unity SDK

简体中文 | English TRTC Unity SDK Overview Leveraging Tencent's many years of experience in network and audio/video technologies, Tencent Real-Time Commun

LiteAVSDK 8 Dec 23, 2022
MarkdownView is a WKWebView based UI element, and internally use bootstrap, highlight.js, markdown-it.

MarkdownView is a WKWebView based UI element, and internally use bootstrap, highlight.js, markdown-it.

Keita Oouchi 1.8k Dec 21, 2022