Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

(eSIM Integration iOS) How to use restricted API "addPlan" to enable e-sim profile in iOS device

After searching everywhere I found there is a way to add eSIM in iPhone using the following API

func addPlan(with: CTCellularPlanProvisioningRequest, completionHandler: (CTCellularPlanProvisioningAddPlanResult) -> Void)

I don't know why but completion handler not returning the result of CTCellularPlanProvisioningAddPlanResult just printing the following error.

Domain=NSCocoaErrorDomain Code=4099 "The connection to service named
com.apple.commcenter.coretelephony.xpc was invalidated." UserInfo=
{NSDebugDescription=The connection to service named
com.apple.commcenter.coretelephony.xpc was invalidated.

I want to know how this API works, You can see my code below

let ctpr = CTCellularPlanProvisioningRequest()
ctpr.address = "SMDP+"
ctpr.confirmationCode = ""
ctpr.eid = ""
ctpr.iccid = ""

let ctcp =  CTCellularPlanProvisioning()
ctcp.addPlan(with: ctpr) { (result) in
    print(result)
}

I am using CoreTelephony framework

Any help would be appricated

After checking other apps I found that GigSky is doing the same, anyone knows how they are doing?

UPDATE:

As of now I found the entitlement request URL check below

https://developer.apple.com//contact/request/esim-access-entitlement

I requested but apple is not responding.

like image 659
Nick Avatar asked Dec 04 '18 03:12

Nick


1 Answers

With this process, you can integrate eSIM functionality into your iOS app.

Step 1

Request for eSIM entitlement using your developer account Request from here

Step 2

Apple will approve the entitlement after some time (For me it took months) You can check if Apple has approved the entitlement from your app profile setting App profile setting (Certificate manager)

Step 3

Download the App Dev and Distribution profile (By selecting eSIM entitlement as Step #2).

Step 4

Update your info.plist with below keys and value

<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.CommCenter.fine-grained</key>
<array>
    <string>spi</string>
    <string>sim-authentication</string>
    <string>identity</string>
</array>
<key>com.apple.wlan.authentication</key>
<true/>
<key>keychain-access-groups</key>
<array>
    <string>apple</string>
    <string>com.apple.identities</string>
    <string>com.apple.certificates</string>
</array>
<key>com.apple.private.system-keychain</key>
<true/>

Step 5 (Could be optional)

Update your {appname}.entitlements with below key and value

<key>com.apple.CommCenter.fine-grained</key>
<array>
    <string>public-cellular-plan</string>
</array> 

Step 6 Code to Add eSIM profile

 let ctpr = CTCellularPlanProvisioningRequest()
 let ctpr = CTCellularPlanProvisioningRequest()
 ctpr.address = "Your eSIM profile address"
 ctpr.matchingID = "Confirmation id"

 if #available(iOS 12.0, *) {
        let ctcp =  CTCellularPlanProvisioning()
        ctcp.addPlan(with: ctpr) { (result) in
            switch result {
            case .unknown:
                self.showGenericSingleButtonCustomAlert(description: "Sorry unknown error")
            case .fail:
                self.showGenericSingleButtonCustomAlert(description: "Oops! something went wrong")
            case .success:
                self.showGenericSingleButtonCustomAlert(description: "Yay! eSIM installed successfully")
            @unknown default:
                self.showGenericSingleButtonCustomAlert(description: "Oops! something went wrong")
            }
        }
    }
like image 127
Nick Avatar answered Sep 17 '22 01:09

Nick