Can we create a single app for iOS and tvOS? - ios

I got a new project to start, but I have confusion before start the project , Can we create a single app for both iOS and tvOS
My Project will be for iphone/ipad and TvOS and also working for both modes portrait and landscape.
I tried but getting links for starting new project with tvOS. I also getting something about adding new target for tvOS but not exactly very clearly I understand what I have to do?
Please help me to start this project?

Yes, you can create one project for iOS and tvOS application and share code between each other.
You need to create two targets, one for iOS and one for tvOS.
If you want to distinguish part of the code in one file you can use conditional compilation statements: #if os(iOS) or #if os(tvOS)

Related

Shared framework between iOS and tvOS

I am trying to build a crossplatform framework that can be embeded both in and iOS and a tvOS application.
This framework does NOT contain anything related to UI but is a wrapper around CoreBluetooth.
What I explored ?
It compiles when I set the base sdk to tvOS, and when I set the base sdk to iOS. But I do not know how to make it work for both
Do you know how I could have both at the same time ?
Thanks
Stan
You'll have to create two different targets in your xcodeproj, one for iOS, and one for tvOS.
Then simply add both target as Target Membership for your swift files.

Extending a react native iOS project to tvOS - linked libraries

I’m working on a React native project for iOS and tvOS. I’ve started with the version for iOS but I would like to extend the Xcode project/workspace to also build for tvOS. React (Native) code (logic) and state management will be fairly the same for both targets. There are just some UI adjustments but that’s not going to be a big deal.
The problem I’m having now is building the app. For iOS need to link libraries that are not available (nor do I need them) on for the tvOS target. For example the: Orientation. I’ve automatically linked this library to use for for iOS, but this is now causing the app not to build for tvOS, since orientation is not available on that platform. The library doesn’t show up in the list of linked libraries for the tvOS target, but for some reason while building the app Xcode tries to add it and then breaks the build.
Hopefully you guys can help me with this issue, I feel like I’m overlooking something.
I've made a screenshot of the error that I get while building:
You can add your conditional compilation like,
#if TARGET_OS_IOS
extern UIInterfaceOrientationMask ORIENTATION;
#endif
The above example is using Objective C code

Xcode enforcing App extension API only, but I'm not writing an extension or using extension features

I've been working on an app since iOS 7, and updated it from 7->8 without a problem, now I'm going to 9 and Xcode is telling me I'm using methods not allowed in an app extension but I'm not writing something constricted to an app extension api.
'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based solutions where appropriate instead.
I've had the app running on simulator and device for iOS 9. This just randomly happened the other day.
Ideas?
If you don't have any app extensions, just uncheck "Allow app extension API only" box under Deployment Info in the General tab of the project settings for your target.
It's odd that it got checked in the first place though. I wonder what happened.

How to extend iOS app to tvOS

