0

Tried to submit my app to iTunes build using Visual Studio for Mac (version 7.3.2), iOS native (not Xamarin.Form). App got rejected with the following message:

Where can the user find the Call Kit features within your app. If you do not intend to use the Call Kit API in your app, please remove it and re-upload your app for review.

I know there is another post talking about a similar issue, but the solution doesn't help my case since I have configured the linker to "Link Framework SDKs Only". Yes, I rebuild the same app twice using this setting and got rejected with the same message.

Then I use otool to check my app package and realize there are a bunch of frameworks / APIs still remain in the app, here are the list:

/System/Library/Frameworks/Security.framework/Security (compatibility version 1.0.0, current version 58286.32.2)
/System/Library/Frameworks/AVFoundation.framework/AVFoundation (compatibility version 1.0.0, current version 2.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3698.33.6)
/System/Library/Frameworks/WebKit.framework/WebKit (compatibility version 1.0.0, current version 604.4.7)
/System/Library/Frameworks/HomeKit.framework/HomeKit (compatibility version 1.0.0, current version 475.2.40)
/System/Library/Frameworks/AVKit.framework/AVKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/PassKit.framework/PassKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/CoreBluetooth.framework/CoreBluetooth (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/CoreSpotlight.framework/CoreSpotlight (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/MediaPlayer.framework/MediaPlayer (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1450.14.0)
/System/Library/Frameworks/CoreVideo.framework/CoreVideo (compatibility version 1.2.0, current version 1.5.0)
/System/Library/Frameworks/MessageUI.framework/MessageUI (compatibility version 1.0.0, current version 3445.5.17)
/System/Library/Frameworks/SceneKit.framework/SceneKit (compatibility version 1.0.0, current version 432.3.0)
/System/Library/Frameworks/Metal.framework/Metal (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/GameKit.framework/GameKit (compatibility version 1.0.0, current version 559.3.0)
/System/Library/Frameworks/EventKit.framework/EventKit (compatibility version 1.0.0, current version 100.0.0)
/System/Library/Frameworks/SpriteKit.framework/SpriteKit (compatibility version 1.0.0, current version 2.0.0)
/System/Library/Frameworks/AddressBook.framework/AddressBook (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/AddressBookUI.framework/AddressBookUI (compatibility version 1.0.0, current version 33.0.0)
/System/Library/Frameworks/iAd.framework/iAd (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/CloudKit.framework/CloudKit (compatibility version 1.0.0, current version 735.0.0)
/System/Library/Frameworks/EventKitUI.framework/EventKitUI (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Contacts.framework/Contacts (compatibility version 0.0.0, current version 0.0.0)
/System/Library/Frameworks/ExternalAccessory.framework/ExternalAccessory (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/QuartzCore.framework/QuartzCore (compatibility version 1.2.0, current version 1.11.0)
/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 1129.2.1)
/System/Library/Frameworks/CoreLocation.framework/CoreLocation (compatibility version 1.0.0, current version 2237.0.22)
/System/Library/Frameworks/PhotosUI.framework/PhotosUI (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/PushKit.framework/PushKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/QuickLook.framework/QuickLook (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/ReplayKit.framework/ReplayKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/ContactsUI.framework/ContactsUI (compatibility version 1.0.0, current version 33.0.0)
/System/Library/Frameworks/SafariServices.framework/SafariServices (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/MapKit.framework/MapKit (compatibility version 1.0.0, current version 14.0.0)
/System/Library/Frameworks/CoreMedia.framework/CoreMedia (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/OpenGLES.framework/OpenGLES (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/MultipeerConnectivity.framework/MultipeerConnectivity (compatibility version 1.0.0, current version 150.0.0)
/System/Library/Frameworks/NetworkExtension.framework/NetworkExtension (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration (compatibility version 1.0.0, current version 963.30.1)
/System/Library/Frameworks/WatchConnectivity.framework/WatchConnectivity (compatibility version 1.0.0, current version 159.0.0)
/System/Library/Frameworks/MetalKit.framework/MetalKit (compatibility version 1.0.0, current version 98.3.0)
/System/Library/Frameworks/CoreData.framework/CoreData (compatibility version 1.0.0, current version 849.2.0)
/System/Library/Frameworks/GameplayKit.framework/GameplayKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/GLKit.framework/GLKit (compatibility version 1.0.0, current version 92.0.0)
/System/Library/Frameworks/StoreKit.framework/StoreKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/CallKit.framework/CallKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/IOSurface.framework/IOSurface (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/VideoSubscriberAccount.framework/VideoSubscriberAccount (compatibility version 1.0.0, current version 238.1.0)
/System/Library/Frameworks/Intents.framework/Intents (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Speech.framework/Speech (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/UserNotifications.framework/UserNotifications (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1450.14.0)
/System/Library/Frameworks/CFNetwork.framework/CFNetwork (compatibility version 1.0.0, current version 893.14.0)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 274.6.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.1)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony (compatibility version 1.0.0, current version 0.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

Anyone have any idea how I can resolve this? I tried "Link All", the result is similar, unused framework still shown when listed using the otool.

Thanks.

Edit #1
I have make sure the linker setting is passed to the back-end. Here are a part of the output file:

MtouchArch                     = ARMv7, ARM64
MtouchDebug                    = False
MtouchEnableBitcode            = False
MtouchEnableGenericValueTypeSharing = True
MtouchEnableSGenConc           = False
MtouchExtraArgs                = 
MtouchFastDev                  = False
MtouchFloat32                  = False
MtouchHttpClientHandler        = HttpClientHandler
MtouchLink                     = SdkOnly
MtouchLinkerDumpDependencies   = False
MtouchNoSymbolStrip            = False
MtouchProfiling                = False
MtouchProjectDirectory         = /Volumes/BOOTCAMP/Shared/Projects/Bugko/Source/Bugko/Bugko.XIOS
MtouchTargetsEnabled           = true
MtouchUseLlvm                  = true
MtouchUseThumb                 = False
MtouchVerbosity                = 4

Edit #2
I have run the same build with linker off and compare with linker set to SDK only. Then run the otool. They show exactly the same list.

FreakyAli
  • 13,349
  • 3
  • 23
  • 63
  • It appears the linker is not enable, are you sure you are configuring the linker setting in the "Release" configuration and not the "Debug" configuration? – SushiHangover Dec 20 '17 at 02:44
  • Yes I am. I'm have make Release, Ad-Hoc and AppStore configuration all enable linker. Here are the output when building "MtouchLink = SdkOnly" – Ooi Keng Siang Dec 20 '17 at 05:32
  • Try passing `-linksdk` directly to `mtouch` Also enable MSBuild diagnostic logging to see if the linker is actually being called. – SushiHangover Dec 20 '17 at 05:42
  • Got an error instead "Error MT0018: Unknown command line argument: '-linksdk' (MT0018)" – Ooi Keng Siang Dec 20 '17 at 05:54
  • I assume you mean "--linksdkonly" according to the manual in http://docs.go-mono.com/?link=man%3amtouch(1), but the result are the same :( – Ooi Keng Siang Dec 20 '17 at 06:16

2 Answers2

1

After painstakingly tearing up the whole project and put back together one package by one package. The problem is caused by ReactiveUI.Events nuget package (current version 7.4.0), including the package won't cause any problem, but once any extension API is called, linker will skip all iOS framework. For example

NewButton.Events().Clicked
     .Subscribe(_ => DoSomething());

Skip this nuget and replace all events extension api with observable event pattern will solve the issue. For example

Observable.FromEventPattern<EventHandler, EventArgs>(
    ev => NewButton.Clicked += ev,
    ev => NewButton.Clicked -= ev
    ).Subscribe(_ => DoSomething());

Bug report filed https://github.com/reactiveui/ReactiveUI/issues/1558

0

I can see from logs :

/System/Library/Frameworks/CallKit.framework/CallKit

you have added the CallKit in your frameworks section. Might be you are not using it may be any third party framework is using it internally in your project.

If this is not the case just remove the CallKit and re submit the app.

If you are using please refer the names below they required the privacy entry and description in info.plist for the app:

Calendar , Contact , Reminder , Photo , Bluetooth Sharing , Microphone , Camera , Location , Heath , HomeKit , Media Library , Motion , CallKit , Speech Recognition , SiriKit , TV Provider.

In your case NSVoIPUsageDescription should be introduced as Key and description against usage in your application.

Thanks

Prabhat Kasera
  • 1,129
  • 11
  • 28