I have an iOS app that I need to extend to tvOS.
All the information that I found are explaining how to start from scratch!
Is there any way to extend my app to tvOS or I should start a new project with it?
Update1:
My question is: How to extend my existing project to support tvOS without building it from scratch?
Update2:
Jess Bower point on Apple's website:
Empower customers to enjoy their favorite apps on both iOS and the new
Apple TV with a single purchase by enabling universal purchase for
your app on the App Store.
Which means that we need to create a new bundle on our existing project and enable "universal" purchase so it will count as one app on App Store.
The tvOS SDK is based off of iOS, but is not interchangeable. Unlike when the first iPad was released, the new Apple TV will not be capable of running iOS apps.
The AppStore for the TV will only include apps built specifically for tvOS.
For any iOS developers looking to create apps for Apple TV, I'd recommend checking out the new documentation page: https://developer.apple.com/library/content/documentation/General/Conceptual/AppleTV_PG/index.html#//apple_ref/doc/uid/TP40015241-CH12-SW1
Specifically, check out the Inherited iOS Frameworks section to give you a sense of what will work out of the box from your existing iOS projects.
In Xcode 7.1 (which introduces tvOS SDK) you can add a tvOS target as any other (File -> New -> Target... -> tvOS -> ...) and it supports both Objective-C and Swift, so yes - it's possible to share code between your iOS and tvOS app, you just need to check your source target membership and enable it on your tvOS target. To extend the purchases across iOS and tvOS app we should use Universal Purchases.
Took me a little while to find all the things needed to change but this list should cover it.
click iOS target and duplicate
change base sdk of new tvOS target to tvOS latest
make copy of info.plist and have tvOS point to that one
make all the tvOS icons and launch images
set TARGETED_DEVICE_FAMILY to 3 for the tvOS build settings
add any new tvOS specific versions of code e.g. without shouldAutorotate, prefersStatusBarHidden etc.
I also believe that adding a new target for tvOS is the way to go, especially if you have lots of objective-c or swift code to share between projects.
For those instances where there might be some tvOS-unsupported types in your shared code, I have used these preprocessor symbols to provide alternate code snippets for tvOS:
#if TARGET_OS_IOS
// iOS-specific code
#elif TARGET_OS_TV
// tvOS-specific code
#endif
Just to list out some limitations and challenges:
1. There is no persistent local storage for apps on Apple TV. Data must be stored on iCloud. 2. The maximum size of an Apple TV app is limited to 200MB. On-demand resources (app contents that are hosted on the App Store) should be used. Benefits are smaller app size and lazy loading of app resources. 3. The UI is drastically different. Human Interface Guidelines must be followed as per the doc. 4. Creating a Client-Server App using JavaScript and TVML framework. 5. Controlling the UI touch focus. UIFocusEnvironment controls focus-related behavior for a branch of the view hierarchy. UIViewController conforms to UIFocusEnvironment protocol. 6. Creating Parallax Artwork You have to create a LSR image with Xcode and then use terminal to create a LCR image. A UIImage object can display a LCR image correctly.
A new target has to be added for tvOS. There are two ways to do that
Add a new target through File > New > File...> tvOS Target.
Duplicate an existing iOS target and change TARGETED_DEVICE_FAMILY to 3 and "Supported Platforms" to tvOS in "Build Settings"
Pods need to be added to the tvOS target using pod install. There could be a different list of pods that you can/want to use in tvOS. Pods for different targets can be separated in Podfile using:
target 'iOS TARGET NAME' do
pod 'podname', :git => 'https://github.com/name.git'
end
target 'tvOS TARGET NAME' do
pod 'podname', :git => 'https://github.com/name.git'
end
Most Pods at the moment do not support tvOS. For those Pods, here are the steps to make them work in your project:
Clone the git repo on your local disk
If a version of the pod is being used in another target (iOS target), change the name, otherwise CocoaPods will complain: e.g. RestKit --> RestKitTV and use :path In Podfile to point to the location of the cloned repo:
pod 'RestKitTV', :path => 'Other/RestKitTV'
Update the podspec file in the cloned repo:
Modify the name to be compatible with the new name
Change the platform to tvOS or add tvOS to the list of supported platforms
Pod::Spec.new do |s|
..
s.platform = :tvos
..
end
OR
Pod::Spec.new do |s|
..
s.tvos.deployment_target = '9.0'
s.tvos.exclude_files = 'framework/Source/Mac', ....
s.tvos.frameworks = ['OpenGLES', 'CoreMedia', 'QuartzCore']
..
end
Add files to the target:
Add source code (.m files) to "Compile Sources" of "Build Phases" for the target
Add images to "Copy Bundle Resources"
Add frameworks to "Link Binary with Libraries". Note that not all frameworks are compatible with tvOS
Use TARGET_OS_TV and TARGET_OS_IOS macros to separate tvOS non-compatible code
#if !TARGET_OS_TV
*iOS only code*
#else
*tvOS only code*
#end
+Simon-Tillson answer is correct, however I had some backwards compatibility issues with iOS 8.1 and below SDK's where TARGET_OS_IOS was not defined (for older Xcode versions)
The following code fixes that and works the same for iOS 9.0/9.1 SDK + and previous 8.1 and less SDKS.
#if TARGET_OS_IOS || (TARGET_OS_IPHONE && !TARGET_OS_TV)
// iOS-specific code
#elif TARGET_OS_TV
// tvOS-specific code
#endif
In case of my project, I simply added a new target to the existing iOS project, and modified some code appropriately (using #if os(tvOS/iOS) in a few areas). I am now able to run the same app either on iOS devices or Apple TV.
The only framework missing in tvOS was WebKit (which was necessary to render rich text), and I needed to come up with an alternative mechanism.
I am going to open source this project soon (before the end of October), so that other people can take a look.
Don't forget to change the Base SDK into TVos 9.x in the build settings. It's necessary for the Tv simulator to show up

Xamarin iOS - Is it possible to have a "Unified- Single View" project target iOS 6.x?

I'd like to be able to use a single view project with iOS 6. The only options I have when creating the project are 8.0 to 8.4
Am I missing something or am I stuck with this?
If I'm stuck what is the simplest template I can use that will work with iOS 6 and not use the classic API?
I really just need a single view that has some text output to the screen to confirm connection to a 3rd party API.
Thanks!
Create a new Xamarin.iOS unified project from whatever template you feel like (i.e. Single View) and then open Info.plist and set the Deployment Target to 6.0.

Resources